BERT-of-Theseus

news2024/12/23 18:23:41

最近了解到一种称为"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 ) = x p ( l ) × ε ( l ) + x s ( l ) × ( 1 − ε ( l ) ) x p ( l + 1 ) = F p ( l + 1 ) ( x ( l ) ) x s ( l + 1 ) = F s ( 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.coloradmin.cn/o/51346.html

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

相关文章

【特征选择】基于教与学算法实现二进制特征选择问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

第二证券|汽车板块现涨停潮!多只地产债再涨到临停

在昨日大幅上涨后,今日上午A股商场持续上行,不过涨势放缓,到上午收盘,上证指数上涨0.21%。 昨日带动大市上行的地产板块今日上午涨势减缓,包含福星股份、世茂股份在内的多只地产股涨停。不过也有极少数地产股逆势跌落&…

容器化应用系统上生产的最佳实践

前言 最近忙的要死, 👻👻👻. 上一周来了一次比 996 更猛的 907. 这周二终于有点遭不住了, 调休一天, 稍微歇息一下. 同时手痒的不行, 把筹备了好久的重磅文章发上来哈哈. 😆😆😆 不过时间还是有点仓促, …

自动化测试的生命周期是什么?

软件测试发展到今日,已经逐渐标准化且能力更强,其流程每天都在发展。测试人员的技术熟练程度对于整个测试阶段的成功来说至关重要。测试不再意味着仅仅发现错误;它的范围已经扩大,从任何开发项目开始就可以看出它的重要性。 当谈论…

[SpringMVC]第三篇:作用域传参

四大域: PageContext对象(不常用) 作用域范围:当前jsp页面内有效 request对象(经常用) 作用域范围:一次请求内。 作用: 解决了一次请求内的资源的数据共享问题 session对象(登录,会话时会用) 作用域范围:一次会话内有效。 说明:浏览器不关闭,并且后台的session不失效&#xff…

Python OpenCV 单目相机标定、坐标转换相关代码

前言 本文不讲原理,只关注代码,有很多博客是讲原理的,但是代码最多到畸变矫正就结束了,实际上就是到 OpenCV 官方示例涉及的部分。   在官方示例中使用黑白棋盘格求解了相机的内外参和畸变系数,并对图像做了畸变矫正…

【Android App】集成腾讯地图显示位置和地图面板讲解及实战(附源码和演示 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、集成腾讯地图 之所以选用腾讯地图来讲解,是因为它的集成过程相对简单,无须通过App的签名鉴权,腾讯地图的开放平台网址为 腾讯地图 集成腾讯地图分为以下几步 (1)在…

Linux网络基础------TCP/UDP协议

文章目录TCP和UDP的宏观认识UDP协议TCP协议 (绝对的核心重点)tcp协议报头各个字段的详解tcp协议的机制超时重传机制连接管理机制3次握手4次挥手滑动窗口流量控制拥塞控制延迟应答捎带应答粘包问题TCP和UDP的宏观认识 首先, TCP/UDP是位于传输…

元宇宙竟然也难逃性骚扰???

当我们还沉浸在元宇宙里种种美妙的虚拟体验之时,竟接连传出 “虚拟性骚扰” (virtual assault)……去年 12 月,Metaverse Research 的联合创始人 Nina Jane Patel,在自己的 Blog 记录下她参与 Meta 元宇宙游戏《地平线…

学习响应式布局

针对性内容 页面设计在不同设备的显示情况布局只会使用float定位,而不会掌握flex不能很好的使用rem作为设计单位掌握响应式布局、弹性等常见布局 学习内容 css中媒体查询的作用和使用方法flex弹性盒子的用法rem的作用和使用方法目录 针对性内容 学习内容 Media…

第8章 自定义SwaggerIndex页与登录页

“Blog.Core-master”程序没有使用.Net7框架内置的index.html页对api方法进行渲染显示,而是通过对“Swagger”和“SwaggerUI”内置中间件的自定义操作,调用根目录下的自定义index.html页对api方法进行渲染显示。 1、自定义“Swagger”和“SwaggerUI”内…

[附源码]Python计算机毕业设计Django付费自习室管理小程序

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

vue项目使用elementui上传组件 打包后报错t.upload.addEventListener is not a function的解决方案

今天和大家分享一个报错的解决方案 背景 项目打包部署到宝塔上后,打开网页,上传东西时出现了一个报错,但是在本地开发环境是没有问题的。 报错内容: 这个问题是因为mockjs改动了axios里面XMLHttpRequest对象从而导致报错。 解…

Java医院信息管理系统源码带文字安装教程

技术架构 技术框架:springboot shiro layui jquery thymeleaf nginx 运行环境:jdk8 mysql IntelliJ IDEA maven 宝塔面板 文字安装教程 下载源码,创建一个数据库,导入hospitaldata.sql文件至数据库中。 使用IDEA打开hosp…

Kotlin高仿微信-第29篇-朋友圈-发布作品(图片)

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

GmNAC181促进结瘤并提高根瘤的耐盐性

文章信息 题目:GmNAC181 promotes symbiotic nodulation and salt tolerance of nodulation by directly regulating GmNINa expression in soybean 刊名:New Phytologist 作者:Xiaodi Wang,Youning Wang, Xia Li et al. 单位…

2022年NPDP新版教材知识集锦--【第四章节】(5)

《产品经理认证(NPDP)知识体系指南(第2版)》已于2022年4月正式上架发行,新版教材自2022年11月NPDP考试起使用。将新版NPDP教材中的相关知识点进行了整理汇总,包括详细设计与规格阶段相关内容,快来看看吧。 【详细设计与规格阶段】(全部获取文…

HCIP-路由01:路由基础

路由基础一 自治系统(AS)二. 入表(路由表)规则2.1 priority2.2 metric三. 选路规则(掩码最长匹配原则)四. 路由的负载分担五. 路由备份(浮动路由)六. 路由黑洞七. 路由黑洞的解决方法…

export default 和 export之间的区别

🎈 export default 和 export 有什么区别: export 、export default,都属于ES6里面的语法 1. export与export default均可用于导出常量、函数、文件、模块等 2. 你可以在其它文件或模块中通过import(常量 | 函数 | 文件 | 模块)名的方式&a…

03【Controller方法返回值详解】

文章目录三、Controller方法返回值详解3.1 返回普通字符串3.1.1 跳转3.1.2 设置视图解析器3.2 返回ModelAndView3.2.1 普通视图3.2.2 RedirectView3.3 返回特殊字符串3.4 返回void三、Controller方法返回值详解 3.1 返回普通字符串 3.1.1 跳转 package com.dfbz.controller;…