预训练语言模型

0. 引言

Todo

1. word2vec

Todo

2. glove

Todo

3. elmo

Todo

4. gpt

Todo

5. gpt2

Todo

6. bert

Todo

7. roberta

7.1 静态Masking vs 动态Masking

  • 静态Masking:Bert对每一个序列随机选择15%的Tokens替换成[MASK],为了消除与下游任务的不匹配,还对这15%的Tokens进行(1)80%的时间替换成[MASK];(2)10%的时间不变;(3)10%的时间替换成其他词。但整个训练过程,这15%的Tokens一旦被选择就不再改变,也就是说从一开始随机选择了这15%的Tokens,之后的N个epoch里都不再改变了。
  • 动态Masking:RoBERTa一开始把预训练的数据复制10份,每一份都随机选择15%的Tokens进行Masking,也就是说,同样的一句话有10种不同的mask方式。然后每份数据都训练N/10个epoch。这就相当于在这N个epoch的训练中,每个序列的被mask的tokens是会变化的。

7.2 with NSP vs without NSP

原本的Bert为了捕捉句子之间的关系,使用了NSP任务进行预训练,就是输入一对句子A和B,判断这两个句子是否是连续的。在训练的数据中,50%的B是A的下一个句子,50%的B是随机抽取的。而RoBERTa去除了NSP,而是每次输入连续的多个句子,直到最大长度512(可以跨文章)。

7.3 更大的mini-batch

原本的BERTbase 的batch size是256,训练1M个steps。RoBERTa的batch size为8k。

7.4 更多的数据,更长时间的训练

RoBERTa用了更多的数据。性能确实再次彪升。当然,也需要配合更长时间的训练。

8. Albert

8.1 对Embedding因式分解

ALBERT采用了一种因式分解的方法来降低参数量。首先把one-hot向量映射到一个低维度的空间,大小为E,然后再映射到一个高维度的空间,说白了就是先经过一个维度很低的 embedding matrix,然后再经过一个高维度matrix把维度变到隐藏层的空间内,从而把参数量从$O(V×H)O(V×H)O(V×H)$降低到了$O(V×E+E×H)O(V×E+E×H)O(V×E+E×H) $,当 $E<<H$时参数量减少的很明显。

8.2 跨层的参数共享(Cross-layer parameter sharing)

全连接层与attention层都进行参数共享,也就是说共享encoder内的所有参数,同样量级下的Transformer采用该方案后实际上效果是有下降的,但是参数量减少了很多,训练速度也提升了很多。

8.3 句间连贯(Inter-sentence coherence loss)

在ALBERT中,为了只保留一致性任务去除主题识别的影响,提出了一个新的任务 sentence-order prediction(SOP),SOP的正样本和NSP的获取方式是一样的,负样本把正样本的顺序反转即可。SOP因为实在同一个文档中选的,其只关注句子的顺序并没有主题方面的影响。并且SOP能解决NSP的任务,但是NSP并不能解决SOP的任务,该任务的添加给最终的结果提升了一个点。

8.4 移除dropout

ALBERT在训练了100w步之后,模型依旧没有过拟合,于是乎作者果断移除了dropout,没想到对下游任务的效果竟然有一定的提升。这也是业界第一次发现dropout对大规模的预训练模型会造成负面影响。

9. DistillBert

Todo

10. xlnet

  • 自回归 vs 自编码,通过全排列及mask实现

  • Bert输入存在mask噪声,输出条件独立,缺乏生成能力

  • 双流Attention,自己预测自己,自己又不能看见自己

参考

Donate comment here