ALBERT原文:《ALITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS》
中文预训练ALBERT模型来了:小模型登顶GLUE,Base版模型小10倍速度快1倍。
Google一出手就是不一样,不再是BERT+的模式,而是做了个大改动。ALBERT模型是BERT的改进版,与最近其他State of the art的模型不同的是,这次是预训练小模型,效果更好、参数更少。
模型下载
1、albert_large_zh,参数量,层数24,大小为64M
参数量和模型大小为bert_base的六分之一;在口语化描述相似性数据集LCQMC的测试集上相比bert_base上升0.2个点
2、albert_base_zh(小模型体验版), 参数量12M, 层数12,大小为40M
参数量为bert_base的十分之一,模型大小也十分之一;在口语化描述相似性数据集LCQMC的测试集上相比bert_base下降约1个点;
相比未预训练,albert_base提升14个点
3、albert_xlarge, albert_xxlarge will coming recently.
if you want use a albert model with best performance among all pre-trained models, just wai
先来感受一下刷榜的乐趣,
GLUE:
SQuAD:
RACE:
目前github上已经放出的开源版本:
非官方中文预训练ALBERT:https://github.com/brightmart/albert_zh
1. 模型简介
ALBERT主要对BERT做了3点改进,缩小了整体的参数量,加快了训练速度,增加了模型效果。
接下来介绍这三点改进。
1.1 Factorized embedding parameterization
O(V * H) to O(V * E + E * 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倍。
在BERT、XLNet、RoBERTa中,词表的embedding size(E)和transformer层的hidden size(H)都是相等的,这个选择有两方面缺点:
从建模角度来讲,wordpiece向量应该是不依赖于当前内容的(context-independent),而transformer所学习到的表示应该是依赖内容的。所以把E和H分开可以更高效地利用参数,因为理论上存储了context信息的H要远大于E。
从实践角度来讲,NLP任务中的vocab size本来就很大,如果E=H的话,模型参数量就容易很大,而且embedding在实际的训练中更新地也比较稀疏。
因此作者使用了小一些的E(64、128、256、768),训练一个独立于上下文的embedding(VxE),之后计算时再投影到隐层的空间(乘上一个ExH的矩阵),相当于做了一个因式分解。
从后续的实验中来看,E的大小与实验效果也不是完全正相关,因此其他实验中E都取的128。
1.2 Cross-layer parameter sharing
参数共享能显著减少参数。共享可以分为全连接层、注意力层的参数共享;注意力层的参数对效果的减弱影响小
跨层参数共享,就是不管12层还是24层都只用一个transformer。这在之前读过Universal Transformer就有了,但是以为会火,因为做语言模型的效果比标准Transformer好。结果没什么人用,这次被提起来了。
作者对比了每层输入输出的L2距离和相似度,发现了BERT的结果比较震荡,而ALBERT就很稳定,可见ALBERT有稳定网络参数的作用。
1.3 Inter-sentence coherence loss
使用段落连续性任务。正例,使用从一个文档中连续的两个文本段落;负例,使用从一个文档中连续的两个文本段落,但位置调换了。
避免使用原有的NSP任务,原有的任务包含隐含了预测主题这类过于简单的任务。
We maintain that inter-sentence modeling is an important aspect of language understanding, but we propose a loss
based primarily on coherence. That is, for ALBERT, we use a sentence-order prediction (SOP) loss, which avoids topic
prediction and instead focuses on modeling inter-sentence coherence. The SOP loss uses as positive examples the
same technique as BERT (two consecutive segments from the same document), and as negative examples the same two
consecutive segments but with their order swapped. This forces the model to learn finer-grained distinctions about
discourse-level coherence properties.
其他变化,还有 Other changes:
1)去掉了dropout Remvoe dropout to enlarge capacity of model.
最大的模型,训练了1百万步后,还是没有过拟合训练数据。说明模型的容量还可以更大,就移除了dropout
(dropout可以认为是随机的去掉网络中的一部分,同时使网络变小一些)
We also note that, even after training for 1M steps, our largest models still do not overfit to their training data.
As a result, we decide to remove dropout to further increase our model capacity.
其他型号的模型,在我们的实现中我们还是会保留原始的dropout的比例,防止模型对训练数据的过拟合。
2)为加快训练速度,使用LAMB做为优化器 Use lAMB as optimizer, to train with big batch size
使用了大的batch_size来训练(4096)。LAMB优化器使得我们可以训练,特别大的批次batch_size,如高达6万。
3)使用n-gram(uni-gram,bi-gram, tri-gram)来做遮蔽语言模型 Use n-gram as make language model
即以不同的概率使用n-gram,uni-gram的概率最大,bi-gram其次,tri-gram概率最小。
本项目中目前使用的是在中文上做whole word mask,稍后会更新一下与n-gram mask的效果对比。n-gram从spanBERT中来。
后BERT时代很多研究(XLNet、RoBERTa)都发现next sentence prediction没什么用处,所以作者也审视了一下这个问题,认为NSP之所以没用是因为这个任务不仅包含了句间关系预测,也包含了主题预测,而主题预测显然更简单些(比如一句话来自新闻财经,一句话来自文学小说),模型会倾向于通过主题的关联去预测。因此换成了SOP(sentence order prediction),预测两句话有没有被交换过顺序。实验显示新增的任务有1个点的提升:
发布计划 Release Plan
1、albert_base, 参数量12M, 层数12,10月7号
2、albert_large, 参数量18M, 层数24,10月13号
3、albert_xlarge, 参数量59M, 层数24,10月6号
4、albert_xxlarge, 参数量233M, 层数12,10月7号(效果最佳的模型)
2. 总结
刚开始看这篇文章是很惊喜的,因为它直接把同等量级的BERT缩小了10倍+,让普通用户有了运行GPT2、威震天的可能。但是仔细看了实验后才发现体量的减小是需要付出代价的:
实验使用的xlarge是24层,2048维度,xxlarge是12层,4096维度。可以仔细看一下model的量级,并且注意一下这个speedup是训练时间而不是inference时间(因为数据少了,分布式训练时吞吐上去了,所以ALBERT训练更快),但inference还是需要和BERT一样的transformer计算。
可以得出的结论是:
在相同的训练时间下,ALBERT得到的效果确实比BERT好
在相同的Inference时间下,ALBERT base和large的效果都是没有BERT好的,而且差了2-3个点,作者在最后也提到了会继续寻找提高速度的方法(sparse attention和block attention)
鱼与熊掌不可兼得,尤其是对于工程落地而言,需要在速度与效果之间寻找一个trade-off。
另外,结合Universal Transformer可以想到的是,在训练和inference阶段可以动态地调整transformer层数(告别12、24、48的配置吧)。同时可以想办法去避免纯参数共享带来的效果下降,毕竟越深的transformer层所学到的任务相关信息越多,可以改进transformer模块,加入记忆单元、每层的个性化embedding。