NLP迁移学习
- 使用预训练好的模型来抽取词、句子的特征(word2vec/语言模型)
- 不更新预训练好的模型
- 构建新的网络抓取新任务需要的信息
(预训练抽取底层特征作为embedding,word2vec忽略时序信息,语言模型也只看了一个方向)
BERT的动机
- 基于微调的NLP模型,参考CV
- 预训练模型抽取足够多的信息
- 新的任务只需增加一个简单的输出层 output layer
BERT架构
- 只有编码器的Transformer
- Base:#blocks=12, hidden size=768, #heads=12, #parameters=110M
- Large: #blocks=24, hidden size=1024, #heads=16, #parameters=340M
- 在大规模数据上训练(wiki pedia+一些书),用了>3B词
BERT相对于Transformer的创新
对输入的修改
- Input:每个样本是一个句子对;<cls> classification作为句子对开头,<sep> seperate两个句子中间和结尾
- Token Embeddings:词嵌入
- Segment Embeddings:e_A和e_B来区分两个句子,e_A是0,e_B是1
- Position Embeddings:是可学习的
预训练任务1:带掩码的语言模型
做一个通用的任务,使得在这个任务上学习到的信息可应用到其他任务。NLP中最通用的任务是语言模型,即根据一个词预测下一个词,但对于BERT,Transformer的encoder是双向的,标准LM(语言模型)要求单向;
改进:带掩码的LM每次随机(15%概率)将一些词元换成<mask>【完形填空】
在微调任务中没有<mask>,为了使得对<mask>不那么敏感,如下操作:
- 80%概率将选中词元变成<mask>
- 10%换成随机词元
- 10%保持原有词元
预训练任务2:下一句子预测
预测一个句子对中两个句子是不是相邻
训练样本中:
- 正样本:50%概率选择相邻句子对 <cls> this movie is great <sep> like it <sep>
- 负样本:50%概率选择随机句子对 <cls> this movie is great <sep> hello world<sep>
将<cls>对应的输出放到一个全连接来预测,预测是否相邻
总结
BERT针对微调设计,在大文本上训练模型,把输出层改一改
基于Transformer的Encoder做了如下修改:
- 模型更大,训练数据更多,1B词
- 输入句子对,片段嵌入(segment embedding),可学习的位置编码
- 训练时使用两个任务:带掩码的语言模型,预测句子是否相邻