ML
自然语言处理
machine Learning
条件随机场
隐马尔可夫
最大熵模型
Part-of-speech
big data
Attention
命名实体识别
马儿可夫网
期望最大化
一元线性回归
2020年7月
(1)
2020年6月
(1)
2019年10月
(4)
2019年8月
(3)
2019年4月
(1)
2019年1月
(2)
2018年12月
(1)
2018年11月
(10)
2018年10月
(9)
2018年8月
(1)
2018年4月
(2)
2018年1月
(7)
2017年12月
(10)
2017年11月
(2)
2017年10月
(1)
2017年8月
(1)
2017年6月
(3)
2017年5月
(15)
2017年3月
(2)
2017年2月
(1)
2016年11月
(3)
2016年10月
(9)
2016年9月
(3)
2016年7月
(1)
欢迎转载,作者:Ling,注明出处:
深度学习:前沿技术-ALBert
ALBert (A lite BERT)
ALBert (A lite BERT) 是一种通过减少BERT训练参数,从而使得在相同训练时间下,可以在不同NLP任务中取得更好的效果。它又屠版了几乎所有NLP任务。
参数过多的大模型带来的问题:
GPU/TPU内存不足:当下的各种SOTA模型动辄数亿甚至数十亿个参数,倘若要扩大模型规模,这个内存问题是无法回避的。
训练时间会更长:由于通信开销与模型中参数的数量成正比,在分布式训练中训练速度将成为一大瓶颈。
模型退化:简单地增加隐含层单元数,只会适得其反,从而降低性能。
上图实验表明,如果增加模型参数,可能不仅不会提高性能,反而降低性能。
上图实验左图为训练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:
通过上面过程我们可以看出,假设不考虑层数,参数总数为
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 采用的是贡献所有层的所有参数。
上图展示了BERT-Large 与 ALBERT-Large每一层输入嵌入与输出嵌入间的 L2 距离与余弦相似性。从上图可以发现 ALBERT 从一层到另一层的转换要比 BERT 平滑得多。这说明权重共享有效地提升了神经网络参数的鲁棒性。尽管相比于 BERT,ALBERT在两个评价指标都有所下降,但在 24 层以后,它们也不会收敛到 0。下降的部分可以通过增加训练步数提高。
从上图可以看出,通过设置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层的网络结构。
训练数据: 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的概率:
BERT VS ALBERT
从上图可以看出,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作为速度参照基准。
嵌入向量的因式分解
上图展示了在ALBERT-base上修改词嵌入大小 E 带来的影响,它们的参数量及在下游任务的效果。
对于non-shared下(BERT-style),更大的嵌入尺寸能够取得更好的结果,但是提升的幅度其实不大。
对于all-shared(ALBERT-style),嵌入大小128是最好的。基于上述这些结果,本文在后续的实验中的嵌入大小统一选用
E=128
。
跨层参数共享
上图展示了不同跨层参数共享的效果,同样使用 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。
句子顺序预测
上图展示了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%。
相同训练时长下的对比
由于ALBert参数更少,所以往往可以训练更多步数。
在训练了差不多相同的时间之后,ALBERT-xxlarge 明显优于 BERT-large。
引入额外训练集和Dropout的影响
上述实验都是在 Wikipedia 和 BOOKCORPUS 数据集上进行的,那么,如果增加额外的数据会对结果产生怎样的影响?上图采用的额外数据与XLNet和RoBERTa中的相同。
添加额外数据后,模型的开发集 MLM 准确率显著提升。
即使在训练了 100 万步之后,最大的模型仍然没有过拟合。因此,尝试删除dropout,以进一步提高模型能力。
添加额外数据后,在各个下游任务中的性能如下。
去掉dropout后在下游任务上的表现如下:
当下SOTA模型在NLU任务上的对比
ALBERT 在 GLUE、SQuAD 和 RACE 基准测试中都取得了 SOTA 结果如下图所示: