抛开约束,增强模型:一行代码提升 ALBERT 表现
©PaperWeekly 原创 · 作者|苏剑林
单位|追一科技
研究方向|NLP、神经网络
本文标题看起来有点“标题党”了,不过所作改动放到 bert4keras 框架 [1] 下,确实是一行代码的变动,至于是否有提升,这个笔者不敢打包票,不过测了几个算是比较有代表性的任务,均显示持平甚至有提升,所以标题说的也基本是事实。那究竟是什么改动呢?其实一句话也能讲清楚:在下游任务中,放弃 ALBERT 的权重共享的约束,也就是把 ALBERT 当 BERT 用。低秩分解
首先是 Embedding 层,以中文版 bert base 为例,token 总数大约是 20000,而 Embedding 层维度是 768,所以 Embedding 层的总参数量大约是 1500 万,大概占了总参数量的 1/6。
ALBERT 第一个开刀的部分就是 Embedding 层,它把 Embedding 层弄成 128 维了,然后再通过 128 × 768 的矩阵变换矩阵变回 768 维,这样 Embedding 层参数量就只有原来的 1/6 了,这就是所谓的低秩分解。
参数共享
其次是 transformer 部分。在以 BERT 为代表的 transformer 架构模型中,其核心是由 self attention、layer norm、全连接(核大小为 1 的一维卷积)等组成的模块,这里称之为“transformer block”,而 BERT 模型就是多个 transformer block 的堆叠。
如下面左图实际上是 bert base 的示意图,它堆叠了 12 个 transformer block:
▲ 图1. BERT base & ALBERT base极简示意图
ALBERT 里边使用了一种最简单直接的方案:所有层都公用同一个 transformer block(如上面右图所示)!这样一来,在 ALBERT base 中,transformer block 这部分参数量直接降低为原来 BERT base 的 1/12 了。
简单评述
除了以上两点之外,ALBERT 与 BERT 的一个显著不同之处是在预训练阶段将 NSP (Next Sentence Prediction) 任务改为了 SOP (Sentence-Order Prediction) 任务,但是这并不属于模型架构上的,所以并不是本文要关心的,读者自行找相关资料了解即可。
总的来说,ALBERT 是一个为了降低参数量而设计的模型,并且希望这个参数量的降低能带来一定的正则化作用,从而降低过拟合风险,提升最终表现。但最后的结果是否如作者所愿呢?从“战绩”来看,ALBERT 问世之时用它最大版本的模型刷新了 GLUE 榜单,所以应该算是达到了作者的期望。但是,ALBERT 并非总是那么理想,ALBERT 也不是我们想象中的小模型。
对于一个模型来说,我们比较关心的是速度和效果两个指标。从上面两个 BERT 和 ALBERT 的图其实就可以看到,在预测阶段(前向传播),其实 ALBERT 跟 BERT 没啥差别,所以同一规格(比如大家都是 base 版本)下的 ALBERT 和 BERT 的预测速度是一样的,甚至更严格地说,ALBERT 还更慢些,因为 ALBERT 的 Embedding 部分还多了一个矩阵运算。换句话说,ALBERT 不能带来预测速度的提升!
那同一规格的 ALBERT 和 BERT,哪个效果好呢?其实 ALBERT 论文已经给出了答案:在 large 以内的版本,ALBERT 效果比 BERT 更差,只有在 xlarge、xxlarge 的版本时 ALBERT 效果才开始优于 BERT。
但是 roberta 方式的预训练部分弥补了 BERT 的缺点,所以真正可以说稳定优于 bert/roberta 的 ALBERT 版本就只有 xxlarge。然而 ALBERT xxlarge 是一个很庞大的模型,以至于我们很难把它跑起来。
所以,基本上可以说:(在大多数人能搞起的前提下)在同样的预测速度下, ALBERT 效果更差;在同样的效果下,ALBERT 更慢。
那训练阶段呢?前面还没有提到的一点是,ALBERT 的参数共享设计其实有很强的正则化作用,所以 ALBERT 去掉的 dropout。参数共享和去掉 dropout 这两点确实可以省一些显存,并且提高训练速度,但是笔者的评测是幅度只有 10%~20% 左右。也就是说,就算 ALBERT 参数降低到 BERT 的 1/10 甚至更多,并不意味着它的显存占用量能降低到 1/10,也不意味着训练速度能提高 10 倍,相反,它只有小幅度的提升。
去掉参数共享后,训练时间略有增加,这是预料之中的,至于模型表现各有优劣。考虑到这个任务准确率本身比较高了,可能显示不出模型间的差距,所以下面继续测试复杂一点的模型。
这次我们试试 CLUE 的 IFLYTEK'长文本分类 [3],结果如下:
反过来说,ALBERT 的参数共享性能要好,条件是要足够大、足够深,所以如果我们用的是 base 版本、small 版本甚至是 tiny 版本时,反而不应该用参数共享,因为对于小模型来说参数共享反而是对模型表达能力的不必要的限制,所以这时候去掉参数共享表现反而更好些。
[1] https://github.com/bojone/bert4keras
[2] https://github.com/bojone/bert4keras/blob/master/examples/task_sentiment_albert.py
[3] https://github.com/CLUEbenchmark/CLUE
[4] https://github.com/bojone/bert4keras/blob/master/examples/task_relation_extraction.py
[5] https://github.com/bojone/bert4keras/blob/master/examples/task_reading_comprehension_by_seq2seq.py
点击以下标题查看更多往期内容:
让你的论文被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
📝 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
📬 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。
▽ 点击 | 阅读原文 | 查看作者博客