論文閱讀 | Compressing Large-Scale Transformer-Based Models: A Case Study on BERT


 

Transefomer-based 的預處理模型往往很消耗資源,對運算性能要求極高,還有嚴格的延遲需求。

潛在補救方法:模型壓縮

這篇文章主要講如何壓縮Transformers,重點關注BERT。使用不同的方法對attention層 全連接層等不同部分的壓縮會有不同的效果,來看看作者后面怎么說。

 

對BERT的分解與分析

BERT主要有兩個訓練目標: (1) Masked Language Model (MLM), 學習預測句子內容 (2) Next Sentence Prediction(NSP), 學習預測兩個句子之間的關系

ALBERT提出了Sentence-order prediction (SOP)來取代NSP。具體來說,其正例與NSP相同,但負例是通過選擇一篇文檔中的兩個連續的句子並將它們的順序交換構造的。這樣兩個句子就會有相同的話題,模型學習到的就更多是句子間的連貫性。

BERT的輸入給到WordPiece tokens [Wu et al., 2016] 來得到更小的詞表,並且,在出現詞匯表外(OOV)單詞時變得更加健壯。

[CLS]放在句子開始前,[SEP]是句對任務中兩個句子的分隔符。每個WordPiece token輸入被表示為三個向量,token/ segment/ position embedding,相加進入model主體。

 

 

每個transformer層堆疊很多編碼器單元,每個編碼器包含兩個主要子單元:self-attention和前向反饋網絡FFN,通過殘差連接。每個self-attention包含全連接層、多頭multi-head self-attention層、全連接層(前后都有),FFN只包含全連接層。

BERT模型可以使用指定大小的三個hyper-parameters: 編碼器單元(L)的數量、每個嵌入向量的大小(H)和每個self-attention層(a)的attention heads的數量。L和H確定模型的深度和寬度,而A是Transformer的內部hyper-parameter,影響每個編碼器可以關注的上下文關系的數量。BERT的兩個pre-trained模型:BERTBASE (L = 12; H = 768; A= 12)和BERTLARGE (L = 24; H = 1024; A = 16) 。

 

圖2分析了BERTBASE模型的不同部分的內存和理論計算要求 (measured in millions of FLOPs, FLOP: 每秒浮點運算次數) 。顯然,消耗最大內存和執行最多的浮點運算的部分是FFN。embedding層也需要大量的內存,因為需要較大的vector size(H)表示每個embedding向量。注意,嵌入層為的FLOPS為0,它僅僅是一個查找表,不包括任何算術計算推理時間。

對於self-attention單元,將它分為multi-head self-attention層和線性層(全連接層)。self-attention層消耗零內存,因為他們沒有任何可學的參數;但因為有softmax操作,計算成本不是零。每個注意力層周圍的線性層會產生額外的內存和計算開銷,比FFN相對較小。attention層划分不同的輸入給多個頭,因此每個頭運行在一個低維空間(H/A)。每個attention層之前的線性層的大小大約是attention層之后的三倍,因為每個attention層有三個輸入(key value query),只有一個輸出。

 

理論計算開銷成本可能不同於實際運行中的推理,這依賴於硬件的運行模式。基於作者對實際運行中的分析,多頭self-attention層比理論上更costly。這是因為在這些層的softmax是相當復雜的,而且它的實現為幾個矩陣轉換矩陣乘法。與此同時,嵌入層的執行時間不是零(因為內存訪問成本),但仍相對較小。FFN是整個模型的瓶頸,這與理論分析的結果是一致的。

 

模型壓縮方法

表1對現有方法進行了分類:根據是否需要訪問原始BERT訓練集(用√標記)或直接在特定於任務的數據集上壓縮(用△標記)。

 

1 數據量化(DQ)

DQ指代表每個模型weight使用更少的bits,從而降低模型的內存占用,降低數值計算的精度。當底層計算設備具備處理低精度數字更快的優化時,DQ可能提高推理速度,如,新一代Nvidia gpu的tensor cores。可編程硬件(如fpga)可以針對任何位寬表示進行專門優化。

DQ通常是適用於所有BERT全連接層的權重(即,嵌入層、線性層、FFN),已被證明是quantization-friendly 量化友好的。谷歌提供的原始BERT模型用32位浮點數表示每個權值。一個簡單方法是簡單地截斷每個32位權重,進行重構,這往往產生較大精度下降。Quantization Aware Training (QAT)方法是更有效地保持模型的准確性。QAT包括額外的培訓步驟調整量化權重。QAT在BERT上的應用有,使用fake nodes, 8位整數,和基於hessian混合精度的方法。有趣的是,嵌入層比其他層對量化更敏感,需要更多的比特來保持其准確性。

 

2 剪枝(PR)

刪除不重要的權重 and/or 組件,有時候能使得模型有更魯棒更好的性能。BERT的剪枝大概分為兩類:

(1) Elementwise Pruning (EP)

也成為稀疏剪枝。側重於PR單個權重,側重於確定模型中最不重要的權重集合。權重的重要性可以通過它們的絕對值、梯度或設計者定義的其他度量來判斷。PR對BERT來說可能是有效的,因為BERT有大量的全連接層。

然而,現有的EP方法僅對Transformer主干進行了實驗(即 self-attention和FFN),嵌入層還沒有。

(2) Structured Pruning (SP)

結構化剪枝。與EP不同,SP側重於通過減少和簡化BERT模型中的數值組件模塊來修剪架構組件:

Attention head pruning:

如第2節所示,在推理時,自我注意層會帶來相當大的計算開銷,其重要性也常常受到質疑。最近的研究還表明,大多數注意力集中在瑣碎的位置關系上,可以用固定的注意力模式代替。因此,減少self-attention層的頭的數量可以顯著減少模型的執行時間。事實上,原來的模型有16個注意頭,但只有1-2注意頭每編碼器單位達到高精度是可能的。

Encoder unit pruning:

可以通過修剪不太重要的層來減少編碼器單元(L)的數量,而不是從頭開始訓練一個更小的學生模型。Layer dropout 提出了在訓練過程中隨機丟棄編碼單元的層丟失法。這使得在推斷過程中提取任意期望深度的更小模型成為可能,因為原始模型已經被訓練為對這種修剪具有魯棒性。

 

3 知識蒸餾(KD)

KD指使用一個或多個大pre-trained模型(稱為老師)的輸出(通常是中間層的輸出)訓練一個較小的模型(稱為學生)。在BERT模型中,有多個中間結果學生可以學習,如編碼器的輸出單位,最后一層logits和attention map。根據學生學習的老師,現有的分類方法如下。

(1) 對編碼器輸出(EO)進行蒸餾

每個編碼單元負責在輸入語句中提供單詞之間的語義和上下文關系,並逐步改進預訓練的表示。因此,我們可以通過減少編碼器單元(H)的大小、編碼器單元的數量(L)或兩者都減少來創建更小的BERT模型。

減少H導致學生中更緊湊的表示。由於大小不同,學生不能直接從老師的輸出中學習。為了克服這個問題,學生也學會轉換,從而可以實現為down-projecting老師的輸出到一個較低的維數,或up-projecting學生的輸出為原始維度,性能是相似的。

減少L。即編碼器單元的數量,迫使學生中的每個編碼器單元從教師中的多個編碼器單元序列的行為中學習。蒸餾知識來自於等距的編碼器的輸出單位老師中捕捉的相對更均勻的信息,與只從編碼器蒸餾知識單元末尾學習想必,會產生性能更好的學生模型。

(2) 蒸餾輸出的logits (OL)

類似於知識蒸餾cnn,學生可以直接從最后softmax層的logits(即軟標簽)學習。softmax計算中一個常見hyper-parameter 是temperature,通過在softmax之前擴展logits,控制輸出的平滑。因此,這個hyper-parameter決定學生在多大程度上依賴於老師提供的軟標簽。根據temperature設置,現有解決方案可以進一步分為兩類: (i) 嘗試不同的溫度值 (ii) 固定溫度值為1。

注意,這里的學生不一定是小BERT 小Transformer,也能是其它完全不同的網絡結構。這種替代可以幫助保持模型的性質,同時大幅壓縮。兩個常用的替代結構如下:

(i) 用BiLSTM代替Transformer。

BiLSTMs不是同時添加句子中的每個單詞,也可以創建雙向表示,被認為是較輕的替代品。大部分的工作壓縮成BiLSTM的BERT模型一般直接針對一個特定的NLP下游任務。但由於特定任務的數據集較小,從而有使用基於規則的數據增強技術來創建額外的合成訓練數據或從多個任務收集數據來訓練一個模型等方法。

(ii) 用CNN代替Transformer。

CNN的並行性會提高運行時推理性能。cnn也可以同時向所有方向process。由於其內kernel size越小,一個CNN卷積層只能專注於local context,而Transformer中單個編碼器單元關注完整的全局上下文。因此,可以用深CNN網絡來替代,可以通過在學生網絡使用一個可微的神經結構搜索算法(NAS)獲得更輕、更快的模型。

(3) 蒸餾attention maps (AM)

AM指的是通過自我關注層的softmax分布輸出,表明各種輸入標記之間的上下文依賴關系。BERT中的AM表示可區分的語言關系,例如句子、動詞和相應對象之間的相同單詞,或者所有格代詞和相應的名詞之間的相同單詞。為了獲取這些信息,可以指導學生學習這些語言關系。

 

4 結構不變壓縮 (AIC)

AIC壓縮輸入模型而不改變其結構。上述DQ就是這樣一種方法。在這里,研究了其他類型的AIC。

(1) 參數共享(PS)

ALBERT采用與BERT相同的架構,但是在所有編碼器單元中共享權重,從而顯著減少了內存占用。此外,ALBERT已經被證明能夠實現更大更深的模型訓練。例如,BERT的性能在BERTLARGE處達到峰值(BERTXLARGE的性能顯著下降),而Albert的性能不斷提高,直到更大的ALBERTXXLARGE (L = 12; H = 4096; A = 64)模型。

(2) 嵌入矩陣embedding matrix壓縮(EMC)

嵌入矩陣是嵌入層的查找表 lookup table,它的大小大約是整個BERT模型的21%。為了減小嵌入矩陣的大小,一種可能是減小詞匯量V,在原始BERT中大約是30k。回憶一下上文,BERT的詞匯是使用一個WordPiece tokenizer從訓練數據中學習的。當|V|設置成5k,約94%的token在BERT學習到的新詞表也存在於原來BERT的詞表中。這表明,原始BERT詞匯表中的大多數標記可能都是多余的。另一個方法是應用矩陣分解,  通過兩個小矩陣的乘積 (V*E和E*H)取代原來V*H 嵌入矩陣。如果E原小於H,就可以減少相當大的內存使用。

(3) 注意層分解(AD)

較低層的多頭self-attention層學習local context,而上層的學習全局上下文。對於關注local context的層,計算self-attention整個完整的輸入沒必要。因此,對於輸入為句對的任務,在低層的self-attention可以分解為分別去計算每個句子的self-attention。因為self-attention層不包含權重,該方法只降低計算成本,模型的大小保持不變。此外,由於local上下文輸出句子都是彼此獨立的計算,該方法還允許更高程度的並行處理和緩存中推斷。

 

 

壓縮效果

主要比較最終模型大小,運行時加速多少,以及它們在各種NLP任務上的准確性/F1分數。

1 數據集和指標

從通用語言理解評估(GLUE)基准和斯坦福問題回答數據集(SQuAD)來看,依賴於以下最常見的任務:MNLI和QQP用於句子對分類,SST-2用於句子分類,SQuAD v1.1用於基於理解的問題回答。在GLUE排行榜中,給出了MNLI和SST-2的精度比較,以及QQP的精度和F1。對於SQuAD v1.1,比較F1(SQuAD leaderboard的官方評價標准)。使用模型大小的下降與MNLI壓縮前后精度下降之間的比率來評估常見規模上的方法,因為這是一個重要的權衡。

 

2 比較和分析

表2比較了BERT壓縮方法的有效性。注意一些方法只專注於壓縮模型的一部分。有的將BERTBASE作為teacher,有的將BERTLARGE模型作為teacher。對於一致性,所有模型大小和加速效果報告壓縮后的最終完整的模型與BERTBASE比較,即使最初是應用於BERTLARGE方法。使用BERTLARGE為teacher進行訓練比其他方法有優勢。我們也基於他們在不同的任務的絕對精度下降或相對於BERTBASE F1分數比較各種方法。下面是表中幾個有趣的趨勢。

(1) 精度 vs 模型大小

模型降低與精度降低的比率 △MS/△A 在使用KD-EO時很高,但KD-OL會低很多,因為在精度上有明顯的下降,才能達到所需的壓縮。相比之下,DQ和PR實現可觀的比例因為他們把主要精力集中於減少冗余模型中。然而,KD-AM有很高的比率(KD-EO +AM是最高的),說明KD-AM降低模型的大小幾乎不損失精度。

(2) 剪枝和量化

數據量化(DQ)和element-wise修剪(EP)非常適合BERT,性能與其他方法相當。如表2所示,修剪有效,減少了原始伯特模型以其53.6%的大小,而量化成八位減少BERT的原始大小25%,這兩個在所有任務只有精度和F1 1 - 2%的下降。然而當被迫提供更高的壓縮比,如修剪模型幾乎30%的大小或量化2 - 3位(原始尺寸的11%),這些方法會引起精度下降和F1的大幅下降(在某些任務高達4 - 7%)。

(3) 特定的蒸餾

在壓縮BERT時有多種方法來提取信息。大變化的最終壓縮比(原始模型大小的1.6%到60%)方法在編碼器單元輸出使用KD(KD-EO)和輸出logits(KD-OL)在對范圍廣泛的解決方案上展示了他們的互補性。我們可以通過減少隱層大小(H)和編碼器的數量單位(L)創建一個非常小的BERT student模型(原始尺寸的1.6%)。然后用原始BERT模型的蒸餾來訓練它,使它具有良好的性能。我們還發現,KD在attention maps(KD-AM)比KD-EO或KD-OL產生更小但更好的模型,這表明了在學生網絡中復制注意力分布的重要性。

(4) 精度損失最小的壓縮
一個重要的研究方向是想辦法最大化模型壓縮不傷害精度/ F1。這些壓縮方法依賴於找到原始模型中的冗余。我們觀察到的方法如DQ、PR和多種形式的KD可以保留大部分的模型的准確性/ F1(少於1 - 2%下降為所有任務),並以最小的精度損失模型壓縮的好。然而,與其他方法相比,這些方法減少模型大小也是有限的(在大多數情況下,是50 - 60%的原始模型大小)。具體來講,所有BERT壓縮方法,EP提供最好的精度/ F1(幾乎沒有損失),且壓縮后模型比例為原規模的53.6%。

(5) 極端的壓縮方法

有時模型必須被壓縮為部署在內存或延遲綁定邊緣設備,同時保留最好的精度。大多數工作在這個方向依靠更換Transformer為一個較輕的替代,然后使用KD-OL訓練模型。這些方法能夠實現最高的壓縮比現有方法中(4 - 11%的原始模型大小)。像預期的那樣,這些方法的精度/ F1下降是相當大的(在某些任務如MNLI高達6 - 12%),因為重點是獲得極小模型。所有不同的BET的壓縮方法收益率,[Zhao et al., 2019]通過減少隱藏的大小(H)和編碼器的數量單位(L)生成了最小的模型大小(1.6%的原始模型),但在所有任務精度/ F1遭受巨大的損失(約11 - 13%)。

 

5 未解決的問題和研究方向

傳統的模型壓縮方法如DQ和剪枝對BERT很有幫助,但最有效的方法是特定於BERT的,包括變異KD和減少編碼器單元的大小和編碼器的數量單位的方法。這些方法還提供了對BERT工作方式的深入了解,以及其復雜架構的不同部分的重要性。

重大問題

1. BERT壓縮方法是一個非常突出的特征是編碼器單元的耦合特性以及編碼器本身的內部結構。然而一般在深度學習,一些層模型中可能被壓縮更多,從而壓縮的方法對待不同的層有同樣的處理不是最優的。

2. Transformer主干的本質是強制模型具有大量的參數,這使得BERT的模型壓縮更具挑戰性。用BiLSTMs和CNNs替換變壓器主干的現有工作已經產生了非常高的壓縮比,但是精度下降了相當大。

3. 通過增加疊加編碼器單元的數量,如MegatronLM、T-NLG等,可以提高Transformer模型的精度。但是,增加這些單元的數量會影響執行時間。

研究方向

1. 對於BERT [Guo et al., 2019]來說,即使在稀疏剪枝的權重矩陣中也存在有趣的結構化模式。如何使用這些模式來取得更好的壓縮是一種很有前途的研究方向。

2. 現有的思想壓縮自注意層較低的編碼器單位,只給了進一步探索解耦編碼器單位的motivation。根據每個編碼器單元的重要性對其進行壓縮,例如,處理不同數量的注意頭或編碼器單元之間不同的隱層大小,這可能是一個重要的步驟。

3. 解耦,然后單獨研究自注意和FFN子單元,對於理解它們提供的漸進改進也很重要。它們的重要性隨深度的不同而不同。這意味着某些FFN可能更容易被壓縮,即使相應的self-attention不是。

4. 用更輕的體系結構替代Transformer主干的方法的高壓縮比表明,這些模型和混合Bi-LSTM/CNN/Transformer模型(比Transformet的參數范圍更小)的更復雜變體的進一步探索,以限制精度下降。

5. 其他改進CNN模型性能的想法也可以應用於BERT。例如,在之前網絡中采用的並行卷積啟發了並行編碼器單元的使用,而不是將它們堆疊在一起以獲得更好的精度。同樣,其他像cross-layer shortcut connections, hourglass architecture, use of NAS,還可以應用於骨干BERT的體系結構。

6. 許多現有的BERT壓縮方法都是針對模型的特定部分的。我們可以結合這些互補的方法來實現更好的整體模型壓縮,例如,可以將注意力修剪與量化相結合。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM