NLP预训练模型5 -- 模型结构优化(XLNet、ALBERT、ELECTRA)

系列文章,请多关注
NLP预训练模型1 – 综述
NLP预训练模型2 – BERT详解和源码分析
NLP预训练模型3 – 预训练任务优化(ERNIE、SpanBERT)
NLP预训练模型4 – 训练方法优化(RoBERTa、T5
NLP预训练模型5 – 模型结构优化(XLNet、ALBERT、ELECTRA)
NLP预训练模型6 – 模型轻量化(ALBERT、Q8BERT、DistillBERT、TinyBERT等)

1 背景

上文我们从预训练任务优化(NLP预训练模型3 – 预训练任务优化(ERNIE、SpanBERT))和训练方法优化(NLP预训练模型4 – 训练方法优化(RoBERTa、T5))两个角度,分析了如何提升BERT和NLP预训练模型的performance。本文我们从模型结构优化的角度来进行深入分析。

模型结构优化一直以来都是比较fancy的工作,优秀的模型结构设计,可以大大提高模型参数的效率,甚至小模型效果可以超过大模型。本文我们以XLNet、ALBERT、ELECTRA为例进行分析。虽然他们也可以认为是预训练任务优化和模型轻量化方面的工作,但鉴于模型结构创新力度很大,我们还是在模型结构优化这个版块来分析他们。

2 XLNet

在这里插入图片描述
论文信息:2019年6月,谷歌 & CMU,NeurIPS 2019
论文地址 https://arxiv.org/pdf/1906.08237.pdf
代码和模型地址 https://github.com/zihangdai/xlnet

XLNet暂时不分析了,有篇知乎文章写得很好,详见 https://zhuanlan.zhihu.com/p/70257427

3 ALBERT

在这里插入图片描述
论文信息:2019年9月,谷歌,ICLR 2020
论文地址 https://arxiv.org/abs/1909.11942
代码和模型地址 https://github.com/google-research/ALBERT

3.1 创新点

从目前越来越多的预训练模型中我们可以发现,更大的模型参数量,可以带来更好的效果。但模型参数量是不是可以无限制增加呢?比如增大hidden size、Transformer层数等。显然是不可行的,受制于GPU/TPU内存限制和训练时长的影响,在目前深度学习算力还比较紧张的时代,模型参数量不可能无限制增加。我们必须提高模型参数的效率,来使用更大的hidden size和层数,从而提升模型性能。因此ALBERT从多个方面对模型进行了轻量化改造,减少参数冗余,提升参数效率。从而在大大压缩模型体积的同时,通过增加隐层和层数,来提升模型效果。

3.1.1 Factorized embedding parameterization 矩阵分解

在模型压缩和加速中,我们经常使用矩阵分解的方法。将一个大矩阵,分解为两个小矩阵。我们将BERT的token embedding向量大小记为E,隐层大小记为H,vocab大小为V。原版BERT中,E = H。这其中是否有参数冗余呢?答案是显然的。embedding层向量主要是当前token的特征表达,而且比较低维。而隐层则包含了更多来自上下文的信息。和隐层相比,embedding层不需要那么大的向量。

基于这一点,ALBERT对embedding层进行了矩阵分解。分解为V * E + E * H 的两个矩阵。原版BERT embedding层大小为 V * H。压缩比为 (V * E + E * H) / (V * H),由于V >> H,故压缩比约为 E/H。当E远小于H时,可以实现较大的压缩比。典型值E = 128, H = 2014,矩阵分解后,embedding层参数量只有原先的1/8

下面是不同embedding层大小E的实验结果。比较尴尬的是,当跨层参数不共享时,E=768,也就是和H相同是,效果最好。而当跨层参数共享时,E=128时效果最好。可见缩小E不会影响模型性能太多。在这里插入图片描述

3.1.2 Cross-layer parameter sharing 跨层参数共享

ALBERT又想到了另一个轻量化方法,层间参数共享。将Transformer每一层的参数,包括self-attention和fead-forward,都进行共享。作用有两点

  1. Transformer encoding的参数量直接缩小为原来的 1/N, N为层数。典型值为12,24
  2. 每一层输出向量更加稳定。

在这里插入图片描述
如上所示,ALBERT分析了每一层输入和输出embedding的L2距离和余弦距离。显然ALBERT要稳定很多。

文章也对不同的跨层参数共享策略进行了分析。其他参数不变情况下,跨层参数共享显然会降低一定的模型性能,但差别不会太大,尤其是E=128时。我们完全可以通过增大hidden size和layers,来弥补这个损失。同时发现,共享attention基本不会损失性能,而共享FFN层则带来一定的性能下降。
在这里插入图片描述

3.1.3 sentence-order prediction (SOP) 语句顺序预测

之前很多文章发现,BERT的NSP反而有副作用,主要体现在:

  1. NSP的负样本来自不同文档,差异过大,任务过于简单,导致模型参数训练不充分。
  2. NSP将两句话构成一个pair,会减小单个语句的长度。而越长的语句,信息量越大,可以提升模型效果
  3. NSP的负样本来自不同文档,利用不同文档的语句来预测MLM,容易给MLM带来较大的噪声。

跟SpanBERT和Roberta直接简单粗暴的去掉NSP不同,ALBERT认为sentence level语句在句子级别的下游任务上还是很有用的,比如NLI。所以ALBERT没有直接去掉NSP,而是对他进行了改造。ALBERT提出了语句顺序预测,一个pair的两个文本,不论正负样本,都来自同一文档。正样本为AB,负样本为BA。模型需要预测语句顺序。这个方法克服了MLM噪声引入问题,也使得模型从基于NSP的主题预测变为了基于SOP的语句关系预测,大大增加了任务难度,从而使模型参数训练更充分。

文章也对去掉NSP,NSP,SOP三种方式进行对比实验,SOP相比NSP,可以带来1%性能提升。
在这里插入图片描述

3.1.4 其他

其他和BERT不同之处,参考了之前的一些论文,比如XLNet、SpanBERT和Roberta,主要有

  1. 采用span masking,也就是连续mask多个token,最大span设置为3
  2. batch size设置为4k
  3. 语料采用了Roberta的160GB
  4. tokenize采用了XLNet的SentencePiece
  5. 去掉dropout。由于作者发现ALBERT训练到1M步后,仍然没有过拟合,故决定试试去掉dropout,结果发现反而带来了性能提升,这一点也是比较神奇。

增加语料的对比效果如下,16GB语料增加到160GB,可以提升0.7%
在这里插入图片描述
去掉dropout,可以提升0.3%
在这里插入图片描述

3.2 实验结果

3.2.1 ALBERT配置

在这里插入图片描述
ALBERT分为四种不同大小,embedding层都采用128,但hidden隐层和layers层数有所不同。为什么xxlarge不采用24层呢。文中提到24层的xxlarge和12层的,效果差不多,但算力需要更大,故最终xxlarge采用12层,4096 hidden size。

3.2.2 和BERT对比

在这里插入图片描述
同样只采用了BERT的16G语料,ALBERT-xxlarge基本是吊打BERT-large。虽然训练时间增加了三倍,但模型体积减小了,效果也提升了3.5个百分点。

3.2.3 GLUE效果

在这里插入图片描述
可以看到不论是单模型,还是多模型融合,ALBERT基本是吊打其他模型,又一次提升了GLUE SOTA。

4 ELECTRA

在这里插入图片描述
论文信息:2020年3月,谷歌 & 斯坦福,ICLR 2020
论文地址 https://arxiv.org/abs/2003.10555
代码和模型地址 https://github.com/google-research/electra
中文模型地址 https://github.com/ymcui/Chinese-ELECTRA#FAQ

4.1 创新点

之前BERT文章中提到过,MLM掩码模型只能对mask位置token进行predict,训练效率比较低,导致需要很多轮迭代,模型参数才能训练好。这也是为什么比GPT等自回归模型训练更耗时的原因。ELECTRA提出了一种类似于生成-判别网络的架构,利用RTD(replaced token detection)来对每个token进行predict,从而减少了模型所需算力。

4.1.1 模型结构

在这里插入图片描述
如上图所示,分为两部分

  1. 先对原始文本进行随机mask,然后由Generator生成mask位置token。这一步和BERT MLM基本相似。
  2. 然后对生成好的语句,利用Discrimination判断每个token是否还原始token。这个任务称为RTD,二分类任务,label为original和replaced。这个网络也是采用的Transformer encoder。

pretrain的目标函数为两部分loss加权和,如下
在这里插入图片描述由于判别网络任务简单,loss远小于生成网络,故添加了加权系数,λ取50

4.1.2 Weight Sharing 权重共享

Generator和Discriminator均采用的Transformer Encoder结构,他们的参数是可以进行共享的。文章对比了三种共享方式

  1. 完全不共享,两个网络相互独立
  2. 只共享embedding层,encoding层不共享
  3. 完全共享,包括embedding和encoding。

实验发现,三种方法在GLUE上的score分别为83.6、84.3、84.4。考虑到只共享embedding,二者encoding层可以独立设计和优化,故最终采取了只共享embedding的方式。

4.1.3 Smaller Generators 减小生成器

作者发现生成器参数量为判别器的1/2 ~ 1/4时,模型整体效果最好。故我们可以减小生成器,加快模型收敛。
在这里插入图片描述

4.2 实验结果

小模型

在这里插入图片描述

  1. ELECTRA-Small和BERT-Small,参数量和计算量相同的情况下,GLUE高了4.8%,基本算是吊打。减少计算量的情况下,比如50% trained,ELECTRA也可以达到79%的GLUE score,性能还是非常不错的。
  2. ELECTRA-Base比BERT-base,GLUE高了2.9%,性能很出色。

大模型

在这里插入图片描述
在large模型上,训练400k steps的ELECTRA就可以达到Roberta的效果,计算量只有后者的1/4。而训练1.75M stpes的ELECTRA,多项任务上可以达到SOTA。

系列文章,请多关注
NLP预训练模型1 – 综述
NLP预训练模型2 – BERT详解和源码分析
NLP预训练模型3 – 预训练任务优化(ERNIE、SpanBERT)
NLP预训练模型4 – 训练方法优化(RoBERTa、T5
NLP预训练模型5 – 模型结构优化(XLNet、ALBERT、ELECTRA)
NLP预训练模型6 – 模型轻量化(ALBERT、Q8BERT、DistillBERT、TinyBERT等)

猜你喜欢

转载自blog.csdn.net/u013510838/article/details/106984080