文章参考:
https://zhuanlan.zhihu.com/p/48612853
Bert是什么?
Bert的本质是通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示,所谓自监督学习是指在没有人工标注的数据上运行的监督学习。它是比Word2Vec更强的预训练语言模型。在以后特定的NLP任务中,我们可以直接使用BERT的特征表示作为该任务的词嵌入特征。所以BERT提供的是一个供其它任务迁移学习的模型,该模型可以根据任务微调或者固定之后作为特征提取器。
Bert的网络结构
与Transformer端的encoder相比,Bert的transformer encoder端的输入向量多了Segment Embedding。
Bert的输入
BERT的输入的编码向量(长度是512)是3个嵌入特征的单位和,这三个词嵌入特征是:
- WordPiece Embedding:WordPiece是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。例如‘playing’被拆分成了‘play’和‘ing’;
- 位置嵌入(Position Embedding):位置嵌入是指将单词的位置信息编码成特征向量,位置嵌入是向模型中引入单词位置关系的至关重要的一环。
- 分割嵌入(Segment Embedding):用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)。对于句子对,第一个句子的特征值是0,第二个句子的特征值是1。
最后,说明一下两个特殊符号[CLS]
和[SEP]
,其中[CLS]
表示该特征用于分类模型,对非分类模型,该符合可以省去。[SEP]
表示分句符号,用于断开输入语料中的两个句子。
Bert的训练过程
Bert是由Masked LM 和 Next Sentence Prediction这两个自监督任务组成。
Masked LM
MLM是指在训练的时候随机从输入语料上mask掉一些单词,然后通过的上下文预测该单词,该任务非常像我们在中学时期经常做的完形填空。具体来说,在一句话中随机选择 15% 的词汇用于预测。对于在原句中被抹去的词汇, 80% 情况下采用一个特殊符号 [MASK] 替换, 10% 情况下采用一个任意词替换,剩余 10% 情况下保持原词汇不变。
- 80%:
my dog is hairy -> my dog is [mask]
- 10%:
my dog is hairy -> my dog is apple
- 10%:
my dog is hairy -> my dog is hairy
这么做的主要原因是:在后续微调任务中语句中并不会出现 [MASK] 标记,而且这么做的另一个好处是:预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇( 10% 概率),这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。上述提到了这样做的一个缺点,其实这样做还有另外一个缺点,就是每批次数据中只有 15% 的标记被预测,这意味着模型可能需要更多的预训练步骤来收敛。
Next Sentence Prediction
Next Sentence Prediction(NSP)的任务是判断句子B是否是句子A的下文。如果是的话输出’IsNext‘,否则输出’NotNext‘。训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从语料中提取的,它们的关系是NotNext的。这个关系保存在图4中的[CLS]
符号中。BERT 模型通过对 Masked LM 任务和 Next Sentence Prediction 任务进行联合训练,使模型输出的每个字 / 词的向量表示都能尽可能全面、准确地刻画输入文本(单句或语句对)的整体信息,为后续的微调任务提供更好的模型参数初始值。
Bert的Pytorch实现
代码来源:GitHub - wmathor/nlp-tutorial: Natural Language Processing Tutorial for Deep Learning Researchers
代码colab链接:https://colab.research.google.com/drive/1WIyqSdUYz6dypdzovGm-yh2kFOGFm_a_#scrollTo=S5KkoyycWs6D