林 野,姜雨帆,肖 桐,李恒雨
(東北大學 自然語言處理實驗室,遼寧 沈陽 110819)
當前深層神經網絡在很多任務上都取得了巨大的進步[1-3],但隨著網絡規模的增大,網絡中的參數增多,網絡變得更冗余和繁重[4],這種冗余的網絡不僅會對存儲資源造成浪費,還會導致嚴重的過參數化和過擬合問題[5]。相比傳統的統計機器翻譯,神經機器翻譯在翻譯質量上有了顯著提升;并占用更少的存儲空間,但由于神經網絡仍然規模巨大,受網絡計算復雜度以及有限內存、有限存儲資源、有限能源的限制,高性能的基于深層神經網絡的神經機器翻譯系統只能在有限的平臺下使用,無法移植到資源和能源都有限的小型嵌入式系統當中[6],如何有效減小機器翻譯系統模型存儲便成了一個亟待解決的問題。
針對此問題,研究人員引入模型壓縮方法來進行模型的存儲壓縮,在降低模型存儲需求的同時保證模型的性能不受損害。模型壓縮的目標分為兩種:(1)減少運行時刻內存/顯存消耗,指通常所說的運行時刻模型壓縮; (2)減少模型在磁盤上的存儲消耗(但是運行內存并不減小),這個方法可以把模型變得更小,有利于模型在設備間的傳輸。更小存儲的模型有很多優點,比如,小的存儲空間可以使得很多手機端機器翻譯應用使用更小的離線下載包而提升用戶體驗,減小帶寬并提高并行性,本文實驗針對第二種目的。
模型壓縮方法總體可以分為兩大類:第一類方法修改模型結構,減小模型存儲大小[7-9],設計更精細的網絡結構;第二類方法不改變模型結構,在現有模型基礎上減少模型參數以減小模型存儲。本文在第二類方法上進行研究。研究人員在對第二類模型壓縮方法的研究中提出了很多可行方法,如剪枝[10]、量化[5]、低精度[11]、哈夫曼變長編碼[12]、知識精煉[13]等。本文針對現有剪枝、量化和低精度三種方法,基于Transformer和GNMT[14]雙層RNN基線系統在NIST12數據集上進行實驗,對比分析以上三種模型壓縮方法在兩種模型上可達到的不同壓縮效果及其原因,本文中實驗僅針對模型存儲空間進行壓縮,并未對模型運行內存進行壓縮。
實驗中,為了分析使用不同模型對每種模型壓縮方法效果的影響,我們選取了RNN和Transformer兩個基線系統。在最后的實驗結果中,對于RNN和Transformer,單獨使用剪枝方法可分別剪掉40%和15%模型參數而保持模型性能不變;單獨使用量化方法,在保證模型性能的同時可以將RNN最多由32-bit浮點數壓縮至4-bit,可以將Transformer的參數最多由32-bit浮點數壓縮至6-bit;單獨使用半精度方法可將兩套模型均壓縮至原有大小的50%而沒有任何性能損失。由于模型在解碼過程中僅需要一部分參數,對其余模型參數我們不進行存儲,在僅存儲解碼相關參數的基礎上,使用剪枝、量化、低精度三種方法的組合方法,可在不損失原有模型精度的前提下在Transformer和RNN模型上達到5.8×和11.7×的壓縮率。
本節對本文實驗中所使用的模型壓縮方法進行具體介紹。模型壓縮方法包括剪枝、量化、低精度中的半精度方法。
模型裁剪的方法最早由Cun等人提出[10],是目前模型壓縮中使用最廣泛的方法,其主要思想是通過減少參數空間中的冗余來縮小模型規模。近年來,在基于卷積神經網絡的計算機視覺領域任務中,模型裁剪方法已經取得了不小的成果,有些研究工作甚至可以在完全不損失模型性能的前提下大幅裁剪模型的參數[15]。
我們以RNN模型為例觀察模型的參數分布,從圖1(a)可以看出,神經網絡中絕大部分參數分布在0點附近,在整個參數分布中,裁剪掉越靠近0的參數往往對模型造成的破壞就越小。在實驗中,我們可以硬性設置一個閾值,裁剪掉絕對值低于這個閾值的權值或者整個神經元,也可以裁剪掉所有權值絕對值最小的前x%。總體來說,剪枝的整個過程就是一個將稠密的網絡變成稀疏網絡的過程。

圖1 模型參數分布圖
本文中實驗中采取了Class-blind和Class-uniform兩種剪枝策略[16]。Class-blind方法是將模型中所有參數按絕對值大小進行排序,裁剪掉絕對值最小的前x%參數,這種方法可以保證裁剪掉的模型參數值一定最接近0,缺點是導致模型中每層的剪枝比例不均勻。Class-uniform方法首先需對模型中參數分層,在每層中剪掉絕對值最小的前x%參數來保證每層的剪枝比例均勻,缺點是若某一層中參數絕對值普遍偏大或這一層中大部分參數對模型來說都很重要,硬性的分層剪枝會對模型精度造成更大損失。
按Class-blind和Class-uniform方法進行剪枝后模型參數分布如圖1(b)和(c)所示,由圖中可以看出按Class-blind方法比Class-uniform方法所剪參數分布更集中,Class-uniform方法所剪參數分布范圍更廣,體現在圖中就是圖1(b)和圖1(c)中間無參數部分寬度相比,圖1(c)中間空白部分比圖1(b)更寬且更有層次。
量化方法最早由Oliver等人提出[17],Denil等人的工作將量化方法用于神經網絡模型的壓縮并證實了神經網絡當中的過參數化問題[5]。在神經網絡當中,參數都是用32-bit浮點數表示,量化方法實際上就是通過犧牲參數精度的方式減少每個模型參數存儲所需要的比特位數。
在進行量化實驗時,我們首先需選定量化區間,量化區間是執行量化操作的區域,對于量化區間外的值仍以原值保存,由于神經網絡參數總體呈正態分布,選定量化區間以0為中心。以1--bit量化為例,量化過程如圖2所示,量化過程即用索引值代替量化區間內原值的過程,當進行n-bit量化時,將選定量化區間分為2n個等長區間,每個區間依次由索引0至2n-1來表示。進行解碼時,需將索引值恢復為原區間內的值,本文實驗中我們分別將參數值恢復為原區間的左值、中值和右值,并進行對比分析。
經過量化,模型以一個更低精度的形式來保存,使其成功地嵌入到小型設備上成為可能[18]。量化過程中,可以將網絡的參數量化至固定的4~12-bit[19],更極端的情況下也可以用1~2-bit來表示模型參數[20]。

圖2 量化過程圖
神經網絡中的權值都用浮點數表示,單精度浮點數在計算機中用32-bit表示,其中符號位1-bit,指數位8-bit,尾數位23-bit。在進行模型的訓練時,保持權值的高精度可以確保得到更優的模型,而當模型訓練完之后,權值精度適度降低一般對模型性能影響不大。低精度與量化方法思想相近,都是通過改變模型參數表示的形式來達到壓縮存儲的目的,在低精度方法中,通過將浮點數的尾數部分去掉來節省模型參數存儲空間。
本文采取低精度中的半精度方法進行實驗,在半精度方法中把32-bit單精度浮點數裁剪成16-bit半精度浮點數來進行參數的壓縮存儲。具體實驗時可分為壓縮和解壓兩個步驟,壓縮步驟中將原有的32-bit直接舍去尾數位中的16-bit,在解壓縮步驟中把舍去的16-bit用0補全恢復為32-bit,壓縮和解壓過程如圖3所示。

圖3 半精度方法參數壓縮和解壓過程
本文基于Tensorflow開源框架,搭建Transformer和GNMT雙層RNN兩套基線系統。主要對比分析剪枝、量化和半精度三種方法在Transformer和RNN兩種模型上不同的實驗效果及出現這些實驗現象的原因。
本文中使用Transformer[21]作為實驗基線之一。Transformer由Google在2017年提出,此模型摒棄了傳統的循環神經網絡結構和卷積神經網絡結構,是一個完全基于自注意機制的網絡結構,模型的優點是提高了模型的可并行程度,減少了模型的訓練代價。
Transformer編碼器由6個相同的層堆疊而成,每層都有兩個子層,第一個子層是多頭自注意力機制,第二個子層是一個簡單的,對位置敏感的前饋神經網絡。解碼器同樣由6個相同的層堆疊而成,其中每層有三個子層,其中有兩個子層和編碼器相同,第三個子層是負責處理編碼器輸出的多頭注意力機制。為了減小訓練壓力并加速模型收斂,在編碼器和解碼器中每一個子層后都會有殘差連接和層正則化操作。
Transformer使用的多頭注意力機制(mulit-head attention)的基本單元是按比例的點積注意力(scaled dot-product attention),這種注意力的輸入分為K、Q、V,計算過程如下所示
(1)
由于在點積的注意力機制上我們進行了按比例縮放,縮放后每個參數都被映射至更小的值,使模型參數范圍壓縮至更小的區間內,因此Transformer相較于傳統的RNN參數分布范圍更小。

表1 Class-blind和Class-uniform剪枝策略對Transformer和RNN的性能影響
本文實驗主要在中英翻譯任務上進行,評價指標采用Moses公開計算BLEU的腳本multi-bleu.pl,對于Transformer和RNN,實驗數據均采用NIST12 OpenMT[注]LDC2000T46,LDC2000T47,LDC2000T50,LDC2003E14,LDC2005T10, LDC2002E18,LDC2007T09,LDC2004T08作為訓練集,其中包括39.42MB的中文詞和44.92MB的英文詞,用NIST2006 (MT06)作校驗集和測試集,所有中文句子都采取NiuTrans[22]提供的工具進行分詞,長度超過50詞的句子都被過濾掉,Transformer和RNN中均使用詞頻最高的30KB大小的詞表,所有詞表外的詞都用UNK來代替。
模型結構方面,在Transformer中,編碼端和解碼端各有六層,RNN編碼端和解碼端各為兩層。模型參數方面,Transformer基線系統中訓練參數共90MB,訓練參數占存儲空間大小362MB,RNN訓練參數共有134MB,占存儲空間大小537MB。
對于Transformer,本工作采用tensor2tensor的1.0.14版本,模型編碼端和解碼端各有六層,隱藏層維度大小為512,batch大小為4 096,num_heads為8,最大句長為50,殘差dropout為0.1,初始學習率設置為0.001,優化器采用Adam,訓練15輪,沒有采用BPE、Ensemble和Finetune。
對于RNN基線系統,本工作采用GNMT的RNN,模型編碼端和解碼端各有兩層且編碼器為單向結構,隱藏層維度大小為1 024,batch大小為128,最大句子長度設為50,dropout為0.2,初始學習率為1.0,優化器采用SGD(stochastic gradient descent),訓練步數為150k,沒有采用BPE、Ensemble和Finetune。
本部分實驗基于Transformer和RNN兩套系統,運用Class-blind和Class-uniform方法進行模型剪枝,主要對比分析兩種剪枝方法在兩種模型上不同的剪枝效果。在不損失模型性能的前提下,Class-blind方法在Transformer和RNN上分別可以剪枝15%和40%;Class-uniform方法在Transformer和RNN上分別可以剪枝15%和25%。剪枝方法在RNN及Transformer上的實驗結果如表1所示,其中剪枝比例為0即代表基線,剪枝過程中模型性能整體變化趨勢如圖4所示。

圖4 Transformer和RNN在Class-blind和Class-uniform剪枝方法下的性能對比
3.1.1 相同剪枝方法在不同模型上的效果分析
此部分主要介紹在相同的剪枝方法下,隨著剪枝比例的增大,Transformer和RNN的性能變化趨勢。本文中采取Class-blind和Class-uniform兩種剪枝策略,具體方法見1.1節。值得注意的是,在進行Class-uniform剪枝實驗時,由于需要分層進行剪枝,我們首先將神經網絡模型按結構分成五部分,Source embedding、Target embedding、Encoder、Decoder和Softmax,在分層實驗時,我們在Encoder和Decoder中進一步按照不同模型結構進行分層,其中Transformer中有6層,RNN中有2層。
從表1實驗結果可以看出,隨著剪枝比例的增大,BLEU值趨向于變低,剪枝比例越大,BLEU值下降得越快,這與我們的預期相符,被剪枝參數數量越多,必然對模型造成的破壞越大,BLEU值就會越快地降低。
從圖4實驗結果看出,無論采取Class-blind還是Class-uniform方法,RNN在保持模型精度的條件下剪枝程度都大于Transformer,這說明在剪枝比例相同的情況下,Transformer的性能損失明顯大于RNN。從總體剪枝實驗情況來看,RNN最高可以剪到40%性能不掉,而Transformer最高只能剪到15%左右。這也從側面說明了Transformer模型中相較于RNN中冗余參數更少。
造成以上實驗現象的原因與RNN和Transformer的參數分布特點有關。雖然二者參數均服從正態分布,但Transformer較RNN參數分布得更集中,導致其參數矩陣的方差更大,因此其對于0點附近的值不敏感,而剪枝時我們剪掉的是0附近的值,因此對于RNN可以剪掉較大比例的參數值而不對模型性能產生影響。Transformer則與RNN相反,其參數分布集中,因此其對于0附近的值比較敏感,導致剪枝對Transformer的影響更大。
由此可見,剪枝方法更適用于壓縮方差較大、分布離散的模型。
3.1.2 不同剪枝方法在相同模型中的效果分析
此部分主要介紹Cass-blind和Class-uniform兩種剪枝策略分別在Transformer和RNN上進行實驗的實驗現象以及出現這些現象的原因,剪枝過程中模型性能整體變化趨勢如圖4所示,剪枝比例小于10%時,兩種模型的BLEU值均沒有降低,圖中兩套模型的起始點即為其各自的基線BLEU值。
對于RNN來說,隨著剪枝比例的增大,在剪枝比例小于50%時,兩種剪枝策略在同一剪枝比例所達到的模型性能相同,當剪枝比例大于50%時,按Class-blind策略進行剪枝的性能明顯優于Class-uniform,Class-blind策略剪枝達到性能更接近于基線系統,原因在于RNN在每層之間的參數分布范圍差異較大,而且RNN中參數值普遍偏大,運用Class-blind 方法進行剪枝可以保證所剪參數一定是最接近于0,而對于Class-uniform方法,按比例硬性剪掉每層中參數則會導致剪掉RNN中絕對值較大的參數,從而對模型的性能產生影響。
對于Transformer模型來說,隨著剪枝比例的增大,當剪枝比例小于15%至20%時,兩種方法在性能上無明顯差異,當剪枝比例大于這一比例時,按Class-uniform策略進行剪枝的模型性能明顯優于Class-blind方法,這與在RNN上實驗現象相反,主要是因為Transformer每層間參數分布差異較小,按Class-uniform策略進行剪枝可以發揮該方法的優勢,即Class-uniform方法可以使模型的剪枝更加均勻,并在每個分類中都剪掉更多對于模型冗余的參數。
總體來說,對于RNN,由于RNN參數范圍偏大且各層間參數分布不均勻,因此用Class-blind方法比Class-uniform剪枝效果好。對于Transformer,由于模型參數范圍小且各層間參數分布較均勻,因此在其上用Class-uniform來剪枝效果更好。
3.1.3 相同剪枝方法在相同模型上不同層次效果分析
在進一步分析模型層次對剪枝效果的影響的時候,我們在Transformer和RNN上分別進行實驗,實驗中統一采取Class-blind方法,在其余層不變的情況下對每一層進行單獨剪枝,我們對編碼器和解碼器中的每一層都單獨進行了實驗。由于選取的兩套基線系統中Transformer層數較多,我們以其為例分析模型層次加深對剪枝效果的影響以得到更有合理性的實驗結果,在保持模型性能的前提下各層可以進行剪枝的最大比例如圖5所示。

圖5 Transformer分層剪枝效果圖
從實驗結果看出,隨著模型層次的加深,在保持模型性能的前提下剪枝比例逐漸減小,原因在于神經網絡層與層之間是遞進關系,模型更高層中包含前面所有層中信息,也就是說越高層中包含重要的信息越多,因此越高的層次趨向于對剪枝更敏感。
在圖5實驗結果中發現,對剪枝越敏感的層趨向于有更大的權值,比如此模型中decoder layer 1參數分布范圍較大,對剪枝比較敏感。也就是說,在剪枝相同比例的情況下,對參數越大的層進行剪枝對模型造成的損失越大。在實驗中發現,模型中每一層的參數大小具有一定隨機性,因此具體每一層中剪枝比例缺乏普適性。
在Transformer上進行分層剪枝實驗時,若將所有層中保持模型性能的最大比例相結合進行組合剪枝實驗,剪枝比例如圖5所示,當基線系統BLEU值為41.76時組合剪枝可以達到41.65的BLEU值。當我們在RNN模型上用相同方法進行嘗試性實驗時,將每層中可以達到基線性能的最大剪枝比例相結合后模型性能卻很差,在基線BLEU值為39.55時組合剪枝BLEU值僅達到39.07。產生以上實驗現象的一部分原因是由于RNN模型中每層剪枝的幅度比Transformer大,而神經網絡層與層之間都聯系十分緊密,改變其中任何一層的參數都可能對其他層產生不可預估的影響。另一部分原因是由于RNN模型每層間參數分布沒有Transformer分布均勻,對單獨層進行剪枝會對其他層產生更大的影響。
實驗中將Transformer和RNN原始訓練系統作為基線,運用n-bit量化方法對模型進行壓縮,由于僅壓縮了存儲空間,解碼時需將參數恢復為32-bit浮點數。在量化的恢復階段,我們分別將參數值恢復為區間中左值、中值和右值和進行實驗,在進行8-bit量化過程中,兩種模型均可在保持模型性能不變的前提下,取到包含全部模型參數99%以上的量化區間。
3.2.1 量化時取值方式對模型性能的影響分析
為了驗證量化恢復時取值方式對模型性能的影響,我們在Transformer上進行實驗,對于同一量化區間(包含全部參數范圍的99.1%),在量化的恢復階段我們分別將參數值恢復至量化區間中左值、中值和右值,實驗結果如圖6所示。

圖6 Transformer量化時取值方法對模型性能的影響
從圖6中可以看出,隨著n-bit量化中n的減小,開始時取左值、中值和右值模型性能無明顯差異,但當n逐漸減小直至小于5時,取左值和右值對模型性能破壞極大,當n=4或更小時,BLEU值幾乎降為0。也就是說隨著n的減小,量化恢復時取中值的優勢越來越明顯,取中值時模型的性能會明顯優于取左值和右值。
這也驗證了我們的一個想法,一個區間的中值會接近區間中的大部分參數,因此將量化后參數恢復為32-bit時用中值來代替一個區間的參數會更加合理。
3.2.2 Transformer和RNN對量化方法的敏感程度分析
為了驗證Transformer和RNN兩套模型對量化方法的敏感程度,我們在8-bit量化的基礎上對模型進行了更精細的n-bit量化實驗,這部分的所有實驗在參數恢復階段都將參數恢復至區間中值,實驗結果如圖7和表2所示。

圖7 Transformer和RNN最大量化區間趨勢圖
圖7顯示內容為進行n-bit量化時在保證模型性能不變的情況下所能取到的最大范圍的量化區間。從圖中可以看出,隨著n-bit量化實驗過程中n的減小,所取量化區間也逐漸減小,這與我們期望相符。n越小,可以取到索引值的總數2n就越少,量化區間分成等長區間的份數越小,對模型造成的破壞就越大。因此隨著n的減小,本文傾向于選擇更小范圍的量化區間。從圖中還可以看出Transformer相較于RNN對量化更敏感,量化為相同的比特數時Transformer的量化區間更小。產生以上實驗現象的原因與Transformer模型結構有關,由于Transformer有一個參數矩陣縮放過程,模型參數被縮小到一定范圍內,導致模型參數變化對Transformer造成破壞更大。
單獨使用n-bit量化方式時,隨著n的減小,模型壓縮率變化趨勢如圖8所示。模型壓縮率為
(2)

圖8 Transformer和RNN n-bit量化模型壓縮率變化
其中rquan代表n-bit量化后模型壓縮率,xquan代表量化區間占總參數區間的百分比,n代表總模型參數數量,b代表每個模型參數原本需要用來表示的比特位數,bindex代表用來表示模型參數索引需要的比特位數,bmark代表用來區分是否在量化區間外的標志的比特位數。
從圖8可以看出,隨著n-bit量化中n的減小,模型壓縮率均呈現出先增大后減小的趨勢。產生以上實驗現象的原因主要是由于在模型達到最大壓縮程度前,隨著n的減小,量化區間內的參數值被極大程度壓縮,量化區間外的值所占比例比較小,模型壓縮率增大;在模型達到最大壓縮程度后,隨著n的減小,雖然量化區間內的參數值被壓縮,但量化區間縮小后量化外區間參數所占范圍增大,整體模型壓縮程度減小。
在實驗中我們發現,無論對于Transformer還是RNN模型,用半精度方法進行全范圍參數的壓縮均不會對其造成性能上的損失,這也向我們證明了神經網絡中存在冗余。由于在半精度方法中通過把32-bit單精度浮點數裁剪成16-bit半精度浮點數來進行參數的壓縮存儲,因此用半精度方法可以將模型壓縮至原有大小的50%而不對模型性能產生影響。
而半精度模型壓縮方法在以上兩個模型中的使用效果也向我們證明,在神經網絡中我們并沒有必要使用32-bit單精度浮點數來保存參數,尾數位的后16位對模型性能沒有任何意義,用16-bit或更少的比特數來保存參數對神經網絡模型就已經足夠,多余的比特位會導致網絡的冗余,并且對存儲資源造成十分不必要的浪費。
基于以上實驗結果,本文的下一步工作計劃就是嘗試使用更低精度的參數,如整數,進行模型的推斷和訓練,不僅僅可以減少模型的存儲空間,還可以節省模型運行內存及更多的計算資源。
進行剪枝、量化、半精度三種方法的組合實驗的實驗結果如表2所示。三種模型壓縮方法的參數操作范圍為: total=半精度>量化>剪枝,其中total代表全部參數。

表2 模型壓縮組合實驗的實驗結果
對于RNN,在組合實驗中,我們采取40%剪枝,4-bit量化(量化區間為98%,其中98%包括剪枝的40%),全范圍的半精度壓縮,最終能達到11.7×的壓縮率;對于Transformer,我們采取15%范圍剪枝,6-bit量化(量化區間為98%,98%包括剪枝的15%),全范圍的半精度壓縮,最終能達到5.8×的壓縮率。可以看出,RNN的可壓縮程度明顯大于Transformer,二者在總體壓縮程度上的區別也可反映出Transformer相比于RNN冗余較小。
從表2實驗結果可以看出,在剪枝、量化、半精度三種模型壓縮方法組合實驗過程中,量化方法對整個模型壓縮率的影響最大。與剪枝方法相比,量化方法操作的參數區間范圍大,與半精度方法相比,量化將參數存儲壓縮的程度更大,因此在實驗過程中量化方法占主要優勢,經過量化后,模型被極大地壓縮。
為了進一步驗證Transformer和RNN之間壓縮程度的差異,本文在更深層網絡(4層和8層)的GNMT RNN模型上進行實驗,在兩個更深層RNN上得到的最大壓縮率如表3所示。
進行更深層RNN網絡的實驗進一步證明了我們之前實驗結果的普適性,RNN可壓縮程度比Transformer更大,從側面反映出RNN中冗余參數較多。

表3 更深層網絡實驗結果
本文,實驗對神經網絡模型的壓縮進一步證明了神經網絡中模型參數的冗余特性。針對該特性,我們在未來工作中會考慮進行神經網絡的整數或更低精度的訓練和推斷,將模型壓縮與模型加速相結合,在減小模型存儲空間的同時也達到模型加速的目的。
本文主要針對如何降低模型參數存儲進行實驗,對比不同壓縮方法在Transformer和RNN上的模型壓縮效果。
對于剪枝方法,Transformer這種參數分布范圍較小且每層間參數分布較均勻的模型,進行分層剪枝效果更好,RNN這種模型參數分布范圍廣且每層間參數分布相差較大的模型運用整體剪枝效果更好,越深的層次趨向于對剪枝越敏感。
對于量化方法,參數分布集中的Transformer模型比參數分布離散的RNN模型更敏感,在進行量化時應注意選擇合理的量化區間和n值。
對于半精度方法,無論在Transformer還是RNN模型上,半精度方法均可在全參數范圍內進行模型的壓縮而不會對模型造成任何損失。
在進行剪枝、量化、半精度三種模型壓縮方法的組合實驗中我們發現,Transformer比RNN可壓縮程度小,從側面反映出Transformer相對于RNN冗余參數較少。