BERT-of-Theseus

news/2024/5/18 16:01:01/文章来源:https://blog.csdn.net/qq_37236745/article/details/128133118

最近了解到一种称为"BERT-of-Theseus"的BERT模型压缩方法,源自论文《BERT-of-Theseus: Compressing BERT by Progressive Module Replacing》。这是一种以"可替换性"为出发点所构建的模型压缩方案,相比常规的剪枝、蒸馏等手段,它整个流程显得更为优雅、简洁

模型压缩

简单来说,模型压缩就是"简化大模型,得到推理速度更快的小模型"。当然,一般来说模型压缩是有一定牺牲的,比如最后的评测指标会有一定的下降,毕竟"更好又更快"的免费午餐是很少的,所以选择模型压缩的前提是能允许一定的精度损失。其次,模型压缩的梯度通常只体现在预测(Inference)阶段,换句话说,它通常需要花费更长的训练时间,所以如果你的瓶颈是训练时间,那么模型压缩也不适合你

模型压缩要花费更长时间的原因是它需要"先训练大模型,再压缩为小模型"。读者可能会疑惑:为什么不直接训练一个小模型?答案是目前很多实验已经表明,先训练大模型再压缩,相比直接训练一个小模型,最后的精度通常会更高一些。也就是说,在推理速度一样的情况下,压缩得到的模型更优一些,相关探讨可以参考论文《Train Large, Then Compress: Rethinking Model Size for Efficient Training and Inference of Transformers》,另外知乎上也有讨论《为什么要压缩模型,而不是直接训练一个小的CNN?》

常见手段

常见的模型压缩技术可以分为两大类:

  1. 直接简化大模型得到小模型
  2. 借助大模型重新训练小模型

这两种手段的共同点是都要先训练出一个效果比较好的大模型,然后再做后续操作

第一类的代表方法是剪枝(Pruning)量化(Quantization)。剪枝,顾名思义,就是试图删减掉原来大模型的一些组件,使其变为一个小模型,同时使得模型效果在可接受的范围内;至于量化,指的是不改变原模型的结构,但将模型换一种数值格式,同时也不严重降低效果,通常我们建立和训练模型用的是float32类型,而换成float16类型就能提速且省显存,如果能进一步转换成8位整数甚至2位整数,那么提速省显存的效果将会更加明显

第二类的代表方法是蒸馏(Distillation)。蒸馏的基本想法是将大模型的输出当作小模型训练时的标签来用,以分类问题为例,实际的标签是one-hot形式的,大模型的输出(比如logits)则包含更丰富的信号,所以小模型能从中学习到更好的特征。除了学习大模型的输出之外,很多时候为了更近一步提升效果,还需要小模型学习大模型的中间层结果、Attention矩阵等,所以一个好的蒸馏过程通常涉及到多项loss,如何合理地涉及这些loss以及调整这些loss的权重,是蒸馏领域的研究主题之一


从左到右分别为:剪枝、量化、蒸馏

Theseus

本文将要介绍的模型压缩方法称为"BERT-of-Theseus",属于上面说的两大类模型压缩方法的第二类,也就是说它也是借助大模型来训练小模型,只不过它是基于模块的可替换性来设计的

BERT-of-Theseus的命名源于思想实验"忒修斯之船":如果忒修斯船上的木板被逐渐替换,直到所有的模板都不再是原来的木板,那这艘船还是原来的那艘船吗?

核心思想

前面说到,用蒸馏做模型压缩时,往往不仅希望小模型的的输出跟大模型的输出对齐,还希望中间层结果也对齐。"对齐"意味着什么呢?意味着可替换!所以BERT-of-Theseus的思想就是:干嘛要煞费苦心地通过添加各种loss去实现可替换性呢?直接用小模型的模块去替换掉大模型的模块然后训练不就好了吗?

举个实际的例子:

假设现在有A、B两支球队,每支各五人。A球队属于王者球队,实力超群;B球队则是青铜球队,待训练。为了训练B球队,我们从B球队中选1人,替换掉A球队中的1人,然后让这个"4+1"的A球队不断的练习、比赛。经过一段时间,新加入的成员实力会提升,这个"4+1"的球队就拥有接近原始A球队的实力。重复这个过程,直到B球队的人都被充分训练,那么最终B球队的人也能自己组成一支实力突出的球队。相比之下,如果一开始就只有B球队,只是B球队的人自己训练、比赛,那么就算他们的实力逐渐提升,但由于没有实力超群的A球队帮助,其最终实力也不一定能突出

流程细节

回到BERT的压缩,现在假设有一个6层预训练好的BERT,我们直接用它在下游任务上微调,得到一个效果还不错的模型,称之为Predecessor(前辈);现在我们的目的是得到一个3层的BERT,并且这个它在下游任务中的效果接近Predecessor,至少比直接拿BERT的前3层去微调要好(否则就白费力气了),这个小模型我们称为Successor(传承者)。那么BERT-of-Theseus是怎么实现这一点的呢?如下图(右)


Predecessor和Successor模型示意图(左)
BERT-of-Theseus训练过程示意图(右)

在BERT-of-Theseus的整个流程中,Predecessor的权重都被固定住,6层的Predecessor被分为3个模块,与Successor的3层模型一一对应。训练的时候,随机用Successor层替换掉Predecessor的对应模块,然后直接用下游任务的优化目标进行微调(只训练Successor的层)。训练充分后,再把整个Successor单独分离出来,继续在下游任务中微调一会儿,直到验证集指标不再上升

在实现的时候,事实上是类似Dropout的过程,同时执行Predecessor和Successor模型,并将两者对应模块的输出之一置零,然后求和、送如下一层中,即
ε(l)∼U({0,1})x(l)=xp(l)×ε(l)+xs(l)×(1−ε(l))xp(l+1)=Fp(l+1)(x(l))xs(l+1)=Fs(l+1)(x(l))(1)\begin{aligned} &\varepsilon^{(l)}\sim U(\{0, 1\})\\ &x^{(l)} = x_p^{(l)} \times \varepsilon^{(l)} + x_s^{(l)} \times \left(1 - \varepsilon^{(l)}\right)\\ &x_p^{(l+1)} = F_p^{(l+1)}\left(x^{(l)}\right)\\ &x_s^{(l+1)} = F_s^{(l+1)}\left(x^{(l)}\right) \end{aligned}\tag{1} ε(l)U({0,1})x(l)=xp(l)×ε(l)+xs(l)×(1ε(l))xp(l+1)=Fp(l+1)(x(l))xs(l+1)=Fs(l+1)(x(l))(1)
由于ε\varepsilonε非0即1(不做调整,各自0.5的概率随机效果就挺不错了),所以每个分支其实就相当于只有一个模块被选择到。由于每次的置零都是随机的,因此训练足够多的步数后,Successor的每层都能被训练好

方法分析

与蒸馏相比,BERT-of-Theseus有什么优势呢?首先,这既然能被发表出来,所以至少效果应该是不相上下的,所以我们就不去比较效果了,而是比较方法本身。很明显,BERT-of-Theseus的主要特点是:简洁

前面说到,蒸馏多数时候需要匹配中间层的输出,这时涉及到的训练目标就有很多了:下游任务loss、中间层输出loss、相关矩阵loss、Attention矩阵loss等等,想要平衡这些loss本身就是一件头疼的事情。相比之下,BERT-of-Theseus直接通过替换这个操作,逼着Successor能有跟Predecessor类似的输出,而最终的训练目标就只有下游任务loss,不可谓不简洁。此外,BERT-of-Theseus还有一个特别的优势:很多的蒸馏方法都得同时作用于预训练和微调阶段,效果才比较突出,而BERT-of-Theseus直接作用于下游任务的微调,就可以得到相媲美的效果。这个优势在算法上体现不出来,属于实验结论

ε\varepsilonε一定要非0即1吗?任意0~1的随机数行不?或者说不随机,直接让ε\varepsilonε慢慢地从1变到0行不?这些想法都还没有经过充分实验,有兴趣的读者可以自行实验

实验效果

原作者们开源了自己的PyTorch实现 JetRunner/BERT-of-Theseus,知乎用户邱震宇也分享了自己的讲解以及基于原本BERT的Tensorflow实现qiufengyuyi/bert-of-theseus-tf。原论文的效果大家就自己去看原论文了,这里po出苏剑林大佬在CLUE的iflytek数据集中的实验结果:
直接微调BERT-of-Theseus层数效果完整12层前6层前3层60.11%58.99%57.96%6层3层59.61%59.36%\begin{array}{c|c|c} \hline & \text{直接微调} & \text{BERT-of-Theseus}\\ \hline \begin{array}{c}\text{层数} \\ \text{效果}\end{array} & \begin{array}{ccc}\text{完整12层} & \text{前6层} & \text{前3层} \\ 60.11\% & 58.99\% & 57.96\%\end{array} & \begin{array}{cc}\text{6层} & \text{3层} \\ 59.61\% & 59.36\% \end{array}\\ \hline \end{array} 层数效果直接微调完整1260.11%658.99%357.96%BERT-of-Theseus659.61%359.36%
可以看到,相比直接拿前几层微调,BERT-of-Theseus确实能带来一定的性能提升。对于随机置零方案,除了均等概率选择0/1外,原论文还尝试了其他策略,有轻微提升,但会引入额外超参

另外,对于蒸馏来说,如果Succesor跟Predecessor有同样的结果(同模型蒸馏),那么通常来说Successor的最终性能比Predecessor还要好些,BERT-of-Theseus有没有这一特点呢?苏剑林大佬的实验发现结论好似否定的,也就是同模型情况下BERT-of-Theseus训练出来的Successor并没有Predecessor好,所以看来BERT-of-Theseus虽好,但也不能完全取代蒸馏

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

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

相关文章

streptavidin-PEG-6-FAM 链霉亲和素-聚乙二醇-6-羧甲基荧光素

产品名称:链霉亲和素-聚乙二醇-6-羧甲基荧光素 英文名称:streptavidin-PEG-6-FAM 纯度:95% 存储条件:-20C,避光,避湿 外观:固体或粘性液体,取决于分子量 PEG分子量可选:350、550、75…

自助建站工具

每用一次自助建站工具,就有一个程序员失业。 作为企业老板的你,要为公司的获客,企业推广发愁,但是预算有限,招人也很困难,不仅要面试程序员,后续还要检验这个程序员的功力,实在是太…

谷歌浏览器

引言:众所周知,一个好的浏览器可以提高我们的工作效率,那么今天教大家如何安装超 nice 的浏览器 —— 谷歌浏览器 文章目录一、安装谷歌浏览器二、修改谷歌浏览器搜索引擎三、修改谷歌浏览器默认下载位置一、安装谷歌浏览器 打开&#x1f5b…

GJB 5000B二级-II实施基础

本实践域为新增实践域   思想:以GJB5000A的共用过程域中不乏实践为基础进行提炼并提升,结合各个行业的优秀实践和行业特点,坚持问题导向,使标准更具有指导性和可操作性;充分借鉴GJB9001C中:“4组织环境”、“7支持”的相关内容,形成实施基础实践域。本实践域强调突出重…

0111 栈与队列Day1

剑指offer09.用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1&#x…

Java ArrayLIst与顺序表

什么是集合类? Java当中的集合类,其实就是封装号的数据结构 原始的数据结构——>Java当中封装成的集合对应的那个原始的数据结构——>用Java封装的集合对应的。 集合类所在的包:java.util这个包底下 顺序表的底层是一个数组&#xff0…

结构力学常用公式表,早晚用得到!

来源:360个人图书馆 常用截面几何与力学特征表​​​​​​​ 注: I 称为截面对主轴(形心轴)的截面惯性矩 (mm4)。基本计算公式如下: W称为截面抵抗矩 (mm),它表示截面抵抗弯曲变形能力的大小&#xff0c…

皕杰报表之隐藏处理

第一步,新建报表,然后新建参数 参数type设置成中文描述为统计类型、数据类型为字符串。 参数year设置成中文描述为年、数据类型为日期、时间日期格式为yyyy。 参数month设置成中文描述为月、数据类型为日期、时间日期格式为MM。 参数day设置成中文描…

python安全工具开发笔记(三)——python 多线程

一、Python线程和进程 进程 进程是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈及其它记录其运行轨迹的辅助数据。 线程 所有的线程运行在同一个进程当中,共享相同的运行环境。线程有开始顺序执行和结束三个部分。 帮助理解: 1、计算…

VM系列振弦采集模块传感器激励方法

VM系列振弦采集模块传感器激励方法 通过修改寄存器 EX_METH.[3:0]来完成激励方法的选择, EX_METH[4]用于设置是否忽略传感器的接入检测而强制发送激励信号。 高压脉冲激励法 高压脉冲激励法 HPM( High Voltage Pulse Excitation Method)。 向…

桌面画图工具:Pointofix(fertig)

Pointofix桌面画图工具 Pointofix - der virtuelle Textmarker fr Ihren Bildschirm - Freeware 一、软件下载 官方网址https://www.pointofix.de/ 二、进入下载页面,需要下载安装文件和语言包两个文件 三、网站还提供了一个语言设置小程序,但我没用 …

教师如何创建百度百科词条?这篇带你了解

互联网时代,如果你是小有名气的人物,或是某个领域的专家,对于社会有一定的贡献或是影响力,就可以在百度上搜到一个你的专属词条。 百度百科词条就是个人的一张网络名片,人物的一些基本信息、生平事迹、代表作品、所获…

mac下安装nodejs跟vscode

1.打开官网 Node.js 2.点击下载 3.下载完成,根据提示下一步安装,安装完成后,在vscode中新建一个js文件,执行node test.js

基于STM32单片机的篮球计时记分器proteus仿真原理图PCB

功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示比赛剩余时间,球队分数 2.默认计时器为4节,每节10分钟,每节比赛结束,蜂鸣器报警 3.按键功能介绍: 1’键——加1分 4’键——减1分 2’键——加2分 5’键—…

[附源码]计算机毕业设计springboot人体健康管理app

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

静态路由配置案例

静态路由配置案例配置静态路由原理命令:案例:最后结果:配置静态路由原理命令: [Huawei]ip route-static 来源ip 子网掩码 去向ip [Huawei]ip route-static 192.168.20.1 255.255.255.0 192.168.1.2 案例: pc1,pc2,a…

MySQL数据库实现主从复制,docker实现版

我这里是在同一台电脑上使用docker实现的主从复制,在物理机上整体思路是一致的 预备工作:安装好docker 使用docker运行MySQL 拉取MySQL镜像 docker pull mysql:5.7运行mysql master容器 sudo docker run -p 33061:3306 --name mysql-master-v /myda…

Docker with IPV6

1、绪论 在 Docker 容器或群服务中使用 IPv6 之前,您需要在 Docker 守护进程中启用 IPv6 支持。之后,您可以选择对任何容器、服务或网络使用 IPv4 或 IPv6(或两者) 2、配置默认 Docker IPv6 注意:IPv6 网络仅在 Lin…

揭秘你代理商做不起来货卖不出去的原因,探讨其背后的商业逻辑

现在很多代理商,大都是可以归于“个体户”性质。这些也代表了微小型企业,从前期的蓬勃发展,到现在的经营受限,特别是疫情等影响,很多人的经营都处于举步维艰的状态,如果你们现在是代理商,仓库里…

【Ubuntu】修改ubuntu和windows双系统启动顺序

目录一、问题描述二、背景知识1. GRUB是什么2. GRUB配置文件3./etc/default/grub 主配置文件二、问题分析三、解决方案1. 修改grub主配置文件2. 更新grub配置文件一、问题描述 UbuntuWindows双系统默认使用GRUB作为引导管理器,而且通常默认启动Ubuntu。这样过于死板…