B站:https://space.bilibili.com/181990557

MENU

ALBERT详解

August 18, 2020 • Read: 273 • Deep Learning阅读设置

BERT的问题

BERT 发布后,在排行榜上产生了许多 NLP 任务的最新成果。但是,模型非常大,导致了一些问题。"ALBERT"论文将这些问题分为两类:

内存限制

考虑一个包含一个输入节点,两个隐藏节点和一个输出节点的简单神经网络。即使是这样一个简单的神经网络,由于每个节点有权重和偏差,因此总共有7个参数需要学习

BERT-large是一个复杂的模型,它有24个隐藏层,在前馈网络和多头注意力机制中有很多节点,总共有3.4亿个参数,如果想要从零开始训练,需要花费大量的计算资源

模型退化

最近在NLP领域的研究趋势是使用越来越大的模型,以获得更好的性能。ALBERT的研究表明,无脑堆叠模型参数可能导致效果降低

在论文中,作者做了一个有趣的实验

如果更大的模型可以带来更好的性能,为什么不将最大的 BERT 模型(BERT-large)的隐含层单元增加一倍,从 1024 个单元增加到 2048 个单元呢?

他们称之为"BERT-xlarge"。令人惊讶的是,无论是在语言建模任务还是阅读理解测试(RACE)中,这个更大的模型的表现都不如BERT-large

从原文给出的图中(下图),我们可以看到性能是如何下降的

ALBERT

概述

ALBERT利用了参数共享、矩阵分解等技术大大减少了模型参数,用SOP(Sentence Order Prediction) Loss取代NSP(Next Sentence Prediction) Loss提升了下游任务的表现。但是ALBERT的层数并未减少,因此推理时间(Inference Time)还是没有得到改进。不过参数减少的确使得训练变快,同时ALBERT可以扩展到比BERT更大的模型(ALBERT-xxlarge),因此能得到更好的表现

ALBERT的结构和BERT基本一样,采用了Transformer以及GELU激活函数。具体的创新部分有三个:

  1. embedding层参数因式分解
  2. 跨层参数共享
  3. 将NSP任务改为SOP任务

前两个改进的主要作用是减少参数。第三个改进其实算不上什么创新了,因为之前已经有很多工作发现BERT中NSP任务并没有什么积极的影响

Factorized Embedding Parameterization

原始的BERT模型以及各种依据Transformer的预训连语言模型都有一个共同特点,即$E=H$,其中$E$指的是Embedding Dimension,$H$指的是Hidden Dimension。这就会导致一个问题,当提升Hidden Dimension时,Embedding Dimension也需要提升,最终会导致参数量呈平方级的增加。所以ALBERT的作者将$E$和$H$进行解绑,具体的操作就是在Embedding后面加入一个矩阵进行维度变换。$E$的维度是不变的,如果$H$增大了,我们只需要在E后面进行一个升维操作即可

所以,ALBERT不直接将原本的one-hot向量映射到hidden space size of $H$,而是分解成两个矩阵,原本参数数量为$V*H$,$V$表示的是Vocab Size。分解成两步则减少为$V*E+E*H$,当$H$的值很大时,这样的做法能够大幅降低参数数量

$V*H=30000*768=23,040,000$

$V*E+E*H=30000*256+256*768=7,876,608$

举个例子,当$V$为30000,$H$为768,$E$为256时,参数量从2300万降低到780万

通过因式分解Embedding的实验可以看出,对于参数不共享的版本,随着$E$的增大,效果是不断提升的。但是参数共享的版本似乎不是这样,$E$最大并不是效果最好。同时也能发现参数共享对于效果可能带来1-2个点的下降

Cross-Layer Parameter Sharing

传统Transformer的每一层参数都是独立的,包括各层的self-attention、全连接。这样就导致层数增加时,参数量也会明显上升。之前有工作试过单独将self-attention或者全连接层进行共享,都取得了一些效果。ALBERT作者尝试将所有层的参数进行共享,相当于只学习第一层的参数,并在剩下的所有层中重用该层的参数,而不是每个层都学习不同的参数

同时作者通过实验还发现了,使用参数共享可以有效的提升模型稳定性,实验结果如下图

BERT-base和ALBERT使用相同的层数以及768个隐藏单元,结果BERT-base共有1.1亿个参数,而ALBERT只有3100万个参数。通过实验发现,feed-forward层的参数共享会对精度产生比较大的影响;共享注意力参数的影响是最小的

Sentence-Order Prediciton (SOP)

BERT引入了一个叫做下一个句子预测的二分类问题。这是专门为提高使用句子对,如"自然语言推理"的下游任务的性能而创建的。但是像RoBERTa和XLNet这样的论文已经阐明了NSP的无效性,并且发现它对下游任务的影响是不可靠的

因此,ALBERT提出了另一个任务——句子顺序预测。关键思想是:

  • 从同一个文档中取两个连续的句子作为一个正样本
  • 交换这两个句子的顺序,并使用它作为一个负样本

SOP提高了下游多种任务(SQUAD,MNLI,SST-2,RACE)的表现

Adding Data & Remove Dropout

以上ALBERT都是使用跟BERT相同的训练数据。但是增加训练数据或许可以提升模型的表现,于是ALBERT加上STORIES Dataset后总共训练了157G的数据。另外,训练到1M步的时候,模型还没有对训练集Overfit,所以作者直接把Dropout移除,最终在MLM验证集上的效果得到了大幅提升

Conclusion

刚开始看这篇文章是很惊喜的,因为它直接把同等量级的BERT缩小了10+倍,让普通用户有了运行可能。但是仔细看了实验后才发现参数量的减小是需要付出代价的

需要注意的是,Speedup是训练时间而不是Inference时间。Inference时间并未得到改善,因为即使是使用了共享参数机制,还是得跑完12层Encoder,故Inference时间跟BERT是差不多的

实验用的参数如下

可以得出的结论是:

  1. 在相同的训练时间下,ALBERT得到的效果确实比BERT好
  2. 在相同的Inference时间下,ALBERT base和large的效果都没有BERT好,而且差了2-3个点,作者在最后也提到了会继续寻找提高速度的方法(Sparse attention和Block attention)

另外,结合Universal Transformer可以想到的是,在训练和Inference阶段可以动态地调整Transformer层数(告别12、24、48的配置)。同时可以想办法去避免纯参数共享带来的效果下降,毕竟Transformer中越深层学到的任务相关信息越多,可以改进Transformer模块,加入记忆单元、每层个性化的Embedding

Reference

Archives Tip
QR Code for this page
Tipping QR Code