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

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

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

6fba6232109c23fcf59c55acf5112d0f.png

论文链接: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 所示:首先为每个前辈模块(即前辈模型中的模块)指定一个替代(接替者)模块;然后在训练阶段中以一定概率用替代模块随机替换对应的前辈模块,并按照新旧模块组合的方式继续训练;模型收敛后,将所有接替者模块组合成接替者模型,进而执行推断。这样,就可以将大型前辈模型压缩成紧凑的接替者模型了。

47508fcb6f4f9075ae99e4746afc304c.png
图 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 组合到一起,以执行计算。

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

实验

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

基线

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

4115bc9cec07e6937460b630d7d600dc.png

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

实验结果

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

69cbabefbe2d4fb98f95c44d2cd2350a.png
表 2:在 GLUE 开发集上的实验结果。每个数据集下的数字表示数据集中的训练样本数量。

b545c446f092c2e394ac6620ed1ee5b0.png
表 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。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的Java快捷键有哪些

不知道Java常用的快捷键在工作的时候是非常的耽误时间的,本篇文章小编就为大家稍微整理了一些常用的Java快捷键分享给大家。 Ctrl1或F2快速修复 CtrlD快捷删除行 ShiftEnter 快速切换到下一行,在本行的任何位置都可 CtrlF11快速运行代码 Alt上下键 快速移…

bootstrap文件不能被识别_如何使用npm安装bootstrap

经过我好多次的查询和实验,总结了一下在vue项目中使用bootstrap框架,npm安装注意。bootstrap中js插件依赖于jquery,所以在这之前必须安装jquery。jquery安装1、在package.json中添加一行代码:“jquery”: “^2.2.3”"depende…

hm编码工具使用_HM集团旗下最高端品牌ARKET将进驻中国,带你看看真正的“北欧风”...

HM集团旗下最高端的品牌ARKET近日开通了微博,并宣布将在秋季进驻天猫。听到这个消息,钟爱ARKET且一直私心将它当成小众品牌好好藏着的人可能会欢呼——终于不用等待漫长的海购了!但也有相当一部分朋友一脸问号——ARKET?是啥&…

Java8特性解决空指针问题

在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示: 在这种情况下,有如下代码 这种写法,在user为null时&#x…

模拟进程创建、终止、阻塞、唤醒原语_操作系统第二章--进程的描述与控制

操作系统第二章--进程的描述与控制前趋图和程序执行前趋图前趋图是一个有向无循环图DAG,用来描述进程之间执行的前后关系初始结点:没有前趋的结点终止结点:没有后继的结点重量:表示该结点所含有的程序量或结点的执行时间程序执行顺…

对没有标记为安全的activex控件进行初始化和脚本运行_RASP攻防 —— RASP安全应用与局限性浅析...

文|【腾讯安全平台部数据安全团队】 qiye & baz 前言随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求。在2012年的时候,Gartner引入了“Runtime application self-protection”一词&#x…

java中堆和栈有什么区别?

堆和栈都是Java用来在RAM中存放数据的地方。 一、堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。 (2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译…

台式机dp接口_精品导购:你想要的商务台式机 都在这里了!

不少公司都会为员工配备办公电脑,而公司在采购这些电脑时,兴许可能对电脑性能、存储容量等都没有研究过,只是图了价格便宜便批量采购,这就导致电脑在使用一段时间后,会频繁出现死机、运行卡顿和硬盘容量不够等情况的发…

roc曲线怎么绘制_ROC曲线和PR曲线

在机器学习中,ROC曲线被广泛应用于二分类问题中来评估分类器的可信度,当处理一些高度不均衡的数据集时,PR曲线能表现出更多的信息。在二分类问题中,分类器将一个实例的分类标记为正例还是负例,这可以用一个混淆矩阵来表…

华三交换机路由器图标_弱电箱网口不够用,用华三8口千兆交换机搞定

如题,公司租的办公室刚装修完,安了弱电箱,无奈联通只给了一个2口的光猫,如何不自己花钱买光猫的前提下,分配三间屋子的五个有线成了问题。之前考虑过直接路由器内置在弱电箱里,不过电箱金属盒有屏蔽和弱电箱…

i2c hid 触摸板不能用_零基础学硬件(6):I2C总线的用处

I2C总线的用处,什么时候需要用I2C总线这东西太简单了,我还有点不想说..不就是一个start一个STOP一个ACK嘛,,简单得不能在简单.他可以根据器件地址进行通信..当年在学校时看了很多这资料..什么时候需要用I2C总线,你的器件是IIC的器件,我就得用IIC总线..什…

problem a: 简单的整数排序_python里的排序

本篇文章主要讲:自定义规则排序 多字段排序开讲之前,先讲一些简单sorted()或者sort(),两者返回值不同!例如:sorted([5, 2, 3, 1, 4]) # 输出:[1, 2, 3, 4, 5]另一个呢a [5, 2, 3, 1, 4] a.sort() a # 输出…

c++ 多态 运行时多态和编译时多态_C++核心编程 第十一节 多态

前言:多态是C面向对象三大特性之一。多态,指的是一个类实例的相同方法在不同情形有不同表现形式。具有不同内部结构的对象可以共享外部接口。C多态就是用一个更通用的基类指针指向不同的子类实例,为了能调用正确的方法,我们需要用…

多线程操作时操作系统时间片_从零开始自制操作系统(15):内核多线程

1.多线程原理:(1)概述:多线程是指CPU可以在一段时间中并行执行多个程序,比如我们可以一边听音乐、一边写代码(这两个程序可以“同时进行”,我们称之为多进程,而多进程实现的本质就是…

打开git界面_使用 Gitea 快速搭建私有 Git 版本控制服务

1. 前言分布式版本控制工具 Git 已经是现代软件源代码版本控制首选方案之一。公有 Git 服务提供商 国外知名如 GitHub 国内网络延迟高,Gitlab 涉嫌对中国的歧视不推荐。国内有 Gitee、Coding 生态还不错。但是一般公司的源代码除非开源项目是不会放在公有 Git 服务上的。所以我…

dev项目属性按钮是灰色_Spring Boot 中的项目属性配置

阅读本文约需要5分钟大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了Spring Boot 如何使用 SLF4J 进行日志记录,今天跟大家分享一下 Spring Boot 中的项…

diskgenius扩容c盘重启电脑卡住_电脑开机显示:reboot and select proper boot device怎么办?...

今天就碰到有一个知友问,自己电脑开机就提示:reboot and select proper boot device,整个人都懵了,不知道怎么办?其实对于电脑出现问题,大家不要着急,坚哥就来为大家分析下原因以及试着去解决。第一种原因…

大并发下程序出错_Python并发编程理论篇

前言其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住一个点: 并发编程永远的宗旨就是提高程序的运行效率&am…

月薪30K程序员花了一个小时,用c++做出经典扫雷游戏 !

上次发过一个俄罗斯方块的游戏源码,由于是通过Easy X实现的,但是很多和我一样的新手,一开始不知道Easy X是什么,到时源码拿过去之后,运行报错,我这次发的扫雷, 也是通过Easy X实现,…

用python写web网页_从零开始,使用python快速开发web站点(1) | 学步园

环境:ubuntu 12.04 python版本: 2.73 ok,首先,既然是从零开始,我们需要的是一台可以运行的python的计算机环境,并且假设你已经安装好了python, 然后,既然是快速开发,必不可少的需要用到框架,py…