前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ALBERT详解

ALBERT详解

作者头像
mathor
发布2020-08-19 15:41:10
2.4K0
发布2020-08-19 15:41:10
举报
文章被收录于专栏:mathormathor

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的作者将EH进行解绑,具体的操作就是在Embedding后面加入一个矩阵进行维度变换。E的维度是不变的,如果H增大了,我们只需要在E后面进行一个升维操作即可

所以,ALBERT不直接将原本的one-hot向量映射到hidden space size of H,而是分解成两个矩阵,原本参数数量为V*HV表示的是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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BERT的问题
    • 内存限制
      • 模型退化
      • ALBERT
        • 概述
          • Factorized Embedding Parameterization
            • Cross-Layer Parameter Sharing
              • Sentence-Order Prediciton (SOP)
                • Adding Data & Remove Dropout
                  • Conclusion
                  • Reference
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档