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,自己预测自己,自己又不能看见自己