居委会大爷|别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
本文插图
作者 | rumor酱
编纂 | 丛 末
神经网络模型除了部署在远程服务器之外 , 也会部署在手机、音响等智能硬件上 。 好比在自动驾驶的场景下 , 大部分模型都得放在车上的终端里 , 不然荒山野岭没有网的时候就尴尬了 。 对于BERT这类大模型来说 , 也有部署在终端的需求 , 但考虑到设备的运算速度和内存大小 , 是没法部署完整版的 , 必需对模型进行瘦身压缩 。
本文插图
说到模型压缩 , 常用的方法有以下几种:
【居委会大爷|别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下】量化:用FP16或者INT8代替模型参数 , 一是占用了更少内存 , 二是接近成倍地晋升了计算速度 。 目前FP16已经很常用了 , INT8因为涉及到更多的精度损失还没普及 。 低轶近似/权重共享:低轶近似是用两个更小的矩阵相乘代替一个大矩阵 , 权重共享是12层transformer共享相同参数 。 这两种方法都在ALBERT中应用了 , 对速度基本没有晋升 , 主要是减少了内存占用 。 但通过ALBRET方式预练习出来的Transformer理论上比BERT中的层更通用 , 可以直接拿来初始化浅层transformer模型 , 相当于晋升了速度 。 剪枝:通过去掉模型的一部分减少运算 。 最细粒度为权重剪枝 , 即将某个连接权重置为0 , 得到稀疏矩阵;其次为神经元剪枝 , 去掉矩阵中的一个vector;模型层面则为结构性剪枝 , 可以是去掉attention、FFN或整个层 , 典型的工作是LayerDrop[1] 。 这两种方法都是同时对速度和内存进行优化 。 蒸馏:练习时让小模型学习大模型的泛化能力 , 猜测时只是用小模型 。 比较有名的工作是DistillBERT[2]和TinyBERT[3] 。 实际工作中 , 减少BERT层数+蒸馏是一种常见且有效的提速做法 。 但因为不同任务对速度的要求不一样 , 可能任务A可以用6层的BERT , 任务B就只能用3层的 , 因此每次都要花费不少时间对小模型进行调参蒸馏 。
本文插图
有没有办法一次获得多个尺寸的小模型呢?
今天就给大家先容一篇论文《DynaBERT: Dynamic BERT with Adaptive Width and Depth》[4] 。 论文中作者提出了新的练习算法 , 同时对不同尺寸的子网络进行练习 , 通过该方法练习后可以在推理阶段直接对模型裁剪 。 依赖新的练习算法 , 本文在效果上超越了众多压缩模型 , 好比DistillBERT、TinyBERT以及LayerDrop后的模型 。
本文插图
论文地址:https://arxiv.org/abs/2004.04037
1
原理
论文对于BERT的压缩流程是这样的:
练习时 , 对宽度和深度进行裁剪 , 练习不同的子网络推理时 , 根据速度需要直接裁剪 , 用裁剪后的子网络进行猜测设法实在很简朴 , 但如何能保证更好的效果呢?这就要看炼丹功力了 (.._..) , 请听我下面道来~
整体的练习分为两个阶段 , 先进行宽度自适应练习 , 再进行宽度+深度自适应练习 。
1、宽度自适应 Adaptive Width
宽度自适应的练习流程是:
1)得到适合裁剪的teacher模型 , 并用它初始化student模型
2)裁剪得到不同尺寸的子网络作为student模型 , 对teacher进行蒸馏
最重要的就是如何得到适合裁剪的teacher 。 先说一下宽度的定义和剪枝方法 。 Transformer中主要有Multi-head Self-attention(MHA)和Feed Forward Network(FFN)两个模块 , 为了简化 , 作者用注意力头的个数和intermediate层神经元的个数来定义MHA和FFN的宽度 , 并使用同一个缩放系数来剪枝 , 剪枝后注意力头减小到个 , intermediate层神经元减少到个 。
推荐阅读
- 农民|3岁女儿患癌后“起死回生”,农民父亲欲卖肾救娃:别再睡着了
- 医疗|环卫工大爷被电锯割伤被堵求医路上 民警8分钟将老人送到医院
- 中年|细思极恐!有人在小区内剪快递袋,别再这样做了!
- 上游新闻|71岁大爷要做自己!千里飞重庆拜师学乐器,回家找人玩乐队
- 情感|男人有多爱你,这些“信号”不会骗人,别再错过美好姻缘!
- 中年|中国大爷发明高楼逃生神器,从30楼下来只用90秒,已获国家专利
- 居委会大爷|1984年的高考数学有多灾?考生平均分26分,学霸含泪走出考场!
- 韩国总统文在寅演讲被 60 多岁老大爷扔鞋
- 韩国总统文在寅被老大爷扔鞋 看一眼后当场离开
- 居委会大爷|一个学校女领导越来越多,会怎样?