内容纲要

文章目录

  1. 嵌入参数进行因式分解
  2. 跨层参数共享
  3. 句子顺序预测
  4. 实验建立
  5. 实验结果

欢迎转载,作者:Ling,注明出处:深度学习:前沿技术-ALBert

简介

ALBert (A lite BERT)ALBert (A lite BERT) 是一种通过减少BERT训练参数,从而使得在相同训练时间下,可以在不同NLP任务中取得更好的效果。它又屠版了几乎所有NLP任务。

主要问题

参数过多的大模型带来的问题:

  • GPU/TPU内存不足:当下的各种SOTA模型动辄数亿甚至数十亿个参数,倘若要扩大模型规模,这个内存问题是无法回避的。
  • 训练时间会更长:由于通信开销与模型中参数的数量成正比,在分布式训练中训练速度将成为一大瓶颈。
  • 模型退化:简单地增加隐含层单元数,只会适得其反,从而降低性能。

file

上图实验表明,如果增加模型参数,可能不仅不会提高性能,反而降低性能。

file

上图实验左图为训练loss和steps关系,右图为Dev Mask Language Model准确率和训练steps关系。模型增大后,没有过拟合现象,MLM准确率反而降低了,主要原因可能是,步数不够更难收敛了。

主要方法

ALBert主要通过如下方法改进BERT,以使得在更少参数下,效果不会显著降低,而参数减少可以使得在相同时间内,训练更多steps数。

  • 嵌入参数进行因式分解(factorized embedding parameterization):现有方法通过将one-hot embedding转成word embedding, 然后通过Transformer转成Context based word embedding,其中word embedding和Context Word Embedding(论文中称其为隐含层)是一样的维度,而该方法,通过区分word embedding和context embedding,减小word embedding维度,从而减少参数数目,同时增加Context Word Embedding维度,从而保证性能。整体上可以达到减少总的参数目的。
  • 跨层参数共享(Cross-Layer Parameter Sharing):即所有Transformer层采用同一套参数。从而减少总体模型参数数目。
  • 句子顺序预测 (Sentence Order Predicion, SOP):RoBerta等论文证明了下一句句子预测NSP对性能提高作用不够,所以本文提出了通过预测句子之间顺序,从而提高整体模型性能。

嵌入参数进行因式分解

BERT将one-hot embedding 转成 context-based embedding过程如下:

  • 每个词都用one-hot向量表示,假设词表大小为V,则one-hot向量是V维。
  • 然后通过语言模型训练BERT,可以首先将One-hot向量转成一个固定向量word embedding,每个单词对应的word embedding是不变的,假设word embedding向量是E维。它也是BERT的输入。
  • 最后BERT通过Transformer会将word embedding转成context-based embedding,论文中称为隐含层,假设Transformer有L层,转换后的Context-based embedding维度为H维。

其中E和H往往一样,如下图所示,H是Hidden,E是Embedding:

file

通过上面过程我们可以看出,假设不考虑层数,参数总数为O(V \times E + E \times H),如果V远大于E,则参数总数近似为O(V \times E)

如果我们区分H和E,将E减小,保持H不变,或者增大H,则可以大幅度减少参数。实际参数为:O(V \times E + E \times H)

例如:

以ALBert_xxlarge为例,V=30000, H=4096, E=128
那么原先参数为V * H= 30000 * 4096 = 1.23亿个参数,现在则为V * E + E * H = 30000*128+128*4096 = 384万 + 52万 = 436万,
词嵌入相关的参数变化前是变换后的28倍。

背后的逻辑

这样做有点类似于SVD分解,E是word embedding类似于SVD中的主题,它和上下文无关,可以用更小的向量表示。而H是context-based embedding,它是和上下文相关,所以要用更高维度的向量表示。

跨层参数共享

其实这也不是什么新概念,目前有很多方式来共享参数([Dehghani et al. (2018)]的(Universal Transformer, UT)和Bai et al. (2019)和Deep Equilibrium Models(DQE)。),例如只贡献前馈网络不同层之间的参数,或者只贡献注意力机制的参数,而 ALBERT 采用的是贡献所有层的所有参数。

file

上图展示了BERT-Large 与 ALBERT-Large每一层输入嵌入与输出嵌入间的 L2 距离与余弦相似性。从上图可以发现 ALBERT 从一层到另一层的转换要比 BERT 平滑得多。这说明权重共享有效地提升了神经网络参数的鲁棒性。尽管相比于 BERT,ALBERT在两个评价指标都有所下降,但在 24 层以后,它们也不会收敛到 0。下降的部分可以通过增加训练步数提高。

file

从上图可以看出,通过设置E为128,H为4096,可以提高Context-based Embedding维度,同时显著减低参数数目。

句子顺序预测

下一句预测损失(NSP)损失本是为了提升下游任务的性能,但是后来很多研究 (Yang et al., 2019; Liu et al.,2019)发现这种机制并不是很高效,因此决定去除它。

我们猜测,NSP低效的原因,主要是它的难度太小。因为下一句预测将主题预测和连贯性预测结合到单个任务中,然而主题预测比连贯性预测简单得多,同时NSP与MLM损失函数学到的内容是有重合的。

本文提出一种基于语言连贯性的损失函数。在ALBERT中本文使用了一个句子次序预测(SOP)损失函数,它会避免预测主题,而只关注建模句子之间的连贯性。SOP正样本获取方法与BERT相同,而负样本仅仅是将正样本的两个segments次序对换。实验结果表明SOP能够在合理范围内解决NSP任务。在使用了该损失函数后,ALBERT能显著提升下游多句子编码任务的性能。

实验

实验建立

  • 模型参数:本文用到的BERT和ALBERT对应的超参数如下图所示。可以看出,ALBERT的模型参数量远远小于对应的BERT模型。例如,ALBERT-large的参数量仅为BERT-large的1/18,即18M vs 334M。对于ALBERT-xxlarge,由于24层网络结构与12层网络结构在结果上接近,但是计算量更大,所以ALBert主要采用12层的网络结构。

file

  • 训练数据: BOOKCORPUS 和 English Wikipedia 共计 16GB 的纯文本作为预训练任务的数据。
  • 词典大小: 和BERT一样30K
  • SentencePiece:借鉴了XLNet中使用的SentencePiece。
  • N-Gram Masking: 在MLM目标函数上使用n−gramn-gramn−gram的masking,随机选用n−gramn-gramn−gram的mask遮蔽输入。设置的n-gram最大长度为3,即MLM目标最多由3个全词组成。预测生成的n-gram的概率:

file

实验结果

BERT VS ALBERT

file

从上图可以看出,ALBERT-xxlarge 的参数量只有 BERT-Large 70% ,但性能却能够显著超越BERT-large。具体表现在SQuAD v1.1上提升1.7%,在SQuAD v2.0上提升4.2%,MNLI上提升2.2%,在SST-2上提升3.0%,在RACE上提升8.5%。此外,还观察到BERT-xlarge在全部的指标上全面溃败于BERT-base。这说明形如BERT-xlarge的大参数模型相较于更小参数量的模型是更难训练的。另一个有趣的发现是,相同训练配置下(相同TPUs数量)训练一次,数据的吞吐速度差异。由于ALBERT模型通信更少,计算量更低,所以相比于BERT有更高的数据吞吐量。这里选用最慢的BERT-xlarge作为速度参照基准。

嵌入向量的因式分解

file

上图展示了在ALBERT-base上修改词嵌入大小 E 带来的影响,它们的参数量及在下游任务的效果。

结论

  • 对于non-shared下(BERT-style),更大的嵌入尺寸能够取得更好的结果,但是提升的幅度其实不大。
  • 对于all-shared(ALBERT-style),嵌入大小128是最好的。基于上述这些结果,本文在后续的实验中的嵌入大小统一选用E=128

跨层参数共享

file

上图展示了不同跨层参数共享的效果,同样使用 ALBERT-base 作为示例模型,此外还增加了嵌入大小为768的结果。对比了所有all-shared策略(ALBERT-style)、not-shared 策略(BERT-style)及其介于二者之间的中间策略(仅注意力参数共享,FNN不共享;仅FNN参数共享,注意力参数不共享)。
结论

all-shared型策略在E=768和E=128上都会一定程度上降低性能。但是,需要说明的是,下降幅度较小,对于E=128,平均下降1.5;对于E=768,平均下降2.5。再细看,共享FFN层的参数,应该是罪魁祸首;而注意力机制的参数共享带来的影响不能一概而论,对于E=128反而在平均性能上提升了0.1,对于E=768平均性能下降0.7。

句子顺序预测

file

上图展示了SOP与下一句预测损失(NSP)的对比效果。本文这里对比了3种策略:没有句子间损失(比如XLNet和RoBERTa)、NSP(比如BERT)、SOP(ALBERT)。

这里采用的ALBERT也是ALBERT-base。对比过程,一方面对比自身任务中的准确率,另一方面是下游任务的性能表现。

结论

  • 在自身任务这一维度,可以看出NSP损失对于SOP几乎是没有任何益处,NSP训练后,在SOP上的表现只有52%,这跟瞎猜差不了多少。据此,可以得出结论:NSP建模止步于主题识别。反观SOP损失,确实一定程度上能够解决NSP任务,其准确率为78.9%,而自身的准确率为86.5%。
  • 在下游任务上SOP损失统统起到促进作用,具体表现在SQuAD1.1提升1%,SQuAD 2.0提升2%,RACE提升1.7%。

相同训练时长下的对比

file

由于ALBert参数更少,所以往往可以训练更多步数。

结论

在训练了差不多相同的时间之后,ALBERT-xxlarge 明显优于 BERT-large。

引入额外训练集和Dropout的影响

file

上述实验都是在 Wikipedia 和 BOOKCORPUS 数据集上进行的,那么,如果增加额外的数据会对结果产生怎样的影响?上图采用的额外数据与XLNet和RoBERTa中的相同。

结论

  • 添加额外数据后,模型的开发集 MLM 准确率显著提升。
  • 即使在训练了 100 万步之后,最大的模型仍然没有过拟合。因此,尝试删除dropout,以进一步提高模型能力。

另外

添加额外数据后,在各个下游任务中的性能如下。

file

去掉dropout后在下游任务上的表现如下:

file

当下SOTA模型在NLU任务上的对比

ALBERT 在 GLUE、SQuAD 和 RACE 基准测试中都取得了 SOTA 结果如下图所示:

file