BERT入门讲解(内附源码)自然语言处理NLP-100例
Posted K同学啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BERT入门讲解(内附源码)自然语言处理NLP-100例相关的知识,希望对你有一定的参考价值。
大家好!我是K同学啊
前段时间在自然语言处理的项目,遇到了一些问题也有一些收获,把其中与BERT相关的内容整理出来分享给大家,希望可以帮到你。
如果你对自然语言处理方面的文章有兴趣的话,或许📚《自然语言处理NLP-实例教程》有你想要的
如果你想找一些毕设相关的实战案例做参考,你可以在📚《深度学习100例》找到带源码和数据的实战案例,深度学习小白建议先从📚《小白入门深度学习》这个专栏学起哦!
本文已加入 🚀 Python AI 计划,从一个Python小白到一个AI大神,你所需要的所有知识都在我的 GitHub:https://github.com/kzbkzb/Python-AI 了。
我的环境:
- 语言环境:Python3
- 深度学习环境:TensorFlow2.4.1
- 编译器:Jupyter Lab
BERT入门讲解(内附源码)【自然语言处理NLP-100例】
BERT是什么?
BERT(Bidirectional Encoder Representation from Transformers)是 Google 在2018年提出的一种NLP 模型,成为最近几年 NLP 领域最具有突破性的一项技术。BERT模型主要采用的是最原始 Transformer 的 Encoder 结构。
-
论文:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
-
结构:采用了 Transformer 的 Encoder 结构,但是模型结构比 Transformer 要深。Transformer Encoder 包含 6 个 Encoder block,BERT-base 模型包含 12 个 Encoder block,BERT-large 包含 24 个 Encoder block。
-
训练:训练主要分为两个阶段:预训练阶段和 Fine-tuning 阶段。预训练阶段与 Word2Vec,ELMo 等类似,通过在大型数据集上进行训练得到预训练模型(预训练模型我们直接调用即可)。Fine-tuning 阶段主要是后续迁移到其他任务重需要进行的微调(这是我们要完成的部分),例如文本分类,词性标注,问答系统等,BERT 无需调整结构就可以在不同的任务上进行微调。
-
预训练任务1:BERT 的第一个预训练任务是 Masked LM,在句子中随机遮盖一部分单词,然后同时利用上下文的信息预测遮盖的单词,这样可以更好地根据全文理解单词的意思。Masked LM 是 BERT 的重点。
-
预训练任务2:BERT 的第二个预训练任务是 Next Sentence Prediction (NSP),下一句预测任务,这个任务主要是让模型能够更好地理解句子间的关系。
上图是 BERT 的结构图,左侧的图表示了预训练的过程,右边的图是对于具体任务的微调过程。
关于以上描述,在初学阶段了解有那么回事即可。花最少的时间学习最重要的东西,提高效率。
BERT 的输入
BERT 的输入可以包含一个句子对 (句子 A 和句子 B),也可以是单个句子。同时 BERT 增加了一些有特殊作用的标志位:
- [CLS] 标志放在第一个句子的首位,经过 BERT 得到的的表征向量 C 可以用于后续的分类任务。
- [SEP] 标志用于分开两个输入句子,例如输入句子 A 和 B,要在句子 A,B 后面增加 [SEP] 标志。
- [MASK] 标志用于遮盖句子中的一些单词,将单词用 [MASK] 遮盖之后,再利用 BERT 输出的 [MASK] 向量预测单词是什么。
通过实例来了解具体是怎么一回事吧(当我们输入文本后,会在内部发生什么变化)
假定给了两个句子 "my dog is cute"
和 "he likes palying"
作为输入样本
BERT 会转为 "[CLS] my dog is cute [SEP] he likes play ##ing [SEP]"
。BERT 里面用了 WordPiece 方法,会将单词拆成子词单元 (SubWord),有的词会被拆出词根,例如 "palying"
会变成 "paly"
与 "##ing"
。
BERT 得到要输入的句子后,要将句子的单词转成 Embedding,Embedding 用 E 表示。与 Transformer 不同,BERT 的输入 Embedding 由三个部分相加得到:Token Embedding,Segment Embedding,Position Embedding。
Token Embedding
:单词的 Embedding,例如 [CLS] dog 等,通过训练学习得到。Segment Embedding
:用于区分每一个单词属于句子 A 还是句子 B,如果只输入一个句子就只使用 EA,通过训练学习得到。Position Embedding
:编码单词出现的位置,与 Transformer 使用固定的公式计算不同,BERT 的 Position Embedding 也是通过学习得到的,在 BERT 中,假设句子最长为 512。
对应的代码如下:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
test_sentence = 'my dog is cute'
max_length = 20
bert_input = tokenizer.encode_plus(test_sentence,
add_special_tokens = True, # add [CLS], [SEP]
max_length = max_length, # max length of the text that can go to BERT
pad_to_max_length = True, # add [PAD] tokens
return_attention_mask = True, # add attention mask to not focus on pad tokens
truncation=True)
bert_input
'input_ids': [101, 8422, 13030, 8310, 12322, 8154, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
input_ids
:是一连串 token 在字典中的对应id,形状为(batch_size, sequence_length);token_type_ids
:是token对应句子的id,形状为(batch_size, sequence_length);attention_mask
:各元素的值为0或1,避免在padding的token上计算attention,形状为(batch_size, sequence_length)。
BERT 预训练
BERT 输入句子中单词的 Embedding 之后,通过预训练方式训练模型,预训练有两个任务。
第一个是 Masked LM,在句子中随机用 [MASK] 替换一部分单词,然后将句子传入 BERT 中编码每一个单词的信息,最终用 [MASK] 的编码信息 T[MASK] 预测该位置的正确单词。
第二个是下一句预测,将句子 A 和 B 输入 BERT,预测 B 是否 A 的下一句,使用 [CLS] 的编码信息 C 进行预测。
BERT 预训练的过程可以用下图来表示。
BERT 用于具体 NLP 任务
预训练得到的 BERT 模型可以在后续用于具体 NLP 任务的时候进行微调 (Fine-tuning 阶段),BERT 模型可以适用于多种不同的 NLP 任务,如下图所示。
-
一对句子的分类任务:例如自然语言推断 (MNLI),句子语义等价判断 (QQP) 等,如上图 (a) 所示,需要将两个句子传入 BERT,然后使用 [CLS] 的输出值 C 进行句子对分类。
-
单个句子分类任务:例如句子情感分析 (SST-2),判断句子语法是否可以接受 (CoLA) 等,如上图 (b) 所示,只需要输入一个句子,无需使用 [SEP] 标志,然后也是用 [CLS] 的输出值 C 进行分类。
-
问答任务:如 SQuAD v1.1 数据集,样本是语句对 (Question, Paragraph),Question 表示问题,Paragraph 是一段来自 Wikipedia 的文本,Paragraph 包含了问题的答案。而训练的目标是在 Paragraph 找出答案的起始位置 (Start,End)。如上图 © 所示,将 Question 和 Paragraph 传入 BERT,然后 BERT 根据 Paragraph 所有单词的输出预测 Start 和 End 的位置。
-
单个句子标注任务:例如命名实体识别 (NER),输入单个句子,然后根据 BERT 对于每个单词的输出 T 预测这个单词的类别,是属于 Person,Organization,Location,Miscellaneous 还是 Other (非命名实体)。
下一篇文章将讲解BERT在文本分类中的应用
参考文章
- https://arxiv.org/pdf/1810.04805.pdf
- https://www.jianshu.com/p/46cb208d45c3
- https://huggingface.co/docs/transformers/v4.15.0/en/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.encode_plus
- https://medium.com/atheros/text-classification-with-transformers-in-tensorflow-2-bert-2f4f16eff5ad
最后再送大家一本,帮助大家拿到 BAT 等一线大厂 offer 的数据结构刷题笔记,是谷歌和阿里的大佬写的,对于算法薄弱或者需要提高的同学都十分受用(提取码:9go2 ):
以及我整理的7K+本开源电子书,总有一本可以帮到你 💖(提取码:4eg0)
以上是关于BERT入门讲解(内附源码)自然语言处理NLP-100例的主要内容,如果未能解决你的问题,请参考以下文章
基于BERT模型的文本分类研究 TensorFlow2实现(内附源码)自然语言处理NLP-100例
使用NeMo快速入门NLP实现机器翻译任务,英伟达专家实战讲解,内附代码
基于LSTM电商评论情感分析-多评价指标可视化版(内附源码)自然语言处理NLP-100例