作者 | rumor醬
編輯 | 叢 末
神經網絡模型除了部署在遠程伺服器之外,也會部署在手機、音響等智能硬體上。比如在自動駕駛的場景下,大部分模型都得放在車上的終端裡,不然荒山野嶺沒有網的時候就尷尬了。對於BERT這類大模型來說,也有部署在終端的需求,但考慮到設備的運算速度和內存大小,是沒法部署完整版的,必須對模型進行瘦身壓縮。
說到模型壓縮,常用的方法有以下幾種:
量化:用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層神經元減少到個。
在MHA中,我們認為不同的head抽取到了不同的特徵,因此每個head的作用和權重肯定也是不同的,intermediate中的神經元連接也是。如果直接按照粗暴裁剪的話,大概率會丟失重要的信息,因此作者想到了一種方法,對head和神經元進行排序,每次剪枝掉不重要的部分,並稱這種方法為Netword Rewiring。
對於重要程度的計算參考了論文[5],核心思想是計算去掉head之前和之後的loss變化,變化越大則越重要。
利用Rewiring機制,便可以對注意力頭和神經元進行排序,得到第一步的teacher模型,如圖:
要注意的是,雖然隨著參數更新,注意力頭和神經元的權重會變化,但teacher模型只初始化一次(在後文有驗證增加頻率並沒帶來太大提升)。之後,每個batch會訓練四種student模型,如圖:
蒸餾的最終loss來源於三方面:logits、embedding和每層的hidden state。
2、深度自適應 Adaptive Depth
訓好了width-adaptive的模型之後,就可以訓自適應深度的了。淺層BERT模型的優化其實比較成熟了,主要的技巧就是蒸餾。作者直接使用訓好的作為teacher,蒸餾裁剪深度後的小版本BERT。
對於深度,係數,設層的深度為[1,12],作者根據去掉深度為d的層。之所以取是因為研究表明最後一層比較重要[6]。
最後,為了避免災難性遺忘,作者繼續對寬度進行剪枝訓練,第二階段的訓練方式如圖:
2
實驗
根據訓練時寬度和深度的裁剪係數,作者最終可得到12個大小不同的BERT模型,在GLUE上的效果如下:
可以看到,剪枝的BERT效果並沒有太多下降,並且在9個任務中都超越了BERT-base。同時,這種靈活的訓練方式也給BERT本身的效果帶來了提升,在與BERT和RoBERTa的對比中都更勝一籌:
另外,作者還和DistillBERT、TinyBERT、LayerDrop進行了實驗對比,DynaBERT均獲得了更好的效果。
在消融實驗中,作者發現在加了rewiring機制後準確率平均提升了2個點之多:
3
結論
本篇論文的創新點主要在於Adaptive width的訓練方式,考慮到後續的裁剪,作者對head和neuron進行了排序,並利用蒸餾讓子網絡學習大網絡的知識。
總體來說還是有些點可以挖的,比如作者為什麼選擇先對寬度進行自適應,再寬度+深度自適應?這樣的好處可能是在第二階段的蒸餾中學習到寬度自適應過的子網絡知識。但直接進行同時訓練不可以嗎?還是希望作者再驗證一下不同順序的差距。
為了簡化,作者在寬度上所做的壓縮比較簡單,之後可以繼續嘗試壓縮hidden dim。另外,ALBERT相比原始BERT其實更適合淺層Transformer,也可以作為之後的嘗試方向。
參考文獻:
[1]LayerDrop: https://arxiv.org/abs/1909.11556
[2]DistillBERT: https://arxiv.org/abs/1910.01108
[3]TinyBERT: https://arxiv.org/abs/1909.10351
[4]DynaBERT: https://www.researchgate.net/publication/340523407_DynaBERT_Dynamic_BERT_with_Adaptive_Width_and_Depth
[5]Analyzing multi-head self-attention: https://arxiv.org/abs/1905.09418
[6]Minilm: https://arxiv.org/abs/2002.10957