文 | 苏剑林

单位 | 追一科技

编 | 兔子酱


在预训练语言模型中,ALBERT和ELECTRA算是继BERT之后的两个“后起之秀”。它们从不同的角度入手对BERT进行了改进,最终提升了效果(至少在不少公开评测数据集上是这样),因此也赢得了一定的口碑。

在平时的交流学习中,笔者发现不少朋友对这两个模型存在一些误解,以至于在使用过程中浪费了不必要的时间。在此,笔者试图对这两个模型的一些关键之处做下总结,供大家参考,希望大家能在使用这两个模型的时候少走一些弯路。

(注:本文中的“BERT”一词既指开始发布的BERT模型,也指后来的改进版RoBERTa,我们可以将BERT理解为没充分训练的RoBERTa,将RoBERTa理解为更充分训练的BERT。)

ALBERT

ALBERT来自论文《ALBERT: A Lite BERT for Self-supervised Learning of Language Representations》[1]。顾名思义它认为自己的特点就是Lite,那么这个Lite的具体含义是什么呢?不少国内朋友对ALBERT的印象是又小又快又好,事实真的如此吗?

特点

简单来说,ALBERT其实就是一个参数共享的BERT,相当于将函数
































改成了


















, 其中f代表模型的每一层,这样本来有n层参数,现在只有1层了,因此参数量大大减少,或者说保存下来的模型权重体积很小,这是Lite的第一个含义;然后,由于参数总量变少了,模型训练所需的时间和显存也会相应变小,这是Lite的第二个含义。此外,当模型很大时,参数共享将会是模型的一个很强的正则化手段,所以相比BERT没那么容易过拟合。这是ALBERT的亮点。

预测

要注意,我们没说到预测速度。很明显,在预测阶段参数共享不会带来加速,因为模型反正就是一步步前向计算,不会关心当前的参数跟过去的参数是否一样,而且就算一样也加速不了(因为输入也不一样了)。所以,同一规格的ALBERT和BERT预测速度是一样的,甚至真要较真的话,其实ALBERT应该更慢一些,因为ALBERT对Embedding层用了矩阵分解,这一步会带来额外的计算量,虽然这个计算量一般来说我们都感知不到。

训练

对于训练速度,虽然会有所提升,但是并没有想象中那么明显。参数量可以缩小到原来的1/n,并不意味着训练速度也提升为原来的n倍。在笔者之前的实验里边,base版本的ALBERT相比BERT-base,训练速度大概只是快10%~20%,显存的缩小幅度也类似。如果模型更小(tiny/small版),那么这个差距将会进一步缩小。换句话说,ALBERT的训练优势只有在大模型才明显,对于不大的模型,这个优势依然是难以有明显感知的。

效果

至于效果,其实ALBERT的原论文已经说得很清楚,如下表所示。

参数共享会限制模型的表达能力,因此ALBERT的xlarge版才能持平BERT的large版,而要稳定超过它则需要xxlarge版,换句话说,只要版本规格小于xlarge,那么同一规格的ALBERT效果都是不如BERT的。中文任务上的评测结果也是类似的,可以参考CLUE[2]和 追一的评测[3]。而且笔者之前还做过更极端的实验:加载ALBERT的权重,但是放开参数共享的约束,把ALBERT当BERT用,效果也会有提升!(参考《抛开约束,增强模型:一行代码提升albert表现》[4]。所以,小规格ALBERT不如BERT基本是实锤的了

结论

所以,总结出来的建议就是:

  • 如果不到xlarge版,那么没必要用ALBERT。

  • 同一速度的ALBERT效果比BERT差。

  • 同一效果的ALBERT速度比BERT慢。

现在BERT也都有tiny/small版了,比如我司开源的[5],基本上一样快而且效果更好,除非你是真的需要体积小这个特点。

那xlarge版是什么概念?有些读者还没尝试过BERT,因为机器跑不起来;多数读者显存有限,只跑过base版的BERT,没跑过或者跑不起large版的。而xlarge是比large更大的,对设备的要求更高,所以说白了,对于大部分读者来说都没必要用ALBERT的

那为什么会有ALBERT又快又好的说法传出来呢?除了一些自媒体的不规范宣传外,笔者想很大程度上是因为brightmart同学的推广了。

不得不说,brightmart同学为ALBERT在国内的普及做出来不可磨灭的贡献,早在ALBERT的英文版模型都还没放出来的时候,brightmart就训练并开源了ALBERT中文版albert_zh[6] ,并且还一鼓作气训练了tiny、small、base、large、xlarge多个版本,当时BERT就只有base和large版本,而ALBERT有tiny和small版本,大家一试发现确实比BERT快很多,所以不少人就留下了ALBERT很快的印象。事实上ALBERT很快跟ALBERT没什么关系,重点是tiny/small,对应的BERT tiny/small也很快...

当然,你可以去思考ALBERT参数共享起作用的更本质的原因,也可以去研究参数共享之后如何提高预测速度,这些都是很有价值的问题,只是不建议你用低于xlarge版本的ALBERT。

ELECTRA

ELECTRA来自论文《ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators》[7]。说实话,ELECTRA真是一个一言难尽的模型,它刚出来的时候让很多人兴奋过,后来正式发布开源后又让很多人失望过,目前的实战表现虽然不能说差,却也不能说多好。

特点

ELECTRA的出发点是觉得BERT的MLM模型随机选择一部分Token进行Mask的这个操作过于简单了,想要增加一下它的难度。所以它借鉴了GAN的思想,用普通的方式训练一个MLM模型(生成器),然后根据MLM模型对输入句子进行采样替换,将处理后的句子输入到另外一个模型(判别器)中,判断句子哪些部分是被替换过的,哪些部分是被没被替换的。生成器和判别器是同步训练的,因此随着生成器的训练,判断难度会慢慢增加,直观想象有利于模型学到更有价值的内容。最后只保留判别器的Encoder来用,生成器一般就不要了。

由于这种渐进式的模式使得训练过程会更有针对性,所以ELECTRA的主要亮点是训练效率更高了,按照论文的说法能够用1/4的时间甚至更少来达到同样规格的BERT的效果,这是ELECTRA的主要亮点。

理论

然而,在笔者看来,ELECTRA是一个在理论上站不住脚的模型

为什么这样说呢?ELECTRA的思想源于GAN,但是在CV中,我们有把训练好的GAN模型的判别器拿来Finetune下游任务的例子吗?至少笔者没看到过。事实上,这是理论上不成立的,拿原始GAN来说,它的判别器最优解是



























其中p(x),q(x)分别是真假样本的分布。假设训练是稳定的,并且生成器具有足够强的拟合能力,那么随着模型的训练,假样本会逐渐趋于真样本,所以q(x)趋于p(x),那么D(x)就趋于常数1/2。也就是说,理论上最后的判别器只是一个常值函数,你怎么能保证它提取出好的特征来呢?

虽然ELECTRA不完全是GAN,但在这一点上是一致的,所以ELECTRA强调作为生成器的MLM模型不能太过复杂(不然像上面说的判别器就退化为常数了),论文说是在生成器的大小在判别器的1/4到1/2之间效果是最好的。这就开始“玄学” 起来了,刚才我们只论证了太好不行,没法论证为什么差一点就行,也没法论证差多少才行,以及不清楚为什么生成器和判别器同步训练会更好,现在这些都变成了纯粹“炼丹”的东西了。

效果

当然,我说它理论上站不住脚,并不是说它效果不好,更不是说相关评测造假了。ELECTRA的效果还算过得去,只不过是让我们经历了一个“期望越大,失望越大”的过程罢了。

ELECTRA的论文首先出现在ICLR2020的投稿中,当时的结果让大家都很震惊,大概就是small版的ELECTRA模型远超small版的BERT,甚至直逼base版,而base版的ELECTRA达到了large版BERT的水平。结果当代码和权重放出后[8]上所显示的成绩却让人“大跌眼镜”——基本下降了2个百分点。后来作者出来澄清了,说论文上写的是dev集而Github上写的是test集,大家才稍微理解了一点,不过这样的话,ELECTRA相比BERT在效果上就变得没有什么亮点了。(参考《ELECTRA: 超越BERT, 19年最佳NLP预训练模型》[9]到《谈谈我对ELECTRA源码放出的看法》[10])

事实上,ELECTRA在中文任务上的评测更加准确地反映了这一点,比如哈工大开源的Chinese-ELECTRA[11]中,ELECTRA在各个任务上与同级别的BERT相差无几了,有个别任务有优势,但是并未出现那种“碾压式”的结果。

失彼

可能有读者会想,就算效果差不多,但人家预训练快了,好歹也是个优点嘛,这点确实不否认。但是这两天Arxiv的一篇新论文表明,ELECTRA的“效果差不多”可能只是在简单任务上的假象,如果构建复杂一点的任务,它还是会被BERT“吊打”。

这篇论文的名字是《Commonsense knowledge adversarial dataset that challenges ELECTRA》[12],作者基于SQuAD 2.0数据集用同义词替换的方式构建了一个新的数据集QADS,然后按照作者的测试,在SQuAD 2.0上能达到88%的ELECTRA large模型在QADS上只有22%了,而有意思的是BERT都能做到60%多。当然这篇论文看起来还很粗糙,还没得到权威肯定,所以也不能尽信,但其结果已经能引起我们对ELECTRA的反思了。之前论文《Probing Neural Network Comprehension of Natural Language Arguments》[13]的一个“not”就把BERT拉下了神坛,看来ELECTRA也会有这种问题,而且可能还更严重。

抛开其它证据不说,其实笔者觉得,ELECTRA最终抛弃了MLM本身就是一个“顾此失彼”的操作:你说你的出发点是MLM太简单,你就想办法提高MLM难度就是了,你把MLM换成判别器干嘛呢?直接用一个生成器网络来改进MLM模型(而不是将它换成判别器)是有可能,前段时间微软的论文《Variance-reduced Language Pretraining via a Mask Proposal Network》[14]就提供了这样的一种参考方案,它让生成器来选择要Mask掉的位置,而不是随机选,虽然我没有重复它的实验,但它的整个推理过程都让人觉得很有说服力,不像ELECTRA纯拍脑袋的感觉。此外,笔者还想再强调一下,MLM是很有用的,它不单单是以一个预训练任务,比如《必须要GPT3吗?不,BERT的MLM模型也能小样本学习》[15]

结论

所以,说了那么多,结论就是:ELECTRA的预训练速度是加快了,但从目前的实验来看,它相比同级别的BERT在下游任务上的效果并没有突出优势,可以试用,但是效果变差了也不用太失望。此外,如果你需要用到MLM部分的权重(比如用来做UniLM的文本生成,参考这里[16],那么也不能用ELECTRA,因为ELECTRA的主体是判别器,它不是MLM模型;而ELECTRA中作为生成器的MLM模型,则比判别器简化,可能存在拟合能力不足、学习不充分等问题,并不是一个很好的预训练MLM模型。

至于ELECTRA背后的思想,即针对MLM随机Mask这一步过于简单进行改进,目前看来方向是没有错误的,但是将生成式模型换成判别式模型的有效性依然还需要进一步验证,如果有兴趣深入分析的读者,倒是可以进一步思考研究。

文章小结

本文记录了笔者对ALBERT和ELECTRA的看法与思考,主要是综合笔者自己的一些实验结果,以及参考了一些参考文献,希望比较客观地表达清楚这两个模型的优缺点,让读者在做模型选择的时候心里更有底一些。这两个模型在特定的场景下都有其可取之处,但也存在一些限制,清楚这些限制及其来源有助于读者更好地使用这两个模型。

笔者没有刻意中伤某个模型的意思,如果有什么理解不当之处,欢迎大家留言讨论。

后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

有顶会审稿人、大厂研究员、知乎大V和妹纸

等你来撩哦~

参考文献

[1]ALBERT:https://arxiv.org/abs/1909.11942

[2]CLUE: https://github.com/CLUEbenchmark/CLUE

[3]追一评测: https://github.com/ZhuiyiTechnology/pretrained-models

[4]抛开约束,增强模型:一行代码提升albert表现》: https://spaces.ac.cn/archives/7187

[5]追一开源: https://github.com/ZhuiyiTechnology/pretrained-models

[6]albert_zh: https://github.com/bojone/albert_zh

[7]ELECTRA: https://arxiv.org/abs/2003.10555

[8]electra github: https://github.com/google-research/electra

[9]《ELECTRA: 超越BERT, 19年最佳NLP预训练模型》: https://zhuanlan.zhihu.com/p/89763176

[10]谈谈我对ELECTRA源码放出的看法》: https://zhuanlan.zhihu.com/p/112813856

[11]Chinese-ELECTRA: https://github.com/ymcui/Chinese-ELECTRA

[12]《Commonsense knowledge adversarial dataset that challenges ELECTRA》: https://arxiv.org/abs/2010.13049

[13]Probing Neural Network Comprehension of Natural Language Arguments》: https://arxiv.org/abs/1907.07355

[14]《Variance-reduced Language Pretraining via a Mask Proposal Network》: https://arxiv.org/abs/2008.05333

[15]必须要GPT3吗?不,BERT的MLM模型也能小样本学习》: https://spaces.ac.cn/archives/7764

[16]从语言模型到Seq2Seq:Transformer如戏,全靠Mask: https://spaces.ac.cn/archives/693

吐槽贴:用ELECTRA、ALBERT之前,你真的了解它们吗?相关推荐

  1. 某大厂程序员吐槽:在北京当码农,不敢结婚不敢生娃,真是注孤生!

    在北京大厂当程序员,年薪几十万甚至上百万,听起来还挺不错的.但生活如人饮水,冷暖自知,身在其中的人未必会这么觉得. 一位程序员发帖吐槽:在北京当码农真的是能一眼望到头!在大厂年包几十万.上百万,慢慢能 ...

  2. 【C++】C++命名空间重定向

    参见博客: namespace使用总结 命名空间的重定向的格式: namespace newName = oldName; 在caffe源码走读时,遇到namespace的重定向用法,以前没有用过,源 ...

  3. r语言读取csv文件赋值gamma_tidyfst vs pandas(1):csv文件读写

    作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量.机器学习.数据可视化.应用统计建模.知识图谱等,著有& ...

  4. jquery实现点击a链接,跳转之后,该a链接处显示背景色

    做项目的时候遇到这个问题,,按理说只要是会套模板的,就不该出现这种低级问题.然后我的后台并没有模板,,并且我的js,jquery水平是小学水平,所以这个也困扰了我将近一下午.在此总结一下,分享给大家. ...

  5. 猫和老鼠服务器维修有问题,猫和老鼠:游戏中大范围的断网掉线问题 玩家:土豆服务器就这样...

    小伙伴们大家好,我是你们的老朋友小可,欢迎大家来到猫和老鼠手游小可堂的第57期,上一期我们讲了大佬对局中都在做什么(不要忽略有些细节哦,那也是致胜的关键点),本期我们要讲的内容有:折磨人的猫.四排牛仔 ...

  6. 关于线程执行顺序的问题

    R君今天曾问我:假设现在有三个线程T1.T2.T3.那么他希望T1.T2.T3这三个线程按照顺序去执行,该怎么去完成.我本能的反应是这个好办,使用thread.jon()方法完全可以实现.接着他又问, ...

  7. windbg 脚本学习总结

    windbg 脚本简单入门 http://blog.csdn.net/superliuxing/article/details/19206985 Windbg的功能自然不必说,集内核调试,应用程序调试 ...

  8. LeetCode 04寻找两个正序数组的中位数(困难)二分法

    题目描述: 呕心沥血的一个题解,点赞关注收藏,一键三联,一起加入我们打卡! 题目描述: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2. 请你找出这两个正序数组的中位数 ...

  9. 阿里巴巴为什么主推HSF?比Dubbo有哪些优势?

    作者:匿名用户 链接:https://www.zhihu.com/question/39560697/answer/187538165 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  10. 二分法分页 mysql_LeetCode 04寻找两个正序数组的中位数(困难)二分法

    呕心沥血的一个题解,点赞关注在看,一键三联,一起加入我们打卡!. 题目描述:呕心沥血的一个题解,点赞关注收藏,一键三联,一起加入我们打卡! 题目描述:给定两个大小为 m 和 n 的正序(从小到大)数组 ...

最新文章

  1. java读取ACCESS数据库的简单示例
  2. 不想参加无聊的团队分享, 我们这样玩
  3. root cause of message type unknown during BP delta upload
  4. 江苏一动物园现“旋转活马” 园方:创意来自马术训练
  5. android点滴27:R文件无法加载 R cannot be resolved to a v...
  6. linux p7zip密码,linux下7zip使用方法
  7. 软件测试——语句覆盖
  8. 最优化学习笔记(十四)——共轭梯度法
  9. Python《爬取IPhone各式壁纸》
  10. 命令查看mysql 是否安装_验证mysql是否安装成功的方法
  11. 旅游新时尚:点点鼠标就可“周游世界”
  12. WindowsServer2003 MSSQL安全
  13. 商务办公软件应用与实践【4】
  14. Linux下c语言多线程编程
  15. 配置邮件服务器sendman,java邮件收发功能实现代码.pdf
  16. Python 处理 PDF 的神器 -- PyMuPDF(下)
  17. C/C++回溯经典练习:马的走法
  18. iterm2 + oh my zsh 实现 macOS X 下炫酷终端
  19. 联想小新pro16和联想小新pro14 2022款哪个好
  20. 【福利帖】7日玩转ESP32

热门文章

  1. 【NS2】在linux下安装低版本GGC
  2. js中的四舍五入函数
  3. 64 位 win7(2008 r2) 使用PLSQL Developer x86 32bit的解决方法
  4. C#23种设计模式WebCast讲解笔记大全(25讲)
  5. vbs调用WebService -- 使用xmlhttp
  6. 有效创建Oracle dblink的两种方式
  7. Git 忽略一些文件的提交
  8. 设计一个串口服务器设备.《需求分析报告》,《项目开发,分布式多串口交换服务器的设计与实现...
  9. 每日一题(16)—— 声明和定义的区别
  10. python sklearn 归一化_数据分析|Python特征工程(5)