Bert : 双向Transformer版的GPT

BERT模型的架构:预训练(双向Transformer) + Fine-Tuning

  1. BERT、ELMO、GPT之间的演进关系
  • 比如如果我们把GPT的单向语言模型换成双向语言模型,就得到了BERT
  • 而如果我们把ELMO的特征抽取器(LSTM)换成Transformer,我们也会得到BERT
  • BERT综合了ELMO的双向优势与GPT的Transformer特征提取优势
  1. BERT采用和GPT完全相同的两阶段模型
    首先是预训练(通过不同的预训练任务在未标记的数据上进行模型训练),其次是使用Fine-Tuning模式解决下游任务;预训练之后,针对下游每个不同的任务都会有一个任务模型,只是这些任务模型一开始全都初始化为预训练好的BERT模型,然后根据下游任务的特点针对性微调。
  2. 为了适配多任务下的迁移学习,BERT设计了更通用的输入层和输出层;
    BERT的输入部分是个线性序列,两个句子之间通过分隔符「SEP」分割,最前面是起始标识「CLS」,每个单词有三个embedding:
  • 单词embedding,这个就是我们之前一直提到的单词embedding,值得一提的是,有的单词会拆分成一组有限的公共子词单元,例如下图示例中‘playing’被拆分成了‘play’和‘ing’;
  • 句子embedding,用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等);
  • 位置信息embedding,句子有前后顺序,组成句子的单词也有前后顺序,否则不通顺杂乱无章就是零散单词而非语句了,所以单词顺序是很重要的特征,要对位置信息进行编码
    把单词对应的三个embedding叠加(没错,直接相加),就形成了BERT的输入
  1. BERT的两个创新点:Masked语言模型与Next Sentence Prediction(也是预训练阶段的两个任务)
    借鉴了Word2Vec的CBOW方法:根据需要预测单词的上文Context-Before和下文Context-after去预测单词
  • Masked Language Model(MLM)是指在训练的时候随机从输入预料上mask掉一些单词,然后通过的上下文预测该单词,该任务非常像训练一个中学生做完形填空的能力;直接将大量的词替换为MASK标签可能会造成一些问题,模型可能会认为只需要预测MASK相应的输出就行,其他位置的输出就无所谓。同时Fine-Tuning阶段的输入数据中并没有MASK标签,也有数据分布不同的问题。
    为了减轻这样训练带来的不利影响,BERT采用了如下的方式:输入数据中随机选择15%的词用于预测,这15%的词中:
    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
    这样一来就相当于告诉模型,我可能给你答案,也可能不给你答案,也可能给你错误的答案,有的地方我会检查你的答案,没的地方我也可能检查你的答案,所以标签对你来说没有什么特殊意义,所以无论如何,你都要好好预测所有位置的输出。
  • Next Sentence Prediction:其任务是判断句子B是否是句子A的下文,如果是的话输出’IsNext‘,否则输出’NotNext‘,这个关系保存在BERT输入表示图中的[CLS]符号中。
    之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务(句子级别的任务对于阅读理解,推理等任务提升较大)。所以可以看到,它的预训练是个多任务过程