©PaperWeekly 原创 · 作者|苏剑林

学校|追一科技

研究方向|NLP、神经网络

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

论文标题:BERT-of-Theseus: Compressing BERT by Progressive Module Replacing

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

本文将对该方法做一个简要的介绍,给出一个基于 bert4keras [1] 的实现,并验证它的有效性。

▲ BERT-of-Theseus,原作配图

模型压缩

首先,我们简要介绍一下模型压缩。不过由于笔者并非专门做模型压缩的,也没有经过特别系统的调研,所以该介绍可能显得不专业,请读者理解。

1.1 基本概念

简单来说,模型压缩就是“简化大模型,得到推理速度更快的小模型”。当然,一般来说模型压缩是有一定牺牲的,比如最明显的是最后的评测指标会有一定的下降,毕竟“更好又更快”的免费午餐是很少的,所以选择模型压缩的前提是能允许一定的精度损失。

其次,模型压缩的提速通常只体现在预测阶段,换句话说,它通常需要花费更长的训练时间,所以如果你的瓶颈是训练时间,那么模型压缩也不适合你。

模型压缩要花费更长时间的原因是它需要“先训练大模型,再压缩为小模型”。读者可能会疑惑:为什么不直接训练一个小模型?答案是目前很多实验已经表明,先训练大模型再压缩,相比直接训练一个小模型,最后的精度通常会更高一些。

也就是说,在推理速度一样的情况,压缩得到的模型更优一些,相关探讨可以参考论文 Train Large, Then Compress: Rethinking Model Size for Efficient Training and Inference of Transformers  [2] ,另外知乎上也有讨论《为什么要压缩模型,而不是直接训练一个小的 CNN?》[3]。

1.2 常见手段

常见的模型压缩技术可以分为两大类:1)直接简化大模型得到小模型;2)借助大模型重新训练小模型。这两种手段的共同点是都先要训练出一个效果比较好的大模型,然后再做后续操作。

第一类的代表方法是剪枝(Pruning)和量化(Quantization)。

剪枝,顾名思义,就是试图删减掉原来大模型的一些组件,使其变为一个小模型,同时使得模型效果在可接受的范围内;

至于量化,指的是不改变原模型结构,但将模型换一种数值格式,同时也不严重降低效果,通常我们建立和训练模型用的是 float32 类型,而换成 float16 就能提速且省显存,如果能进一步转换成 8 位整数甚至 2 位整数(二值化),那么提速省显存的效果将会更加明显。

第二类的代表方法是蒸馏(Distillation)。蒸馏的基本想法是将大模型的输出当作小模型训练时的标签来用,以分类问题为例,实际的标签是 one hot 形式的,大模型的输出(比如 logits)则包含更丰富的信号,所以小模型能从中学习到更好的特征。

除了学习大模型的输出之外,很多时候为了更进一步提升效果,还需要小模型学习大模型的中间层结果、Attention 矩阵、相关矩阵等,所以一个好的蒸馏过程通常涉及到多项 loss,如何合理地设计这些 loss 以及调整这些 loss 的权重,是蒸馏领域的研究主题之一。

Theseus

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

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

2.1 核心思想

前面说到,用蒸馏做模型压缩时,往往不仅希望小模型的输出跟大模型的输出对齐,还希望中间层结果也对齐。“对齐”意味着什么呢?意味着可替换!

所以 BERT-of-Theseus 的思想就是:干嘛要煞费苦心地通过添加各种 loss 去实现可替换性呢?直接用小模型的模块去替换掉大模型的模块然后去训练不就好了吗?

举个实际的类比:

假设现在有 A、B 两支球队,每支各五人。A 球队属于明星球队,实力超群;B 球队则是新手球队,待训练。为了训练 B 球队,我们从 B 球队中选 1 人,替换掉 A 球队中的 1 人,然后让这个“4+1”的A球队不断的练习、比赛。经过一段时间,新加入的成员实体会提升,这个“4+1”的球队就拥有接近原始 A 球队的实力。

重复这个过程,直到 B 球队的人都被充分训练,那么最终 B 球队的人也能自己组成一支实力突出的球队。相比之下, 如果一开始就只有 B 球队,只是 B 球队的人自己训练、比赛,那么就算他们的实力逐渐提升,但由于没有实力超群的 A 球队帮助,其最终实力也不一定能突出。

2.2 流程细节

回到BERT的压缩,现在假设我们有一个 6 层的 BERT,我们直接用它在下游任务上微调,得到一个效果还不错的模型,我们称之为 Predecessor(前辈)

我们的目的是得到一个 3 层的 BERT,它在下游任务重效果接近 Predecessor,至少比直接拿 BERT 的前 3 层去微调要好(否则就白费力气了),这个小模型我们称为 Successor(后辈)。那么 BERT-of-Theseus 是怎么实现这一点的呢?如下图。

▲ BERT-of-Theseus训练过程示意图

▲ Predecessor和Successor模型示意图

在 BERT-of-Theseus 的整个流程中,Predecessor 的权重都被固定住。6 层的 Predecessor 被分为 3 个模块,跟 Successor 的 3 层模型一一对应,训练的时候,随机用 Successor 层替换掉 Predecessor 的对应模块,然后直接用下游任务的优化目标进行微调(只训练 Successor 的层)。

训练充分后,再把整个 Successor 单独分离出来,继续在下游任务中微调一会,直到验证集指标不再上升。

▲ 上述模型的等效模型

在实现的时候,事实上是类似 Dropout 的过程,同时执行 Predecessor 和 Successor 模型,并将两者对应模块的输出之一置零,然后求和、送入下一层中,即:

由于 非 0 即 1(不作调整,各自 0.5 概率随机选效果就挺好了),所以每个分支其实就相当于只有一个模块被选择到,因此上面右图就相当于下述模型结构。由此每次的置零都是随机的,因此训练足够多的步数后,Successor 的每个层都能被训练好。

2.3 方法分析

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

前面说到,蒸馏多数时候也需要匹配中间层输出,这时候要涉及到的训练目标就有很多了:下游任务 loss、中间层输出 loss、相关矩阵 loss、Attention 矩阵 loss、等等,想想要平衡这些 loss 就是一件头疼的事情。

相比之下,BERT-of-Theseus 直接通过替换这个操作,逼着 Successor 能有跟 Predecessor 类似的输出,而最终的训练目标就只有下游任务 loss,不可谓不简洁。

此外,BERT-of-Theseus 还有一个特别的优势:很多的蒸馏方法都得同时作用于预训练和微调阶段,效果才比较突出,而 BERT-of-Theseus 直接作用于下游任务的微调,就可以得到相媲美的效果。这个优势在算法上体现不出来,属于实验结论。

从形式上来看,BERT-of-Theseus 的随机替换思路有点像图像中的数据扩增方案 SamplePairing 和 mixup(参考《从 SamplePairing到mixup:神奇的正则项》[4] ),都是随机采样两个对象加权求和来增强原模型;也有点像 PGGAN [5] 的渐进式训练方案,都是通过对两个模型进行某种程度的混合,实现两个模型的过渡。

如果了解它们的读者,继而就能够对 BERT-of-Theseus 提出一些拓展或者说疑问: 一定要非 0 即 1 吗,任意 的随机数行不?或者说不随机,直接让 慢慢地从 1 变到 0 行不?这些想法都还没有经过充分实验,有兴趣的读者可以修改下述代码自行实验。

实验效果

原作者们开源了自己的 PyTroch 实现:

https://github.com/JetRunner/BERT-of-Theseus

邱震宇老兄也分享了自己的讲解 [6] 以及基于原版 BERT 的 Tensorflow 实现 qiufengyuyi/bert-of-theseus-tf [7]。当然,既然笔者决定写这篇介绍,那就肯定少不了基于 bert4keras 的 Keras 实现了:

https://github.com/bojone/bert-of-theseus

这大概是目前最简洁、最具可读性的 BERT-of-Theseus 实现了,没有之一。

原论文的效果大家就自己去看原论文了。笔者在几个文本分类任务上实验了一下,结果大同小异,跟邱兄的实验结论也比较一致。其中在 CLUE 的 iflytek 数据集中实验结果如下:

可以看到,相比直接拿前几层微调,BERT-of-Theseus 确实能带来一定的性能提升。对于随机置零方案,除了均等概率选择 0/1 外,原论文还尝试了其他策略,有轻微提升,但会引入额外超参,所以笔者就没有实验了,有兴趣的读者可以自己修改尝试。

另外,对于蒸馏来说,如果 Successor 跟 Predecessor 有同样的结构(同模型蒸馏),那么通常来说 Successor 的最终性能比 Predecessor 还要好些,BERT-of-Theseus 有没有这一特点呢?

笔者也实验了一下该想法,发现结论是否定的,也就是同模型情况下 BERT-of-Theseus 训练出来的 Successor 并没有比 Predecessor 好,所以看来 BERT-of-Theseus 虽好,但也不能完全取代蒸馏。

文末小结

本文介绍并实验了一种称为“BERT-of-Theseus”的 BERT 模型压缩方法,该方法的特点是简洁明了,纯粹通过替换操作来让小模型去学习大模型的行为,使得能在只有一个 loss 的情况下就能达到当前最优的模型压缩效果。

参考文献

[1] https://github.com/bojone/bert4keras

[2] https://arxiv.org/abs/2002.11794

[3] https://www.zhihu.com/question/303922732

[4] https://kexue.fm/archives/5693

[5] https://arxiv.org/abs/1710.10196

[6] https://zhuanlan.zhihu.com/p/112787764

[7] https://github.com/qiufengyuyi/bert-of-theseus-tf

更多阅读

#投 稿 通 道#

 让你的论文被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

???? 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

???? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site

• 所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

????

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

BERT-of-Theseus:基于模块替换的模型压缩方法相关推荐

  1. 所有你要知道的 BERT 模型压缩方法,都在这里!

    模型压缩可减少受训神经网络的冗余,由于几乎没有 BERT 或者 BERT-Large 模型可直接在 GPU 及智能手机上应用,因此模型压缩方法对于 BERT 的未来的应用前景而言,非常有价值. 软件工 ...

  2. 降低预测过程计算成本,这些NLP模型压缩方法要知道

    编译 | 凯隐 出品 | AI科技大本营(ID:rgznai100) 近年来,基于谷歌Transformer的语言模型在神经机器翻译,自然语言推理和其他自然语言理解任务上取得了长足进展. 通过多种语言 ...

  3. 深度学习模型压缩方法(3)-----模型剪枝(Pruning)

    link 前言 上一章,将基于核的稀疏化方法的模型压缩方法进行了介绍,提出了几篇值得大家去学习的论文,本章,将继续对深度学习模型压缩方法进行介绍,主要介绍的方向为基于模型裁剪的方法,由于本人主要研究的 ...

  4. 深度学习模型压缩方法综述(二)

    深度学习模型压缩方法综述(一) 深度学习模型压缩方法综述(二) 深度学习模型压缩方法综述(三) 前言 上一章,将基于核的稀疏化方法的模型压缩方法进行了介绍,提出了几篇值得大家去学习的论文,本章,将继续 ...

  5. 娓娓道来!那些BERT模型压缩方法

    本文约3000字,建议阅读10+分钟 本文主要介绍知识蒸馏.参数共享和参数矩阵近似方法. 作者 | Chilia 哥伦比亚大学 nlp搜索推荐 整理 | NewBeeNLP 基于Transformer ...

  6. 娓娓道来!那些BERT模型压缩方法(一)

    作者 | Chilia 哥伦比亚大学 nlp搜索推荐 整理 | NewBeeNLP 基于Transformer的预训练模型的趋势就是越来越大,虽然这些模型在效果上有很大的提升,但是巨大的参数量也对上线 ...

  7. 深度学习模型压缩方法(1)-----综述

    展开 1.研究背景 对模型预测精度无明显影响 压缩模型的参数数量.深度来降低模型空间复杂度 全连接层参数多,模型大小由全连接层主导 不显著提高训练时间复杂度,降低预测时间复杂度(计算量) 卷积层计算量 ...

  8. ACL 2020 | MobileBERT:一种与任务无关的模型压缩方法

    ©PaperWeekly 原创 · 作者|蔡杰 学校|北京大学硕士生 研究方向|问答系统 论文标题:MobileBERT: a Compact Task-Agnostic BERT for Resou ...

  9. 性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise

    对于动辄上百 M 大小的神经网络来说,模型压缩能够减少它们的内存占用.通信带宽和计算复杂度等,以便更好地进行应用部署.最近,来自 Facebook AI 的研究者提出了一种新的模型量化压缩技术 Qua ...

最新文章

  1. 为freetextbox1.6.5上传图片加上水印
  2. vuejs,angularjs,reactjs介绍
  3. rtsp协议_Chromium(3/5):rtsp客户端
  4. Leetcode动态规划 不同路径
  5. P4097 [HEOI2013]Segment 李超线段树
  6. Java FutureTask示例程序
  7. DOM查找元素的方法总结
  8. 深入理解Java main方法
  9. 【Win32 API学习】模拟键盘输入和鼠标输入
  10. 安全云盘项目(一):1.5 bufferevent服务端代码事件策略
  11. 再也不学AJAX了!(三)跨域获取资源 ② - JSONP CORS
  12. Python练习-一辆购物车的寂寞都是Alex的错
  13. 笔记本电脑CPU低压、标压、高压的区别
  14. 一元、二元函数图像绘制
  15. 毕业生的找工作的时候住宿问题是如何解决的
  16. 【论文笔记】移动机器人视觉 SLAM 研究综述
  17. 沁恒CH573开发板上手
  18. 京东扫描平台EOS—JS扫描落地与实践
  19. python程序员培训_推荐给未来Python程序员的自学路线,不再背负小白名称
  20. 用Markdown优雅地一键排版公众号 解决公众号排版代码块换行错误的问题

热门文章

  1. SCARA四轴机器人丝杆花键_花键丝杆一体轴型SCARA机器人的制作方法
  2. CodeForces 901C Bipartite Segments
  3. log4j控制台乱码解决办法
  4. luogu2024 食物链
  5. 机器学习之——学习率
  6. 动态规划求解序列问题(LIS、JLIS)
  7. Angular学习(7)- 模板2
  8. Linux下C程序的可扩展性.
  9. echarts指针进度条刻度调整_指针式流量开关
  10. python区块链开发_10个开源的Python区块链项目