BERT、RoBerta、XLNet、ALBERT对比
Swift

记录一下BERT变体的比较。

BERT

BERT堆叠了多层Transformer的Encoder模块,设计了两个任务来完成预训练:

  • Masked LM:随机mask掉15%的token,其中80%替换为[MASK],10%替换为其它token,10%保留原单词。
  • Next Sentence Prediction(NSP):从训练集中抽取A和B句,50%为A的下一句,50%为其它句子。

RoBerta

静态Mask VS 动态Mask

  • 静态Mask:BERT对每一个序列随机选择15%的tokens替换成[MASK],而一旦被选中,之后的N个epoch就不能再改变。
  • 动态Mask:RoBERTa一开始把预训练的数据复制10份,每一份都随机选择15%的Tokens进行Mask,也就是说,同样的一句话有10种不同的mask方式。然后每份数据都训练N/10个epoch。

NSP VS w/o NSP

RoBerta去除了NSP任务,每次输入连续的多个句子,直到最大长度512(可以跨文章)。这种训练方式叫做(FULL - SENTENCES),而原来的Bert每次只输入两个句子。

hyper-parameter

  • 更大的batch_size
  • 更多的数据
  • 更高的学习率
  • 更长时间的训练

XLNet

AR LM:利用上下文单词预测下一个单词的一种模型。但是在这里,上下文单词被限制在两个方向,要么向前,要么向后。

AE LM:从损坏的输入中重建原始数据的一种模型。它可以同时在向前向后两个方向看到上下文。

BERT存在的问题:

  • 掩码导致的微调差异:预训练阶段因为采取引入[Mask]标记来Mask掉部分单词的训练模式,而Fine-tuning阶段是看不到这种被强行加入的Mask标记的,所以两个阶段存在使用模式不一致的情形,这可能会带来一定的性能损失。
  • 预测的标记彼此独立:Bert在第一个预训练阶段,假设句子中多个单词被Mask掉,这些被Mask掉的单词之间没有任何关系,是条件独立的,而有时候这些单词之间是有关系的,XLNet则考虑了这种关系。

XLNet在输入侧维持表面的X句子单词顺序,在Transformer内部,看到的已经是被重新排列组合后的顺序,是通过Attention Mask来实现的。从X的输入单词里面,也就是Ti的上文和下文单词中,随机选择i-1个,放到Ti的上文位置中,把其它单词的输入通过Attention Mask隐藏掉,于是就能够达成我们期望的目标。

双流自注意力机制

  • content stream self-attention $h_{\theta}\left(\mathbf{x}_{\mathbf{z}_{\leq t}}\right)$:标准的Transformer计算,能同时接触到单词x的特征信息和位置信息。
  • query stream self-attention $g_{\theta}\left(\mathbf{x}_{\mathbf{z}_{<t}}, z_{t}\right)$:只能接触到单词x的位置信息。

计算过程如下:

其它改进措施:

  • 引入Transformer-XL:相对位置编码以及分段RNN机制。解决Transformer对长文档应用不友好的问题。
  • 使用更多更高质量的数据。

ALBert

词嵌入向量参数的因式分解(Factorized embedding parameterization)

在BERT、XLNet中,词表的embedding size(E)和transformer层的hidden size(H)是等同的,所以E=H。但实际上词库的大小一般都很大,这就导致模型参数个数就会变得很大。为了解决这些问题他们提出了一个基于factorization的方法。

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

每一层的Transformer可以共享参数,这样一来参数的个数不会以层数的增加而增加。

段落连续性任务(Inter-sentence coherence loss)

后续的研究表示NSP过于简单,性能不可靠。使用段落连续性任务。正例,使用从一个文档中连续的两个文本段落;负例,使用从一个文档中连续的两个文本段落,但位置调换了。


参考