DynaBERT: Dynamic BERT with Adaptive Width and Depth(2020-4-8)

模型概述

预训练模型,如BERT,在自然语言处理任务中的强大之处是毫无疑问,但是由于模型参数量较多、模型过大等问题,在部署方面对设备的运算速度和内存大小都有着极高的要求。因此,面对实际产业应用时,比如将模型部署到手机上时,就需要对模型进行瘦身压缩。近年的模型压缩方式基本上都是将大型的BERT网络压缩到一个固定的小尺寸网络。而实际工作中,不同的任务对推理速度和精度的要求不同,有的任务可能需要四层的压缩网络而有的任务会需要六层的压缩网络。DynaBERT(dynamic BERT)提出一种不同的思路,它可以通过选择自适应宽度和深度来灵活地调整网络大小,从而得到一个尺寸可变的网络。

模型改进

预训练

DynaBERT的训练阶段包括两部分,首先通过知识蒸馏的方法将teacher BERT的知识迁移到有自适应宽度的子网络student DynaBERTw 中,然后再对 DynaBERTW 进行知识蒸馏得到同时支持深度自适应和宽度自适应的子网络 DynaBERT。

在这里插入图片描述

宽度自适应 Adaptive Width

一个标准的transfomer中包含一个多头注意力(MHA)模块和一个前馈网络(FFN)。在论文中,作者通过变换注意力头的个数 N h N_h Nh 和前馈网络中中间层的神经元个数 d f f d_{ff} dff 来更改transformer的宽度。同时定义一个缩放系数 m w m_w mw 来进行剪枝,保留MHA中最左边的 [ m w N H ] [m_wN_H] [mwNH] 个注意力头和 FFN中 [ m w d f f ] [m_wd_{ff}] [mwdff] 个神经元。

为了充分利用网络的容量,更重要的头部或神经元应该在更多的子网络中共享。因此,在训练宽度自适应网络前,作者在 fine-tuned BERT网络中根据注意力头和神经元的重要性对它们进行了排序,然后在宽度方向上以降序进行排列。这种选取机制被称为 Network Rewiring。

在这里插入图片描述
那么,要如何界定注意力头和神经元的重要性呢?作者参考 P. Molchanov et al., 2017E. Voita et al., 2019 两篇论文提出,去掉某个注意力头或神经元前后的loss变化,就是该注意力头或神经元的重要程度,变化越大则越重要。

训练宽度自适应网络

首先,将BERT网络作为固定的教师网络,并初始化 D y n a B E R T W DynaBERT_W DynaBERTW。然后通过知识蒸馏将知识从教师网络迁移到 D y n a B E R T W DynaBERT_W DynaBERTW 中不同宽度的学生子网络。其中, m w = [ 1.0 , 0.75 , 0.5 , 0.25 ] m_w=[1.0,0.75,0.5,0.25] mw=[1.0,0.75,0.5,0.25]

模型蒸馏的loss定义为: L = λ 1 l p r e d ( y ( m w ) , y ) + λ 2 ( l e m b ( E ( m w ) , E ) + l h i d n ( H ( m w ) , H ) ) L = \lambda_1l_{pred}(y^{(m_w)}, y) + \lambda_2(l_{emb}(E^{(m_w)},E) + l_{hidn}(H^{(m_w)}, H)) L=λ1lpred(y(mw),y)+λ2(lemb(E(mw),E)+lhidn(H(mw),H))其中, λ 1 , λ 2 λ_1,λ_2 λ1,λ2 是控制不同损失函数权重的参数, l p r e d , l e m b , l h i d n l_{pred},l_{emb},l_{hidn} lpred,lemb,lhidn 分别定义为: l p r e d ( y ( m w ) , y ) = S C E ( y ( m w ) , y ) , l e m b ( E ( m w ) , E ) = M S E ( E ( m w ) , E ) , l h i d n ( H ( m w ) , H ) = ∑ l = 1 L M S E ( H l ( m w ) , H l ) \begin{aligned} l_{pred}(y^{(m_w)}, y) &= SCE(y^{(m_w)}, y), \\ l_{emb}(E^{(m_w)}, E) &= MSE(E^{(m_w)}, E), \\ l_{hidn}(H^{(m_w)}, H) &= \sum^{L}_{l=1} MSE(H^{(m_w)}_l, H_l) \\ \end{aligned} lpred(y(mw),y)lemb(E(mw),E)lhidn(H(mw),H)=SCE(y(mw),y),=MSE(E(mw),E),=l=1LMSE(Hl(mw),Hl) l p r e d l_{pred} lpred 代表预测层的loss,SCE 代表交叉熵损失函数。 l e m b l_{emb} lemb 代表嵌入层的loss,MSE代表均方差损失函数。 l h i d n l_{hidn} lhidn 则为隐藏层的 loss。

训练深度自适应网络

训练好宽度自适应的 D y n a B E R T W DynaBERT_W DynaBERTW 后,就可以将其作为教师网络训练同时具备宽度自适应和深度自适应的 DynaBERT了。为了避免宽度方向上的灾难性遗忘,在每一轮训练中,仍对不同宽度进行训练。深度调节系数 m d m_d md 对网络层数进行调节,在训练中定义 m d = [ 1.0 , 0.75 , 0.5 ] m_d=[1.0,0.75,0.5] md=[1.0,0.75,0.5]。深度方向上的剪枝根据 m o d ( d + 1 , 1 m d ) = 0 mod(d+1, \frac{1}{m_d}) = 0 mod(d+1,md1)=0 来去掉特定层。

模型蒸馏的loss定义为: L = λ 1 l p r e d ′ ( y ( m w , m d ) , y ( m w ) ) + λ 2 ( l e m b ′ ( E ( m w , m d ) , E ( m w ) + l h i d n ′ ( H ( m w , m d ) , H ( m w ) ) ) L = \lambda_1l^{'}_{pred}(y^{(m_w,m_d)},y^{(m_w)}) + \lambda_2(l^{'}_{emb}(E^{(m_w,m_d)},E^{(m_w)}+l^{'}_{hidn}(H^{(m_w,m_d)},H^{(m_w)})) L=λ1lpred(y(mw,md),y(mw))+λ2(lemb(E(mw,md),E(mw)+lhidn(H(mw,md),H(mw)))

模型参考

论文地址:https://arxiv.org/abs/2004.04037

代码地址:https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/DynaBERT

猜你喜欢

转载自blog.csdn.net/weixin_49346755/article/details/127484466