赞
踩
随着Transfomer结构的普及,一时间大语料、大参数量的预训练模型成为主流。当在实际部署BERT等模型时,往往需要使用蒸馏、压缩或其他优化技术对模型进行处理。
ALBERT模型来自论文 Google 最近公布的论文 《ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS》从名字就可以看出 ALBERT 是 BERT 的“改进版”,其进步的地方,一言以蔽之,就是 用更少的参数,取得了更好的效果。
github: https://github.com/google-research/ALBERT
ALBERT模型也是基于这一点考虑,通过各种手段减少参数量,得到一个占用较小的模型,对实际落地有较大的意义,不过由于其主要还是减少参数量,所以在推断时间上并没有优化,所有对量大的需求还是很有问题的。
总体来说,ALBERT有意义的创新主要有:
修正了句子预测这一一直被诟病的预训练任务,改为了预测句子之间的连贯性;
对Embedding进行因式分解;
跨层的参数共享。
这是作者开篇讨论的问题。近一两年,预训练语言模型给自然语言处理领域带来了巨大的突破。从 ELMO,GPT,到 Bert,XLNet 和 RoBerta,我们不难看出,性能越强的模型,参数量也越大。既然模型的参数量如此重要,我们就会有一个很直接的假设:参数量越大,模型的性能就会越高。
先不考虑硬件资源和训练时间(还是要考虑,如此大的开销已经将很多参与者挤出门外了),如果上述假设成立,那么我们只需要想方设法地扩展模型规模就可以了。作者为验证假设,将 Bert-large 模型的隐藏层 size 扩展了一倍,构建了 Bert-xlarge模型。该模型的参数量较 Bert-large 提升了一倍,然而遗憾的是,如图1所示,Bert-xlarge 出现了模型退化(model degradation)现象,性能不升反降。因此,简单地推高参数量,不仅会面临更加严峻的硬件资源不足以及训练时间过长问题,且无法获得更好的效果的。
Bert-large 与 Bert-xlarge 对比图
其实这也比较好理解,参数量越大性能越好,我认为这本身是没有正确的,但前提是对模型中参数的运用没有退化,或者说模型内单位参数所发挥的作用没有退化。举个例子,鲸鱼大脑的绝对体积和重量都要超过人类,但其大脑很大一部分精力用在控制其“臃肿”的体积上,而不是用来思考和记忆,因此远不如人类聪明。
因此为了提升模型性能,我们既可以“做加法”,在模型结构合理有效的前提下,增大模型的规模(e.g. Bert --> Bert-large, Bert --> XLNet);也可以“做减法”,降低参数量,但提升参数的利用效率、更大地发挥参数的效果。本篇论文中所设计的 ALBERT,就是在“做减法”的基础上,在性能上全面超越 Bert。
BERT在提出的时候提供了两种预训练任务,一个是遮蔽语言模型,即以一定比例随机遮蔽一定比例的输入标记,然后预测那些被遮蔽的标记的预训练任务(PS:ALBERT也不是直接做这个任务,而是换成N-gram的预测任务),另一个则是预测第二个句子是不是第一个句子的下一句。但在随后的实践中,第二个任务被证明并没有给模型带来受益,主要由于这个任务过于简单。于是,在ALBERT中这个任务被换成了预测句子间的顺序,增加模型学会这种任务的能力:
从实验上看,有所提升,但个人感觉这个预训练任务还是有待改进。
这一步操作其实就是没啥特别好说的,无外乎就是觉得词嵌入时的向量维度应该小一点,然后通过个网络扩充一下提升维度,这样一通操作就可以把参数量从 O(V x H) 降到了 O(V x E + E x H)
(有点像深度可分离卷积的做法):
论文实验结果
从实验上看,使用这种方法降低了词向量维度,但没有损失太多的精度(相对来说吧),使用权值共享的策略时增加词向量不升反降(感觉有点神奇)。
共享权值不是什么新鲜的事情,之前一般采用只共享全连接层或只共享attention层,ALBERT则更直接全部共享,不过从实验结果看,全部共享的代价是可以接受的,同时共享权值带来了一定的训练难度,使得模型更鲁棒:
ALBERT 在参数量上要远远小于 Bert。譬如,ALBERT-large 的参数量仅有 18M,仅为 Bert-large 的 1/18;将 Bert 的隐藏层扩展到 2048 维,参数量会飙升到 1.27G 且性能下降,而 H = 2048 的 ALBERT-xlarge 模型只有 59M 的参数,更大的模型 ALBERT-xxlarge(H=4096)参数量也仅有 233M。另外作者在 ALBERT-xxlarge 中设定了 12 层的网络,之所以不设置为 24 层,是因为通过实验作者验证了二者在性能上相近,而后者的计算成本更高。
在ALBERT的实验中作者提到对掩码任务和下游任务取消dropout都带来了提升,这一点无疑非常值得去思考:
掩码任务
下游任务
同时,作者也提到100w步之后,ALBERT依旧没有过拟合的迹象。
最后作者又总结了一遍论文中提出的模型——ALBERT-xxlarge 的强大性能(使用了 Bert、XLNet 和 RoBERTa 的训练数据):在 13 项 NLP 任务上都取得了最佳,包括 GLUE 上的 9 个任务 和 SQuAD、RACE等 4 个数据集。
简单一句话来说,就是小但强。仅从ALBERT本身来说其实是蛮让人失望的,因为并没有带来很多有营养的创新,同时由于其的小更多是共享权值带来的,这也就导致它并没有减少推断时的时间。但另一方面来说,ALBERT减少了占用,本身就给大规模部署带来优势,如果再结合上蒸馏等技术,占用小、速度快、精度高的Bert仿佛就在眼前。
最近,谷歌开源了中文版本和Version 2
ALBERT 2性能再次提升
在这个版本中,“no dropout”“additional training data”“long training time”策略将应用到所有的模型。
与初代ALBERT性能相比结果如下:
从性能的比较来说,对于ALBERT-base、ALBERT-large和ALBERT-xlarge,v2版要比v1版好得多。
说明采用上述三个策略的重要性。
平均来看,ALBERT-xxlarge比v1略差一些,原因有以下2点:
额外训练了1.5M步(两个模型的唯一区别就是训练1.5M和3M步)
对于v1,在BERT、Roberta和XLnet给出的参数集中做了一点超参数搜索;对于v2,只是采用除RACE之外的V1参数,其中使用的学习率为1e-5和0 ALBERT DR。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。