来自武汉大学、北京航空航天大学和微软亚洲研究院的这项研究为模型压缩提供了新方向。

机器之心报道,参与:魔王。

论文链接:https://arxiv.org/pdf/2002.02925.pdf

这篇论文提出了一种新型模型压缩方法,能够通过逐步模块替换(progressive module replacing)有效地压缩 BERT。该方法首先将原版 BERT 分割成多个模块,并构建更加紧凑的替代模块;然后,用替代模块随机替换原始模块,训练替代模块来模仿原始模块的行为。在训练过程中,研究者逐步增加模块的替换概率,从而实现原始模型与紧凑模型之间的更深层次交互,使得训练过程流畅进行。

与之前用于 BERT 压缩的知识蒸馏方法相比,该方法仅利用一个损失函数和一个超参数,将开发者从调参这一繁琐过程中解放出来。该方法在 GLUE 基准上的性能优于现有的知识蒸馏方法,为模型压缩开启了新方向。

模型压缩方法知多少

随着深度学习的流行,很多巨大的神经模型诞生,并在多个领域中取得当前最优性能。尤其是在自然语言处理(NLP)领域中,预训练和调参已经成为其中大多数任务的新规范。基于 Transformer 的预训练模型在自然语言理解(NLU)和自然语言生成(NLG)领域中成为主流。这些模型从其「过参数化」属性中获益,它们往往包含数百万甚至数十亿个参数,这就使得此类模型计算成本高昂,且从内存消耗和高延迟的角度来看其计算是低效的。这一缺陷极大地阻碍了此类模型在生产环境中的应用。

为了解决该问题,研究者提出很多神经网络压缩技术。一般而言,这些技术可分为三类:量化、权重剪枝和知识蒸馏(KD)。其中,KD 能够压缩预训练语言模型,并因此得到了极大关注。KD 利用大型教师模型「教」紧凑的学生模型模仿教师的行为,从而将教师模型中嵌入的知识迁移到较小的模型中。但是,学生模型的性能状况取决于设计良好的蒸馏损失函数,正是这个函数使得学生模型模仿教师行为。近期关于 KD 的研究甚至利用更复杂的模型特定蒸馏损失函数,以实现更好的性能。

模型压缩新思路——Theseus 压缩

与显式地利用蒸馏损失函数来最小化教师模型与学生模型距离的 KD 不同,该研究提出一种新型模型压缩方法。研究者受到著名哲学思想实验「忒修斯之船」的启发(如果船上的木头逐渐被替换,直到所有的木头都不是原来的木头,那这艘船还是原来的那艘船吗?),提出了 Theseus Compression for BERT (BERT-of-Theseus),该方法逐步将 BERT 的原始模块替换成参数更少的替代模块。研究者将原始模型叫做「前辈」(predecessor),将压缩后的模型叫做「接替者」(successor),分别对应 KD 中的教师和学生。

该方法的工作流程如下图 1 所示:首先为每个前辈模块(即前辈模型中的模块)指定一个替代(接替者)模块;然后在训练阶段中以一定概率用替代模块随机替换对应的前辈模块,并按照新旧模块组合的方式继续训练;模型收敛后,将所有接替者模块组合成接替者模型,进而执行推断。这样,就可以将大型前辈模型压缩成紧凑的接替者模型了。

图 1:BERT-of-Theseus 的工作流程。

Theseus 压缩与 KD 的思路有些类似,都鼓励压缩模型模仿原始模型的行为,但 Theseus 压缩有很多独特的优势。

首先,Theseus 压缩在压缩过程中仅使用任务特定的损失函数。而基于 KD 的方法除了使用任务特定的损失函数外,还把一或多个蒸馏损失函数作为优化目标。Theseus 方法在整个压缩过程中仅使用一个损失函数,从而联结不同的阶段,使压缩以完全端到端的形式进行。此外,为不同任务和数据集选择多个损失函数并平衡每个损失函数的权重,通常是一件耗时费力的事。

其次,与近期研究 [15] 不同,Theseus 压缩不使用 Transformer 特定特征进行压缩,这就为压缩广泛模型提供了可能性。

第三,与 KD 仅使用原始模型执行推断不同,该方法允许前辈模型与压缩后的接替者模型共同训练,从而实现更深层次的梯度级交互,并简化训练过程。此外,混合了前辈模块和接替者模块的不同模块组合添加了额外的正则化项(类似于 Dropout)。该方法还基于课程学习(Curriculum Learning)方法来驱动模块替换,将模块替换概率从低到高逐渐增加,从而实现优异的 BERT 压缩性能。

该研究的贡献如下:

  • 提出新方法 Theseus 压缩。该方法仅使用一个损失函数和一个超参数,为模型压缩提供了新方向。
  • 利用该方法压缩得到的 BERT 模型运算速度是之前的 1.94 倍,并且保留了原始模型超过 98% 的性能,优于其它基于 KD 的压缩基线。

BERT-of-Theseus

接下来,我们来看模块替换和课程学习方法。BERT-of-Theseus 方法的工作流程参见图 1。

在该示例中,研究者将一个 6 层的前辈模型 P = {prd_1, .., prd_3} 压缩成 3 层的接替者模型 S = {scc_1, .., scc_3}。prd_i 和 scc_i 分别包含两个层和一个层。(a) 在模块替换训练阶段,以概率 p 将每个前辈模块 prd_i 替换成对应的接替者模块 scc_i。(b) 在接替者微调和推断阶段,把所有接替者模块 scc_1..3 组合到一起,以执行计算。

图 2:恒定模块替换率和替换调度器的替换曲线。该图用不同灰度表示 Theseus 压缩的两个阶段:1)模块压缩,2)接替者微调。

实验

现在,我们来看 Theseus Compression for BERT 的实验结果。研究者对比了 BERT-of-Theseus 和其它压缩方法,并通过进一步实验来分析结果。

基线

如表 1 所示,研究者对比了新方法与现有方法的层数、参数量、损失函数、外部数据使用和模型无关性。

表 1:不同 BERT 压缩方法的对比。「CE」和「MSE」分别表示交叉熵和均方差,「KD」表示知识蒸馏的损失函数,「CETASK」和「CEMLM」分别表示在下游任务上和在遮蔽语言建模预训练任务中计算得到的交叉熵。其它损失函数参见相关论文。

实验结果

表 2 展示了模型在 GLUE 开发集上的实验结果。研究者将其预测结果提交至 GLUE 测试服务器,得到了官方排行榜结果,详见表 3。

表 2:在 GLUE 开发集上的实验结果。每个数据集下的数字表示数据集中的训练样本数量。
表 3:在 GLUE 服务器测试集上的实验结果。每个数据集下的数字表示数据集中的训练样本数量。

通用模型

作者也提供了一个在 MNLI 上压缩的 6 层继承者模型权重,可供直接微调使用,在 GLUE 上也取得了超过 DistillBERT 的表现。借助 transformers 库可以轻松使用三行代码加载这个模型权重:

from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.frompretrained("canwenxu/BERT-of-Theseus-MNLI") model = AutoModel.frompretrained("canwenxu/BERT-of-Theseus-MNLI")

模型压缩后,研究者在其它句子分类任务上微调接替者模型,并与 DistillBERT 的性能进行对比(参见表 4)。这一通用模型在 MRPC 上实现了同等性能,且在其它句子级任务中的性能显著优于 DistillBERT。

表 4:该研究训练出的通用模型在 GLUE-dev 上的实验结果。

12层的bert参数量_只需一个损失函数、一个超参数即可压缩BERT,MSRA提出模型压缩新方法...相关推荐

  1. bert获得词向量_只需几行 Python 代码,即可用 BERT 玩转词嵌入!

    作者 | Anirudh_S 译者 | Sambodhi 编辑 | 张之栋 AI 前线导读: 在自然语言处理领域中,诞生于 2018 年末的 BERT 非常的"火热".强悍如 BE ...

  2. 性能堪比GPT-3,但参数量仅为0.1%,LMU团队推出NLP最强文本生成模型

    2020-09-24 04:21:08 作者 | 贝爽 编辑 | 陈彩娴 模型越大,性能越佳?不一定. 在NLP领域,谈到超大模型必然想到预训练语言模型GPT-3,自今年3月份对外开放以来,其因超大模 ...

  3. 超参数优化 贝叶斯优化框架_10个超参数优化框架

    超参数优化 贝叶斯优化框架 Tune your Machine Learning models with open-source optimization libraries 使用开源优化库调整机器学 ...

  4. 【超参数寻优】遗传算法(GA) 超参数寻优的python实现

    [超参数寻优]遗传算法(GA) 超参数寻优的python实现 一.遗传算法简介 1.遗传算法由来 2.遗传算法名词概念 3.遗传算法中对染色体的操作 3.1.选择 3.2.交叉 3.3.变异 二.遗传 ...

  5. learnpythonthehardway下载_只需十四步:从零开始掌握Python机器学习(附资源)

    Python 可以说是现在最流行的机器学习语言,而且你也能在网上找到大量的资源.你现在也在考虑从 Python 入门机器学习吗?本教程或许能帮你成功上手,从 0 到 1 掌握 Python 机器学习, ...

  6. 数据流程图顶层一层二层_只需三个公式,三阶魔方超简单入门图文教程5:完全复原第二层...

    大家好,欢迎来到大超小志,上节课我们讲了"复原底层角块",也就是完全复原第一层,今天我们来复原第二层的棱块,也就是完全复原第二层. 第二层的棱块要么在第二层,要么在最顶层. 我们先 ...

  7. lstm代码_只需5行代码!LSTM时间序列建模以及预测

    最近我在github上看到一个项目,项目内容是将深度学习方法(LSTM.RNN.GRU)进行时间序列建模的过程进行了封装,使得调用者调用者只需5行代码能完成时间序列建模以及预测的全过程. 项目本身是使 ...

  8. mysql8.0 密码认证插件_只需使用VS Code的REST客户端插件即可进行API调用

    为什么要离开IDE去测试新的API?现在你不必这样做了. 我们如何获取数据 如果你已经做了很长时间的Web开发,你可能知道我们的很多工作都是围绕着数据展开的:读取数据.写入数据.操作数据,并以合理的方 ...

  9. mysql购物车标设计_只需轻松点两下,人人都会设计的 Logo 图!

    大家周末好,今天跟大家分享一些我近期收藏的帮你制作Logo的几个网站,如大家有需要,可通过如下几个网站进行设计制作哦~ 好了,下面直接进入正题. 1.酷文本图形生成器 介绍:酷文本是一个免费的图形生成 ...

最新文章

  1. Chap 07 HTML建立超链接
  2. 【学习笔记】19、模快(Module)
  3. [转]31个让你变聪明的方法
  4. js网页返回页面顶部的小方法
  5. 给定任意字符串,计算一共能组合成多少个单词bing
  6. Nodejs 中的Get、Post
  7. ftp上传文件夹_ftp同步软件哪个好,ftp同步软件哪个好,6款好用推荐
  8. nodejs 写c++插件的实例
  9. [转载]Magento 店铺多语言设置
  10. 由先序遍历序列和中序遍历序列恢复二叉树以及统计叶子节点个数和树的深度...
  11. 控制台中如何将IE11降级
  12. 命名实体识别NER探索(5) Bert+BiLSTM+CRF模型实战应用
  13. 想让“贾维斯”成为现实?物联网帮你拥有
  14. python中常见的错误提示_python常见异常提示
  15. MRT退休后的HEG(HDF-EOS To GeoTIFF Conversion Tool )工具安装
  16. 6s芯片测试软件,如何简单检测你的苹果使用什么处理器办法
  17. jenkins发送邮件添加附件
  18. 【监控】zabbix
  19. struts2.1.6的bug之空指针(与tomcat安装)
  20. Unbroken——坚不可摧

热门文章

  1. 扩展控件--NumberTextBox
  2. Leetcode--23.合并K个排序链表(Java)
  3. php显示动态通告信息方式,Joomla PHP通知,警告和错误指南
  4. data为long 怎么设置vue_vue基础之data
  5. 给排水规范大全2020_住宅电气、给排水、消防安装工程的质量通病分析
  6. matlab与ie交互
  7. React Native实例
  8. 爬虫教程( 2 ) --- 爬虫框架 Scrapy、Scrapy 实战
  9. mysql rpm 启动_MySQL安装(rpm)和启动配置
  10. MagicRecord For IOS 简介