什么是NLP中的迁移学习
使用预训练好的模型来抽取词、句子的特征:Word2Vec或者预训练好的语言模型。
使用预训练好的语言模型,一般不会再对语言模型进行微调,即不进行更新。
Word2Vec一般用于替代embedding层
但是Word2Vec往往忽略了时序信息,语言模型也往往只看了一个方向,不善于处理长序列。
BERT的动机
希望像CNN一样,可以有一个基于微调的NLP模型。预训练的模型以及抽取了足够多的信息,遇到新的任务只需要增加一个简单的输出层。
BERT架构
BERT是一个只有编码器的Transformer。
BERT原始提供两个版本:
Base:Block = 12, hidden_size = 768, head = 12, parameters = 110M
Large:Block = 24, hidden_size = 1024, head = 24, parameters = 340M
BERT在大规模数据上进行训练,有大于3B词。
对输入的修改
BERT训练时,每个训练样本是一个句子对:(source, target),为了区分输入句子和输出句子,输入句子使用0表示段嵌入,输出句子使用1表示段嵌入。
同时,为了标识句子的开始和结束,以及区分一对句子,BERT引入了几个特殊字符:
- [CLS]:位于每条输入序列的开头,用于分类任务。
- [SEP]:用来分隔一对句子,或者标志单个句子的结束。
- [MASK]:用于替换那些在MLM任务中被随机选中遮盖的词汇。
BERT的位置编码为可学习参数。
具体修改可参考下图:
(图源:https://zh.d2l.ai/chapter_natural-language-processing-pretraining/bert.html)
预训练任务1:带掩码的语言模型
为了使BERT更加通用,BERT的预训练包括以下两个任务:掩蔽语言模型和下一句预测。
Transformer的编码器使双向的,而标准的语言模型是单向的。
为此,BERT会随机按照一定概率(15%)将句子中的词元换成掩码<mask>,要求模型预测掩码(类似完形填空)。因此,BERT在此任务中是可以观察双向信息的。
因为微调任务中不出现<mask>掩码,因此BERT在训练更换掩码时,80%将选中的词元变为掩码<mask>,10%的概率换成随机词元,10%的概率保持原有词元不更换。
预训练任务2:下一句子预测
该任务用于预测两个句子在原始文本中是否相邻。
训练样本中:50%概率选择相邻句子对。50%概率随机拼接两个句子作为句子对。
由于Transformer编码器中的自注意力,特殊词元"<cls>"的BERT表示已经对输入的两个句子进行了编码。因此该任务将<cls>对应的输出作为全连接层的输入,全连接层的输出结果代表该任务的预测结果。
微调BERT
BERT对每一个词元(包括<cls>和<sep>)返回抽取了上下文信息的特征向量。因为BERT的特征是基于TransformerBlock即Attention的,因此单个词元的特征向量页包含了上下文的所有信息。
不同的任务可以使用不同的特征
句子分类
可以将<cls>对应的向量输入到全连接层进行分类
单句分类:情感分类、测试语言可接受性
句子对:语义文本相似度(计算句子1、2的相似性得分)
文本标注
为每个词分配一个标签,如对每个词做词性标注。
命名实体识别
识别一个词元是不是命名实体,如人名、机构、位置
将每一个非特殊词元的特征放入全连接层(二分类问题?)
问题回答
给定一个问题和描述文字,找出一个片段作为回答。
输入为句子对,句子1为问题,句子2为描述文字。分类器对描述文字中的每一个词元预测是否是答案的开始或结束,或不是开始或结束(三分类问题)。
微调总结
即使下游任务有所不同,使用BERT未调试只需增加输出层即可。
不同任务,输入的表示和BERT的特征也会不同。