居委会大爷|别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下


居委会大爷|别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
本文插图

作者 | rumor酱
编纂 | 丛 末
神经网络模型除了部署在远程服务器之外 , 也会部署在手机、音响等智能硬件上 。 好比在自动驾驶的场景下 , 大部分模型都得放在车上的终端里 , 不然荒山野岭没有网的时候就尴尬了 。 对于BERT这类大模型来说 , 也有部署在终端的需求 , 但考虑到设备的运算速度和内存大小 , 是没法部署完整版的 , 必需对模型进行瘦身压缩 。
居委会大爷|别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
本文插图

说到模型压缩 , 常用的方法有以下几种:
【居委会大爷|别再蒸馏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层的 , 因此每次都要花费不少时间对小模型进行调参蒸馏 。
居委会大爷|别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
本文插图

有没有办法一次获得多个尺寸的小模型呢?
今天就给大家先容一篇论文《DynaBERT: Dynamic BERT with Adaptive Width and Depth》[4] 。 论文中作者提出了新的练习算法 , 同时对不同尺寸的子网络进行练习 , 通过该方法练习后可以在推理阶段直接对模型裁剪 。 依赖新的练习算法 , 本文在效果上超越了众多压缩模型 , 好比DistillBERT、TinyBERT以及LayerDrop后的模型 。
居委会大爷|别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
本文插图

论文地址: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层神经元减少到个 。


推荐阅读