一文詳解文本深度學習模型的壓縮 - 知乎

如下爲促使研究深度學習模型的壓縮的主要因素:html

  • 內存(RAM)的使用
  • 預測的延遲
  • 資源受限設備的推理
  • 易於 訓練/微調
  • 易於部署和更新
  • 易於分佈式訓練

只有當硬件設備發展到必定程度,再也不成爲限制條件時,模型壓縮將會被降維打擊。node

圖1顯示了文本的模型壓縮方法的普遍組織。

本文討論壓縮方法使用剪枝,量化,知識蒸餾,參數共享,張量分解和線性Transformer。git

何謂剪枝,取其精華,去其糟粕,剪枝則只是對原模型進行修剪,保留原模型github

減少模型尺寸最明顯的方法是使權值矩陣稀疏化。能夠根據不一樣的標準從權重矩陣中刪除權重。能夠刪除:web

  • 權重鏈接,其實就是權重矩陣中某個位置;
  • 神經元,至關權重矩陣中某一行或一列;
  • 塊,權重矩陣拆分爲多個塊
  • 注意力頭、分層或組合結構

如何決定哪些權重/神經元/塊/頭須要刪除?你應該修剪大的網絡仍是創建小的網絡?你應該作一次修剪仍是迭代/逐步修剪?正則化如何幫助剪枝?接下來討論基於剪枝的方法的這些方面。算法

不一樣類型的剪枝

1.1 去除權重鏈接

最直接的作法是把權重大小做爲鏈接重要性的度量來剪枝,把接近 0 或者小於某個閾值的權重鏈接都設爲 0,說明該鏈接在網絡中重要性不大。要想節省存儲空間或內存空間,實際應該使用稀疏矩陣來存儲權重矩陣。模型加速取決於稀疏矩陣乘法的特定實現。網絡

TensorFlow的模型優化工具 ,提供了對Keras模型權重剪枝的工具。數據結構

GitHub地址: https://github.com/tensorflow/model-optimization
官方教程:
https://www.tensorflow.org/model_optimization/guide/pruning/pruning_with_keras

關於稀疏矩陣或者稀疏Attention能夠參考以前的一篇:架構

sliderSun:那些輕輕拍了拍Attention的後浪們框架

Hessian的基礎方法

將權值修剪做爲模型壓縮的方法,將權值的顯著性定義爲刪除該參數致使目標函數E發生的變化。計算海森對角線的過程與用於計算一階導數的反向傳播算法很是類似。所以,計算Hessian的對角線複雜度與計算梯度的複雜度是相同的。

級修剪方法

一個計算上更可行的方法來修剪鏈接和從新學習權值僅僅基於原始權值的大小是簡單地修剪小的權值。修剪低強度權重會使矩陣稀疏。 稀疏矩陣能夠以壓縮稀疏行/列(CSR / CSC)格式存儲。 經過存儲索引差而不是絕對位置,能夠節省更多空間,並使用少許固定位數來編碼此差。

迭代量修剪方法

一般狀況下,人們認爲,與其在一個時期內修剪,不如在一個時期內逐漸修剪。這種修剪方法稱爲迭代修剪或逐步修剪。對於開始比例x%和結束比例y%,迭代量修剪程序刪除每一個權重的x%,作再訓練,而後每K次迭代刪除(y - x)/T %的權重。T是修剪完成的次數。

迭代量修剪和緻密化

此外,經過在多個迭代中交替進行剪枝和緻密化,能夠提升剪枝的有效性。有兩種方法能夠作到這一點。第一種方法,在每次迭代中,要麼進行剪枝,要麼進行緻密化。稀疏訓練對模型進行正則化,稠密訓練恢復修剪後的權值,在不過分擬合的狀況下提升了模型容量。稀疏化幫助優化器逃脫鞍點,並致使正則訓練收斂到一個明顯更好的極小值。第二種方法,在每次迭代中,一些休眠的權值能夠從新出如今網絡中,而其餘活動的權值能夠被刪除。

1.2 修剪神經元


在推理時,稀疏空間中的矩陣乘法須要特殊的支持,所以非結構化剪枝在實際中難以實現。神經元激活和偏差梯度,一般用來做爲神經元重要性的衡量標準。刪除神經元反應在權值矩陣上的表現就是去掉某一行或某一列。能夠在直接下降權重使用空間的狀況下,仍然直接矩陣運算,而不用像上面同樣使用稀疏矩陣。可是,與修剪權重相比,修剪神經元的靈活性較差,由於須要找到整行/整列進行刪除。

去除低重要性神經元

提出了三個節點重要度函數來肯定神經元的重要度:

  • 直覺上,若是一個節點的輸出在全部訓練數據上幾乎相同,那麼這些輸出不會對後面的層產生變化,所以該節點可能沒有用處。
  • 輸出權重範數(onorm):輸出連接的權重的平均L1-norm。
  • 輸入權重範數(onorm):輸入連接的權重的平均L1-norm。

全部的神經元都按照它們的分數進行排序,不那麼重要的節點被刪除。在大多數狀況下,onorm被認爲是這些重要函數中最好的。

1.3 修剪塊

剪枝神經元避免了稀疏矩陣問題,但在總體剪枝方面多是有限的。塊稀疏格式在內存中連續存儲塊,減小不規則的內存訪問。若是塊的最大大小權重低於當前閾值,將該塊中的全部權重設置爲零。與迭代權值修剪類似,塊修剪也能夠使用單調增加的閾值迭代進行。在訓練結束時,即便修剪結束,全部被歸零的塊仍然保持爲零,從而造成一個稀疏模型。就像權重修剪,起始坡度θ和斜坡坡度φ決定了閾值的增長速率。對於塊修剪,須要修改開始坡度,以考慮塊中的元素數量( N_b )。所以,塊修剪的開始坡度一般設置爲 θ_b = θ ×\sqrt[4]{N_b}

不幸的是,當應用塊稀疏性時,保持相同的模型精度變得具備挑戰性。 並且,塊大小對應用程序敏感,這使其成爲另外一個須要調整的超參數。 爲了不這些問題,提出了一種稱爲「bank平衡稀疏性」(BBS)的新方法。BBS將每一個權重矩陣行拆分爲多個等大小的bank,並對每一個bank單獨進行細粒度修剪,獲得bank間的相同稀疏性。每一個bank都有相同數量的非零值。例如,在每一個規模爲4的bank中保留前兩個權重意味着的稀疏性50%。將BBS剪枝方法迭代地應用於一個預先訓練好的網絡,並在每次剪枝迭代後對網絡進行微調,以恢復模型的精度。BBS的模型精度幾乎與非結構稀疏性相同,在相同稀疏度水平上對權重進行修剪時,BBS的性能明顯優於塊稀疏性。

1.4 修剪頭和層

修剪注意力頭

Are Sixteen Heads Really Better than One?探索了在multi head中並非全部的head都須要,有不少head提取的信息對最終的結果並無什麼影響,是冗餘存在的。引入了梯度來衡量head的重要性(Head Importance Score for Pruning)依次去掉不重要的頭,最後發現有些層甚至能夠從 16 個頭減到只剩一個頭而不會與原來的分數偏離太多。下降注意力頭不會減小運行時間,由於它們一般是並行計算的,配合減少embedding size纔有意義,由於在作multi-attention時映射到不一樣子空間時,其實是一個大的矩陣映射,這個大的矩陣的維度取決於embedding size,映射完以後再分割成多個頭。其中還能夠跨層對多個頭進行迭代修剪(而不是一次只修剪一個頭)。迭代剪枝,頭重要性評分模型的使用預期的靈敏度定義mask變量 ξ_h 以下:

X 是數據分佈, L(x) 是樣本 x 上的損失, Att_h(x) 是樣本 x的注意頭 h 的輸出,直覺上,若是 I_h 值很高,改變ξ_h 可能會對模型產生較大影響。所以,在每次迭代中, I_h 值較低的頭被刪除。

The Story of Heads使用(1) Layerwise Relevance Propagation (LRP)的標準來評判頭的重要性,而後他們也發現能夠去掉大量頭而不太影響效果。(2)頭部的「置信度」,計算出頭部最大注意權重的平均值,不包括句末符號,取一組用於評價的句子中的符號的平均值。爲了修剪頭部,他們提出了一種基於隨機門和 L_0 懲罰可微分鬆弛的方法。 L_0 norm等於非零組件的數量,並推進模型關閉不過重要的頭。

修剪層

受DropConnect啓發提出了LayerDrop,LayerDrop作告終構化的刪除:它刪除了一組權重、頭、前饋網絡(FFN)矩陣或層。要修剪的層能夠使用如下三種方法:

  • 每隔:每隔一層修剪(速率p),如12層BERT模型中每隔3層修剪一次。
  • 驗證搜索:經過檢查要刪除的層對驗證集的影響來搜索一組要刪除的層。這須要嘗試各類組合。
  • 數據驅動修剪:以數據驅動的方式學習各層的drop rate p_d

給定一個目標降低率p,咱們將學習深度爲d的層的單個降低率pd,以便層上的平均降低率等於p。在推理時,咱們僅根據softmax輸出轉發固定的top-k最高得分的層。在這三種方法中,「其餘」策略在許多任務和配置中都有使人驚訝的效果。「驗證搜索」和「數據驅動修剪」只能提供邊際收益。

1.5 小結

總而言之,剪枝是目前最經常使用的模型壓縮方法。修剪方法能夠是非結構化的(修剪權重),也能夠是結構化的(修剪神經元、修剪塊、修剪注意頭、修剪層次)。雖然權值裁剪在理論上會致使很大程度上的裁剪,可是稀疏數據結構的實際實現是困難的。修剪和正則化須要一塊兒當心地進行。另外,爲各類結構仔細定義重要性函數也是相當重要的。在權重修剪方法中,帶正則化的迭代量修剪方法對RNNs和LSTMs效果較好,而RPP對基於Transformer的模型效果更好。使用BBS修剪塊比修剪塊或修剪神經元要好。對於Transformer模型,只修剪頭部可能不會提供延遲改進,但減小注意力頭和層的組合會更好。

剪枝經過去除權重來節省模型大小,而量化旨在減小存儲權重所需的比特數。大多數計算機結構使用32位表示權重。然而,大腦突觸的估計精度約爲4.6比特。經驗證代表,神經系統中的大多數數量(例如,神經元的放電)因爲生物噪音有幾個百分點的變異性,或者精確度至多爲100分之一。所以,每一個決策能夠依賴於log2(100)=6.64位。所以,應該可以在人工神經網絡中平均存儲4-7位的權值。量化即經過減小每一個參數所需的比特數來壓縮原始網絡,能夠顯著下降內存。

各類執行1位的方法(或二進制量子化),三元量子化,和探索3和32位之間頻譜的通常量子化。下圖提供了各類量化樣式的概述。

2.1 二值化網絡

2.1.1 固定二值化

二值量化最簡單的方法是將權值設爲非負權值爲1,負權值爲-1,至關於32倍的壓縮。在前向傳遞中,二進制網絡大幅減少了內存大小和訪問量,並將大部分算術運算替換爲逐位運算,大大提升了功耗。最簡單的二值化方法是在訓練完成後靜態進行二值化。可是,這種方法致使了很大的精度損失。

這種簡單方法的一個變體是將權值設置爲常數c1來表示非負權值,將權值設置爲另外一個常數c2來表示負權值。Binary Scheme (BS)-Fixed方法存儲原始權重,並在前向傳遞過程當中將值替換爲c1或c2的掩碼值,其中c1和c2是固定的,並經過超參數調優選擇。在訓練中使用全精度權重。在訓練結束時,用其掩蔽值的指標替換權重。在BS-Fixed中,選擇c1和c2的值多是困難和耗時的。所以,在BS-flexible方法中,使用權重上有兩個中心的KMeans初始化c1和c2,而後使用反向傳播更新c1和c2。此外,在BS-Flexible方法,權值量化以下:

注意, w 爲原始權值,w_b 爲二值化權值。這些更改消除了超參數調優的須要。

2.1.2 隨機二值化

隨機二值化操做以下:

Hard Sigmoid是簡單版本(非光滑)的Sigmoid,其做用就是用三個線段來擬合整個Sigmoid函數。

只在向前和向後傳播期間對權值進行二值化,而在參數更新期間不進行二值化。對於隨機梯度,在更新期間保持良好的精度權重是必要的。能夠使用稱爲「直通估算器(STE)技巧」的手段來實現。根據STE,量化後的值是原始值的近似值,能夠用相對於量化後值的梯度代替原始值的梯度。該技巧容許將量化包含到反向傳播的計算圖中,並容許QNNs用低位寬數字表示參數、激活和梯度。對於測試時間推理,使用這種量化方法有3個選項:(1)使用生成的二元權重 w_b (這在肯定性二值化中最有意義)。(2)在隨機狀況下,能夠經過對每一個權值採樣一個 w_b 來採樣許多不一樣的網絡。這些網絡的集成輸出能夠經過對各個網絡的輸出進行平均獲得。(3)使用原始權重。但這並不會減小模型的尺寸。

2.2 三值化網絡

當權值的真實值接近於零時,它的量化值要麼設置爲-1,要麼設置爲1。這致使權重值的人爲增長,消失/爆炸梯度問題變得更加嚴重。所以,另外一種流行的量化形式是三元量化。三元量化能夠幫助實現最小的16倍壓縮(若是硬件容許避免存儲零,可高達32倍壓縮)。

三元量化最簡單的方法是三元鏈接,其肯定性形式以下:

須要注意的是,w爲原始權重值, w_t 爲三化後的權重值。與二進制鏈接同樣,三元鏈接也消除了前向傳遞中的全部乘法。在隨機形式下,假設原始權值歸一化到[-1,1]範圍內,三元量化執行以下操做:

這種種稍微相關的方法叫作伯努利三元量子化。

另外一種爲這三個範圍設置邊界的方法是使用基於高斯的三元權重,以下所示:

\mu\sigma 爲量化權重矩陣的均值和標準差。

2.3 通常量化網絡

2.3.1 基於KMeans的量化方案

一種有效的方法是k均值量化:先拿到模型完整表示的矩陣權重 W,以後用 k-means 算法將裏面參數聚成 N個簇。而後將 W 根據聚成的簇,轉化成 1 到 N 的整數,每一個分別設置爲其所屬聚類的中心值。這樣就能將 32 位降到只有 log(N)位,大大減少了存儲空間。而使用時只須要按照對應的 N 查表還原就行。

除了在模型訓練好後進行量化,更好的方法是在訓練期間執行K均值聚類。訓練期間大體過程是:

  • 量化權重
  • 計算量化網絡中的損失函數
  • 計算相對於未量化權重的損失梯度
  • 更新未量化的權重

多個鏈接(屬於同一簇)共享相同的權重,對那些共享的權重進行微調。 對於前向傳播,將爲每一個鏈接存儲的簇索引映射到質心,而後將其用做權重。 對於反向傳播,在更新過程當中,全部梯度均按聚類索引分組並相加,乘以學習率,而後從上次迭代的共享質心中減去。使用KMeans聚類來識別訓練過的網絡的每一層的共享權值,這樣落在同一個聚類中的全部權值將共享相同的權值。權重不跨層共享。爲了計算壓縮率,給定k個簇,只須要log2k位對索引進行編碼。通常狀況下,對於有n個鏈接的網絡,每一個鏈接用b比特表示,限制鏈接只有k個共享權值,壓縮率爲:


使用KMeans進行量化還有另外兩種方法:PQ和RQ。在PQ中將向量空間劃分爲多個不相交的子空間,並在每一個子空間上進行量化。權值矩陣W按列分區: W = [W1 , W2 , ..., Ws]W_i ∈ R^{m×n/s} 假設n能被s整除。而後咱們對每一個子矩陣 W_i 執行KMeans來得到簇 c^i_1, ..., c^i_k ,獲得s密碼本。重建矩陣 \bar{W} = [\bar{W}^1, \bar{W}^2, ..., \bar{W}^s] 。PQ能夠應用於矩陣的x軸或y軸,咱們須要爲每一個子向量存儲簇索引和代碼本。 該方法的壓縮率爲 (32mn)/(32kn + log2(k)ms) 。在RQ中,咱們首先將向量量化成k中心。接下來找出每一個數據點 (w-c) 的殘差,並對殘差執行KMeans。遞歸地作t次。而後計算合成權重向量 \tilde{W}_z = c^1_j + c^2_j + ... + c^t_j 假設咱們遞歸地執行了t次迭代。咱們須要爲每次迭代存儲全部的代碼本,這可能須要大量的內存。壓縮率爲 m/(tk + log2(k)tn)

2.3.2 Word Embeddings and Transformers 的量化

每一個單詞向量一般表示爲300-500維的向量,每一個參數爲32位。因爲有數百萬個單詞,單詞向量可能須要3-6個GB的內存/存儲。咱們能量化單詞向量嗎?通過訓練,咱們能夠清楚地量化它們。例如,使用連續詞袋(CBOW)方法執行word2vec 訓練時,執行1位和2位量化。研究代表,與訓練後的量化相比,訓練時的量化會產生更好的結果。

應用BS固定和BS靈活二進制量化到Transformer模型。Transformer架構具備很高的抗量化能力,而且可以將原始模型匹配到4位表示形式。 與量化相比,簡單的迭代修剪要差得多。有研究代表不一樣的編碼器層應該使用不一樣的比特數進行量化的基礎上,提出了BERT的混合精度量化。層表現出平坦的曲率的損失梯度表面能夠量化以下降位精度。所以,在不一樣的粒度層次上使用不一樣數量的比特:層次、注意力頭和神經元羣。最終觀察到,使用8位的量化嵌入層和其餘2-4位的權重矩陣能夠獲得與全精度BERT至關的結果。

2.4 小結

量化經過減小每一個權重值的比特數來執行模型壓縮。二進制量化自己並不能很好地用於基於文本的神經模型。可是三元和高比特量化能夠顯著減少模型的尺寸,而不會下降跨任務的精度。混合精度量化和剪枝技術對基於Transformer的模型是很是有效的。

關於 BERT 的量化可詳細參考:

Quantized-Aware Training,實際運算用是完整精度的僞量化,訓練時恢復爲32bit浮點
[1] Q8BERT: Quantized 8Bit BERT github
超低精度量化BERT,UC伯克利提出用二階信息壓縮神經網絡
[2] Q-BERT: Hessian Based Ultra Low Precision Quantization of BERT
[3] transformers.zip: Compressing Transformers with Pruning and Quantization github



KD方法本質是讓超大線下teacher模型來協助線上student模型的訓練,本質上是一種超大模型的知識遷移過程。也被稱爲師生網絡,主要的想法是首先訓練一個深層的教師網絡,而後學習一個淺層的模仿教師的學生網絡,從而達到如下兩個目標:1) 不須要從零開始訓練小模型;2) 蒸餾學習獲得的模型效果優於直接訓練。 按照遷移的知識類型,主要分爲三個大類:

  • 輸出遷移(Output Transfer)——將網絡輸出(Logits或Softmax)做爲知識
  • 特徵遷移(Feature Transfer)——將網絡學習的特徵(隱藏層)做爲知識
  • 關係遷移(Relation Transfer)——將網絡特徵的關係(層間)或者樣本的關係做爲知識

老師能夠提供哪些信息(「暗知識」)來訓練學生? 能夠使用哪些損失函數來確保信息從老師到學生的正確流動? 咱們能夠有一羣能夠訓練學生的老師,助教或同窗嗎? 咱們如何使用對抗性訓練實例來優化學生訓練? 接下來討論這些。

3.1 各類蒸餾體系結構

Do Deep Nets Really Need to be Deep?提出了學生教師網絡(或模擬模型),在該網絡中,學生使用來自教師網絡的softmax以前的logits進行訓練。 未在原始標籤上訓練學生模型; 通過訓練能夠學習教師模型學習的功能。所以,對學生模型進行了優化,以在全部訓練實例中最小化教師logits和學生logits之間的L2損失。這樣的提煉學生模型比直接在原始標籤的訓練數據上接受訓練的同一個淺層學生更準確,主要是由於:(1)老師去掉噪聲的標籤,若是有。(2)與原始的0/1標籤相比,老師的不肯定性對學生更有益。(3)最初的目標可能部分取決於沒法用做學習輸入的特徵,可是學生看到的目標僅取決於輸入特徵。經過教師對目標進行過濾,消除了對不可用特徵的依賴。

Deep model compression: Distilling knowledge from noisy teachers。

使用Logits擾動法訓練淺層學生

利用logit的另外一種方法是讓學生從噪聲的老師logits中學習,從教師那裏得到logits以後,將平均值爲0,標準誤差爲σ的高斯噪聲添加到教師logits中。這種擾動能夠應用於用機率矩陣選擇的樣本。受擾動的輸出產生調節器的效果。與Hinton最開始的KD有兩個區別吧:

  • 只用了一個logit output做爲target,計算了一個新的L2 loss,且student沒用hard label。
  • 在logit output加入了noise擾動(正則化),以模擬multi-teacher。

Distilling the Knowledge in a Neural Network

Hinton 提出了「dark knowledge」的概念。在他看來,這種被稱爲「暗知識」的東西纔是深度學習本質上學到的知識。Dark knowledge,就是隱藏在深度學習表面上所展示出來的網絡結構、節點之間的鏈接權重、網絡的輸出這些看獲得的數據之下的知識。這也能夠看做是將teacher模型視做信息充分的 source domain,將student模型視做須要大規模網絡補充信息的 target domain,而提取到的 dark knowledge 則是兩個任務之間的 common knowledge。

Hinton等人建議經過最小化教師softmax輸出和學生softmax輸出之間的交叉熵損失來訓練學生,同時最小化學生預測和實際標籤之間的交叉熵。既讓student模型在擬合訓練數據的 ground truth labels 的同時,也要擬合teacher模型輸出的機率分佈。。第一部分叫作軟損失,第二部分叫作硬損失。Loss是二者的結合,Hinton認爲,最好的訓練目標函數就是這樣,而且第一個目標函數的權重要大一些。 L=αL  (soft)  +(1−α)L  (hard) 。爲了使softmax輸出沒有峯值,從而將更多有用的信息從教師傳遞給學生,應該使用溫度參數T> 1的softmax。對教師和學生的訓練應該使用相同的溫度,但在學生完成訓練後,測試時能夠將溫度參數設置爲1。

算法示意圖
  • 訓練大模型:先用hard target,也就是正常的label訓練大模型。
  • 計算soft target:利用訓練好的大模型來計算soft target。也就是大模型「軟化後」再通過softmax的output。
  • 訓練小模型,在小模型的基礎上再加一個額外的soft target的loss function,經過lambda來調節兩個loss functions的比重。
  • 預測時,將訓練好的小模型按常規方式使用便可。

Fitnets: Hints for thin deep nets

爲何只使用教師最後一層的輸出來訓練學生? 在FitNets 中,針對Hinton提出的知識蒸餾法進行擴展,就是Hint Training,把網絡中間的輸出也拿出來,讓teacher模型和student模型中間層的輸出也要儘可能接近,讓studen模型去學習teacher模型作預測時的中間步驟。容許Student網絡能夠比Teacher網絡更深更窄,使用teacher網絡的輸出和中間隱藏層的特徵做爲提示,改進訓練過程和student網絡的性能,訓練一個deeper and thinner student,既輕量化又有不錯的表現。因爲學生中間隱含層通常小於教師中間隱含層,所以引入附加參數將學生隱含層映射到教師隱含層的預測。

圖最右邊不是 L_{DK} ​,應該是 L_{KD} ,表明 Hinton 定義的知識蒸餾訓練聯合loss

teacher網絡的前 h 層做爲 W_{Hint} ,student網絡的前 g 層做爲 W_{Guided} ,W_{Hint}指導W_{Guided}訓練,而後初始化W_r適配層的參數。

Hint Training : 用teacher網絡的hint層預訓練student網絡的guided層

KD Training:對整個網絡作知識蒸餾,讓student同時學習hard target和soft target


A gift from knowledge distillation:Fast optimization, network minimization and transfer learning

提出了將蒸餾的知識看做成一種解決問題的流,它是在不一樣層之間的feature經過內積計算獲得的。不擬合teacher模型的輸出,而是去擬合teacher模型層與層之間的關係,這個關係是用層與層之間的內積來定義的。層與層之間的特徵關係更能表達一種提取的手段,讓student學到這種方式更像授人以魚不如授人以漁。所以,模仿生成的老師的特徵對學生來講多是一個困難的約束。從老師那裏學習解決問題的過程是很重要的。更具體地,對學生進行訓練以使跨不一樣層和跨多個訓練實例計算的教師和學生FSP矩陣之間的L2差別最小。FSP矩陣是指一個卷積網絡的兩層計算層特徵圖的關係,見下圖所示,用Gramian矩陣去描述此種關係。教師網絡的「知識」以數個FSP矩陣的形式被提取出來。最小化教師網絡和學生網絡的FSP矩陣,知識就從教師蒸餾到學生。

先根據teacher模型的 FSP 矩陣調整student模型參數,使得student模型層間關係也和teacher模型的層間關係相似;而後直接用原損失函數繼續精調student模型參數。

3.2 協同窗習

Deep Mutual Learning

深度互學(DML)原理圖。

多個學生能夠互相學習嗎?真的須要一個強大的老師嗎? 提出「深度互學習」 (相互學習,如下縮寫爲DML)方法,不一樣於模型蒸餾中預約義的靜態教師和學生之間的單向(one way)遷移,DML是一組學生在整個訓練過程當中協做學習、相互教導,使得小網絡之間可以互相學習。大概就是古人云「三人行必有我師焉」這個意思。具體來講,每一個網絡在學習過程當中有兩個損失函數:

  • 傳統的監督損失函數,採用交叉熵損失來度量網絡預測的目標類別與真實標籤之間的差別
  • 網絡間的交互損失函數,採用KL散度來度量兩個網絡預測機率分佈之間的差別

公式表示爲:

採用這兩種損失函數,不只能夠使得網絡學習到如何區分不一樣的類別,還可以使其參考另外一個網絡的機率估計來提高自身泛化能力。


Large scale distributed neural network training through online distillation

該工做提出了Codistillation的概念,經過大規模實驗,發現codistillation方法提升了準確性並加快了訓練速度,而且易於在實踐中使用。在線蒸餾(online distillation)可以使用額外的並行性來適應很是大的數據集,而且速度提升一倍。特色是(1)全部模型使用相同的架構;(2)使用相同的數據集來訓練全部模型;(3)在任何模型徹底收斂以前使用訓練期間的distillation loss;(4)丟掉teacher和student的區分,互相訓練,也是有好處的。

3.3 多個Teachers

Improved knowledge distillation via teacher assistant

從直觀和經驗上觀察,當學生和教師之間的差距較大時,學生的網絡性能會降低。給定一個固定的學生網絡,一我的不能僱傭任意大的老師,或者換句話說,一個老師能夠有效地把知識傳授給必定規模的學生,而不是更小的學生。爲了減輕這個缺點,引入了多步KD,它採用了一箇中等規模的網絡(教師助手)提高知識提取能力,減少學生網絡與老師網絡之間的鴻溝。本文介紹了教師助理知識蒸餾方法(TAKD),以及稱爲教師助理(TAs)的中間模型。TA模型是從教師網絡那裏提煉出來的,而學生僅從TA裏蒸餾出來。 也能夠執行多步TA蒸餾,例如,蒸餾路徑能夠爲 10 \rightarrow 6 \rightarrow 4 \rightarrow 2.

Learning from multiple teacher networks

與多位教師進行KD的一種簡單方法是訓練學生的預測與多位教師的平均預測之間的交叉熵損失。一個更有效的方法是用一個相對差別(RD)損失來擴大這一點,該損失定義在爲學生和教師集合之間的一個三重實例生成的中間層輸出上。對於學生,選擇了中間層。對於每一個教師,咱們選擇的這一層,使大多數教師與投票策略下的順序關係一致。討論了給一位學生和一位老師的RD損失。考慮三個實例  (x_i, x^+_i , x^−_i) ,使得在教師網絡的中間層, x^+_ix_i 的激活距離小於 x^-_ ix_i 的激活距離。對於實例 x_i ,設 p_i 是學生的中間輸出,  (x_i, x^+_i , x^−_i) 的RD損失由 max(0, d(p_i, p^+_i ) )-d(p_i, p^-_i) + δ) 定義的,d是距離函數, \sigma 是一個小常數防止平凡解。爲了將這個損失函數定義擴展到多個教師,給定xi的實例 x^+_ix^-_i 之間的順序是根據教師之間的多數票決定的。

3.4 對抗的方法

Knowledge distillation with adversarial samples supporting decision boundary

咱們應該如何爲KD選擇實例,使學生訓練快速收斂而有效?分類器的泛化性能與其決策邊界的充分性密切相關,所以一個好的分類器具備良好的決策邊界。從分類的決策邊界角度分析,知識遷移過程亦可理解爲教師網絡誘導學生網絡有效鑑別決策邊界的過程,鑑別能力越強意味着模型的泛化能力越好。爲了實現這一目標,利用對抗性攻擊發現支持決策邊界的樣本,而後基於這些樣本訓練學生分類器。

爲了得到接近決策邊界的信息樣本,利用對抗攻擊策略(adversarial attacking)將基準類樣本(base class sample)轉爲目標類樣本、且位於決策邊界附近(BSS: boundary supporting sample),進而利用對抗生成的樣本誘導學生網絡的訓練,可有效提高學生網絡對決策邊界的鑑別能力。一般,對抗性攻擊試圖找到一個能夠改變樣本類的小修改,也就是說,它試圖將樣本移出附近的決策邊界。邊界支持樣本(BSS)是一個位於教師分類器決策邊界附近的對抗性樣本。BSS是經過一個基於分類分數上定義的損失函數的梯度降低方法得到的,它包含了從基本樣本到決策邊界的距離和路徑方向的信息。

Knowledge Distillation with Conditional Adversarial Networks

基於gan的體系結構以學習損失爲知識的精餾。深度和廣度的教師是預先訓練離線。學生網絡和鑑別器是交替更新的,鑑別器的目的是區分學生和教師網絡的日誌,而學生的目的是欺騙鑑別器。額外的監督損失增長了學生和鑑別器。

基於一種可學習損失函數——GAN,知識經過一個判別器從教師向學生轉移的方法。判別器(2層MLP)通過訓練以區分輸出logits是來自教師網絡仍是學生網絡,而學生(生成器)通過對抗性訓練以欺騙判別器,即,輸出logits與教師logits相似,所以 區分者沒法區分。這種生成-對抗的推拉之下,使得student很好的學到了來自teacher的知識,完成知識蒸餾。在基於gan的方法中,學生和判別器是交替更新的。判別器的每層節點數與logits的維數相同,類別C的數量。判別器D的輸出是一個C+2維向量,帶有C標籤預測和真實/虛假預測。

使用殘差結構的MLP做爲Discriminator,訓練Disc的損失函數是二值交叉熵

在判別器中也施加類別信息做條件,判別器的輸出是一個C+2維的向量。C是類別數目。

Knowledge distillation with generative adversarial networks

該框架由一個分類器(student net)、一個teacher net和一個discriminator組成。分類器和教師經過蒸餾損失相互學習,並經過對抗性損失對分類器進行對抗性訓練。在每一個epoch中,咱們首先訓練判別器,而後是教師,最後是學生分類器。D的目標是將正確區分真標籤和僞標籤的機率最大化,而C和T的目標是將D拒絕其生成的僞標籤的機率最小化。C經過模仿已知的T的分佈來學習T。T也向C學習。

3.5 蒸餾Transformer

Extreme language model compression with optimal subwords and shared projections(Google

本文引入了一種全新的知識蒸餾技術,用以訓練縮減詞表、嵌入與隱藏維度也較低的student模型。具體來講,就是部署了一套雙重訓練機制,同時訓練teacher模型和student模型,以得到針對student模型詞彙量的最佳單詞嵌入機制。將此方法與分享投影矩陣(shared projection matrices)的學習相結合,將分層知識自teacher模型傳遞至student模型。這種方法能夠將基於BERT的模型壓縮60倍以上,而下游任務僅有極少下降,所以語言模型的佔用空間僅不到7MB。

右邊是預訓練的原始BERT(30K vocab,768 hidden state dimension,左邊是student BERT(5K vocab,48 hidden state dimension),transformer層旁邊的矩陣表明teacher和student model的參數,U,V是變換矩陣,將高維參數變爲student的低維參數,對於全部維度相同的層是共享的。
  • Dual Training

如圖1所示,給定輸入序列[' I '、' like '、' machine '、' learning ']到 teacher 模型,單詞' I '和' machine '使用teacher詞彙(綠色部分)進行分段,而' like '和' learning '使用student詞彙(藍色部分)進行分段,來混合教師詞彙和學生詞彙表,但願藉此從teacher embeddings以及模型參數中有效地學習student embeddings,同時保持 student 模型的輸入序列不變。該模型針對老師和學生的詞彙使用不一樣的softmax層,具體取決於使用哪一層來分割所討論的單詞。因爲兩個模型在訓練中須要同步更新,咱們還須要保證其輸入序列是徹底一致的。按照教師和學生詞彙對相同單詞的表示方式進行對齊。訓練任務依舊是 Bert 的 Masked LM:請注意,咱們僅對教師模型輸入執行雙重訓練:學生模型接收僅使用學生詞彙進行細分的單詞。在 teacher 模型提早適應 student 的詞表,實質上是預訓練了兩組獨立的 embedding 和 pre-softmax 。前者用於 teacher 本身分詞器的綠色序列片斷,後者用於兼容 student 分詞器的藍色序列片斷 。在聯合訓練中,爲保證兩邊一致性,需在 teacher直接使用student的分詞器和對應的 embedding 和 pre-softmax 矩陣參數。

  • Shared Variable Projections

因爲學生詞彙表不是教師詞彙表的完整子集,這兩個詞彙表可能對同一單詞的標記不一樣的現象。致使用於MLM任務的教師和學生模型的輸出空間就不一致了,即便兩個詞彙表之間的重疊程度很高(接近94%),也須要從頭開始訓練學生的embeddings,不能繼續在 softmax 層作監督訓練。做者但願最小化teacher model與student model的參數之間的信息損失,所以須要把它們映射到相同的空間,引入降維損失來對齊teacher和student的訓練參數:

同理,升維損失:

即,對於網絡中的任一組可學習參數,讓其在 student 模型中的\theta_s'經過矩陣變換,去擬合 teacher 模型中對應的\theta_t'

總體訓練損失,是交叉熵損失和遷移 損失的組合:

左半部分是 student 模型的交叉熵,右半部分是 teacher 模型的交叉熵。teacher 在整個知識蒸餾訓練的過程當中和 student 模型同步更新。


Patient knowledge distillation for bert model compression(Microsoft )

PKD-for-BERT-Model-Compression

所提出的用於BERT模型壓縮的"耐心知識蒸餾"方法的模型架構。 (左)PKD-Skip:學生網絡每2層學習一次老師的輸出。 (右)PKD-Last:學生從最後6層學習老師的輸出。 Trm:Transformer。

提出了一種名爲「耐心知識蒸餾」的方法,將原始的大模型(teacher)壓縮成效果相等的輕量級淺層網絡(student)。做者認爲,對於 Bert 這樣的複雜網絡,只使用 soft-label 的 L_{DS} 進行蒸餾容易過擬合而影響模型的泛化能力,與以前僅使用teacher網絡最後一層的輸出進行知識蒸餾方法不一樣,student模型從teacher模型的多箇中間層學習,從網絡的中間層引入新的學習目標,並遵循兩種策略:一是PKD-Last:從最後的k層開始學習;二是PKD-Skip:從每一個k層開始學習。這兩種耐心知識蒸餾方案都可以利用teacher模型隱藏層信息,鼓勵student模型經過多層蒸餾向teacher模型學習。

Bert模型中有個特殊字段[CLS],在蒸餾過程當中,讓student模型去學習[CLS]的中間的輸出。對於中間層的學習,使用的損失函數是均方差函數:

之因此取 [CLS] ,大概是由於其在 BERT 分類任務中的重要性。

計算 soft-label 和 Student 輸出的交叉熵:

最後的損失函數爲L_{CE} \ L_{DS} \ L_{PT}的加權和:


DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter(Hugging Face

huggingface/transformers

DistilBERT把 Bert 從 12 層壓縮到 6 層,以 3% 的準確度代價換來 40% 的參數壓縮和 60% 的預測提速。把 12 層的 teacher 網絡,保留 embedding 層和 pooling 層,其餘部分隔一層去掉一層,就獲得了初始化的 6 層 student 網絡。採用了RoBERTa的優化策略,動態mask,增大batch size,取消NSP任務的損失函數,只保留了 MLM。利用teacher的軟標籤和teacher的隱層參數來訓練student網絡。


訓練時的損失函數定義爲三種損失函數的線性和,分別爲:

  •  _{  } 。是teacher網絡softmax層輸出的機率分佈和student網絡softmax層輸出的機率分佈的交叉熵。
  •  _{   } 。是student網絡softmax層輸出的機率分佈和真實標籤的交叉熵。也就是student模型作預訓練的MLM損失。
  •  _{   } 。是student網絡隱層輸出和teacher網絡隱層輸出的餘弦類似度值,利於讓student學習和teacher同樣的隱狀態。student的網絡層數只有6層,teacher網絡的層數有12層,用student的第1層對應teacher的第2層,student的第2層對應teacher的第4層,以此類推。

Tinybert: Distilling bert for natural language understanding

TinyBERT引入了一個全新的兩階段學習框架,在預訓練階段和特定任務學習階段都會執行Transformer蒸餾方式,確保TinyBERT能夠捕獲BERT中的通常領域及特定任務領域,包含通用蒸餾和特定於任務的蒸餾以下圖所示:

TinyBERT 兩階段訓練 蒸餾示意圖

TinyBERT應用的KD方法還對embedding層、每一個transformer layer中的多頭注意力層、以及每一個transformer layer輸出的hidden states這三部分進行蒸餾。

Embedding-layer Distillation:把 student 的 embedding 投影到 teacher embedding 所在的空間,再算 MSE,獲得 embedding loss.

Transformer-layer Distillation:TinyBERT 的 transformer 蒸餾採用隔 k 層蒸餾的方式。每層的 transformer loss 又分爲兩部分組成,注意力蒸餾 和 隱藏狀態蒸餾。

Prediction-Layer Distillation:TinyBERT 中,這個 loss 是 teacher BERT 預測的機率和 student BERT 預測機率的 softmax 交叉熵。

經過以上幾個蒸餾目標,能夠整合 teacher 和 student 網絡之間對應層的蒸餾損失:

其中,


MobileBERT: Task-Agnostic Compression of BERT by Progressive Knowledge Transfer

MobileBERT 被設計成和 BERT(LARGE)同樣深,而每一層都經過採用 bottleneck 結構和平衡注意力機制和前饋網絡進而使其變得更加狹窄(圖 1)。爲了訓練 MobileBERT,首先訓練了一個特殊設計的教師模型,一個包含 BERT(LARGE)模型(IB-BERT)的 inverted-bottleneck 模型。MobileBert: 自下而上的知識轉移: 將 Bottleneck BERT-LARGE teacher 的知識傳遞給student。先訓練teacher,而後逐步從下網上訓練student,要求它一層一層地模仿teacher。

特徵映射遷移(FMT)

因爲BERT中的每一層僅僅是將前一層的輸出做爲輸入,因此在逐步訓練學生網絡時,最重要的是每一層的feature maps應該儘量接近於教師的feature maps,即優化的。其中,以學生與教師歸一化特徵圖的均方偏差爲目標:



其中l爲層索引,T爲序列長度,N爲特徵映射大小。增長層間歸一化以穩定層間訓練損失。 還最小化了特徵圖轉換中均值和方差的兩個統計差別:



µ和σ2表明均值和方差。實驗代表,在BERT中去除層標準化以減小推理延遲時,最小化統計差別是有幫助的。

注意力遷移(AT)

BERT中的注意分佈能夠檢測出詞語之間合理的語義和句法關係。

這激發了咱們使用來自優化過的教師的「自我注意maps」來幫助訓練學生在加強到「feature map transfer」的過程當中。特別是,咱們最小化了教師和學生的pre-head的(head平均的)注意力分佈的kl-散度:


A是attention heads的數目。

預訓練蒸餾 (PD)

除了 layer-wise 的知識遷移,咱們也能夠在訓練前使用知識蒸餾損失。咱們使用原始掩碼語言建模(MLM)損失、下一句預測(NSP)損失和新的 MLM 知識蒸餾(KD)損失的線性組合做爲預訓練的蒸餾損失:

其中α是(0,1)中的超參數。


鑑於上述目標,在訓練中能夠有各類組合策略。本文討論了三種策略。

輔助知識遷移 在該策略中,咱們將中間知識遷移做爲知識蒸餾的輔助任務。咱們使用單個損失,它是來自全部層的知識遷移損失和預訓練蒸餾損失的線性組合。

聯合知識遷移 然而,IB-BERT 教師的中間知識(即注意力映射和特徵映射)可能不是 MobileBERT 學生的最佳解決方案。所以,咱們建議將這兩個損失項分離開來,首先對 MobileBERT 進行 layer-wise 知識遷移損失聯合訓練,而後經過訓練前蒸餾進一步訓練。

漸進式知識遷移 人們還可能擔憂,若是 MobileBERT 不能徹底模仿 IB-BERT 教師,來自較低層的錯誤可能會影響較高層的知識遷移。所以,咱們建議在知識遷移的各個層面上逐步進行訓練。漸進式知識遷移分爲 L 個階段,其中 L 是層的數目。

圖 2 展現了這三種策略的示意圖。對於聯合知識遷移和漸進知識遷移,在 layer-wise 知識遷移階段,初始嵌入層和最終分類器沒有知識遷移。它們被 從 IB-BERT 老師複製了到 MobileBERT 學生。此外,對於漸進式的知識遷移,當咱們訓練第 l 層時,會凍結下面各層中全部可訓練的參數。在實踐中,能夠將訓練過程軟化以下。當訓練一個層時,咱們進一步調整較低層的學習速度,而不是徹底凍結。

BERT-of-Theseus: Compressing BERT by Progressive Module Replacing

因爲針對bert的蒸餾方法,大多數直接做用在bert預訓練階段或者設計一些loss來計算模型間的差別程度,每每須要耗費大量時間、大量成本作精調。所以,bert-of-theseus提出了利用module replacing的方式來作模型壓縮。本文針對的是bert模型的壓縮,transformer layer做爲module的基本元素。咱們將原始的模型簡稱爲 P_{model} ,壓縮後的模型簡稱爲 S_{model} 。假設咱們模型層數的壓縮比爲m=2,即壓縮一半的層數。原始bert-base爲12層,壓縮後爲6層,那麼對於S_{model}來講,第i個module爲 scc_i,0<=i<6 ,每一個module包含一個transformer layer。對於P_{model},咱們將12層分隔成6個module,每一個module包含兩個transformer layers,獲得 prd_i , 0<=i<6 ,此時咱們能夠將 scc_iprd_i 創建一對一的映射關係。以後咱們就能夠進行正式的壓縮步驟了。

整個過程都是在具體某個NLP下游任務的finetune階段實施,而不是在預訓練階段。同時咱們須要預先使用12層原始bert模型先finetune出一個好模型做爲 P_{model} 。爲了加速整個訓練過程,咱們使用P_{model}的部分權重來初始化 S_{model} 的全部module,最簡單的作法是將前六層的P_{model} transformer layer權重直接賦值給 S_{model} 的六層transformer layer。

整個過程分爲兩個階段,第一階段是模塊替換訓練階段,這一段同時考慮了P_{model}S_{model},讓兩個模型都參與到訓練中;第二階段爲單獨 S_{model} 的finetune階段,目的是爲了讓全部 S_{model} 的模塊完整參與到訓練任務中。具體過程以下:

module replace training

module replace的基本思想很簡單,就是在訓練時將 S_{model} 的某一個module平行替換掉 P_{model} 的對應module。固然咱們不會將每一個prd_i  都替換掉,這就至關因而直接用6層的bert進行finetune了。假設當前第i個module的輸出爲 y_i ,則原始模型第i+1個module的前向計算輸出爲: y_{i+1}=prd_i(y_i) 。下面給出module replace後的計算過程:

一、假設當前處理第i+1個module,咱們經過一個伯努利分佈,採樣一個隨機變量 r_{i+1} \sim Bernoulli(p) ,其中採樣的機率爲p, r_{i+1} 有p的機率爲1,1-p的機率爲0。

二、第i+1個module的最終輸出以下: y_{i+1}=r_{i+1}*scc_i(y_i)+(1-r_{i+1})*prd_i(y_i) 。咱們能夠將 r_{i+1} 看作是一個hard型控制門,控制當前module是使用原始的雙層layers仍是簡化後的單層layer。替換的流程可參見論文配圖:

三、整個綜合模型仍然使用下游任務loss來進行finetune訓練。這裏須要關注一個訓練細節:在梯度傳遞的時候,全部屬於 P_{model} 的權重參數都freeze不參與梯度計算,而S_{model} 的相關module權重參數會參與梯度更新

S_{model} finetune和inference

第一階段結束後,因爲每一個step訓練時,只會有部分不一樣的 scc_i module參與到訓練中,全部的 scc_i 並無整合到一塊兒參與到任務訓練中。所以須要添加一個post-training過程,將全部scc_i從新組合成完整的transformer,並沿用 P_{model} 的embedding layer和output layer(由於以前訓練時這些權重參數都是freeze的,能夠直接拿來用),在相同的訓練數據和下游任務場景下進行finetune。

對於第一階段訓練時將 P_{model} 的權重freeze不參與訓練,我的認爲其緣由多是 P_{model} 的權重在一開始的原始finetune階段已經達到一個較爲穩定的狀態,若是此時讓其參與到和 S_{model} 的整合訓練中,反而會致使遺忘問題。另外,咱們的目的是讓 scc_i module儘可能獲得更新,若是讓 prd_i module參與到梯度更新,可能會讓 scc_imodule被忽略。另外,freeze prd_i 的權重也能提高整個模型訓練的效率,減少模型訓練所需的steps。固然,這個是我我的的觀點,若是有同窗有深刻的研究,歡迎一塊兒討論。

替換機率策略

對於整個方法來講,除去原始NLP任務中的超參數外,只有一個超參數須要關注,即替換機率p。通常來講,使用一個常量0.5就能夠達到比較不錯的效果(親測)。可是論文還提出了一個線性策略來爲每一個訓練step設置不一樣的替換機率,其具體公式以下:

p_d=min(1,\theta(t))=min(1,kt+b)\\

其中,t表示當前的訓練step。k表示每一個step的增加率,b表示初始的替換機率。經過這種策略,在初始階段,咱們的讓更多的 prd_i 參與進來,可以提高整個模型的質量,獲得更小的loss,從而使得整個訓練過程平滑不會過於震盪;在訓練後期,咱們的模型總體都比較好了,此時可讓更多的 scc_i 參與進來,讓模型逐漸擺脫對prd_i的依賴,使得咱們可以平穩過分到第二階段。

另外,在替換訓練初始階段,對於 \theta(t)<1 ,咱們計算全部scc_i的指望學習率: lr'=(np_d/n)lr=(kt+b)\\

其中, np_d 表示訓練過程當中咱們獲得的替換模塊數量的指望值,lr表示整個訓練咱們設置的學習率。能夠看到,咱們至關於在訓練階段間接得給學習率應用了一個warm-up策略,間接得提高了模型訓練的效率。


Improving BERT Fine-Tuning via Self-Ensemble and Self-Distillation

本文提出了一種自集成和自蒸餾的fine-tuning方法,在不引入外部資源和不顯著增長訓練時間的前提下,能夠進一步加強fine-tuning的效果。

自蒸餾(Self-Distillation)指的是本身蒸餾到本身,Teacher Model就是Student Model的集成版本,稱爲自集成(Self-Ensemble)。本文的自蒸餾指的是過去time step蒸餾到當前time step。在Fine-tune過程當中,目標函數除了有來自標籤的監督信號之外,還有來自過去time step的監督信號。提出了兩種自蒸餾的方式:Self-Distillation-Averaged(SDA)和Self-Distillation-Voted(SDV)。

自集成方式

因爲訓練多個BERT模型會帶來不少時間和計算資源的消耗,所以本文借鑑參數平均的方式提出了自集成的方式。

在自集成方式中包括兩個模型,將其命名爲模型A和模型B,模型B在訓練過程當中參數會不斷更新,而模型A的參數是模型B在T個訓練時間步內全部參數的平均值。假設T爲2,模型B在通過第一個時間步之後,參數爲[1,2,3,4],通過第二個時間步之後參數更新爲[5,6,7,8],則通過2個時間步之後模型A的參數爲[(1+5)/2,(2+6)/2,(3+7)/2,(4+8)/2)]。

Self-Distillation-Average(SDA)

本文在自集成方式的基礎之上,首先計算出過去K個time step參數的平均值做爲Teacher Model,進一步利用蒸餾的方式來提高模型效果。在該方法中一樣包括兩個模型,分別稱做student model和 teacher model,其中student model損失函數的值由如下兩部分損失函數值相加構成:
1)預測值和真實標籤之間的交叉熵損失函數值
2)student model和teacher model輸出值之間的均方偏差值

Self-Distillation-Voted(SDV)

與SDA方法的不一樣之處在於,SDV方法將teacher model替換爲自投票模型,將過去K個time step的參數視爲K個Teacher Model。student model和自投票模型之間的均方偏差一樣做爲損失函數值得一部分。


FastBERT: a Self-distilling BERT with Adaptive Inference Time

FastBERT在每層Transformer後都去預測樣本標籤,若是某樣本預測結果的置信度很高,就不用繼續計算了。論文把這個邏輯稱爲樣本自適應機制(Sample-wise adaptive mechanism),就是自適應調整每一個樣本的計算量,易分辨的樣本經過一兩層就能夠預測出來,較難分辨的樣本則須要走徹底程。

BERT模型稱爲主幹(Backbone),每一個分類器稱爲分支(Branch)。

要注意的是,這裏的分支Classifier都是最後一層的分類器蒸餾來的,做者將這稱爲自蒸餾(Self-distillation)。就是在預訓練和精調階段都只更新主幹參數,精調完後freeze主幹參數,用分支分類器(圖中的student)蒸餾主幹分類器(圖中的teacher)的機率分佈

之因此叫自蒸餾,是由於以前的蒸餾都是用兩個模型去作,一個模型學習另外一個模型的知識,而FastBERT是本身(分支)蒸餾本身(主幹)的知識。值得注意的是,蒸餾時須要freeze主幹部分,保證pretrain和finetune階段學習的知識不被影響,僅用brach 來儘量的擬合teacher的分佈。

模型訓練與推理

瞭解模型結構以後,訓練與推理也就很天然了。只比普通的BERT模型多了自蒸餾這個步驟:

  1. Pre-training:同BERT系模型是同樣的,網上那麼多開源的模型也能夠隨意拿來~
  2. Fine-tuning for Backbone:主幹精調,也就是給BERT最後一層加上分類器,用任務數據訓練,這裏也用不到分支分類器,能夠盡情地優化
  3. Self-distillation for branch:分支自蒸餾,用無標籤任務數據就能夠,將主幹分類器預測的機率分佈蒸餾給分支分類器。這裏使用KL散度衡量分佈距離,loss是全部分支分類器與主幹分類器的KL散度之和
  4. Adaptive inference:自適應推理,及根據分支分類器的結果對樣本進行層層過濾,簡單的直接給結果,困難的繼續預測。這裏做者定義了新的不肯定性指標,用預測結果的熵來衡量,熵越大則不肯定性越大:

Uncertainty = \frac{\sum_{i=1}^Np_s(i)logp_s(i)}{log(1/N)}  \\


Minilm: Deep self-attention distillation for task-agnostic compression of pre-trained transformers

本文提出了一種將基於 Transformer 的預訓練大模型壓縮成預訓練小模型(更少的層數和更小的隱層維度)的通用方法:深度自注意力知識蒸餾(Deep Self-Attention Distillation)。其核心思想是最大程度上將預訓練 Transformer 模型中很是重要的自注意力(Self-Attention)知識遷移給小模型。須要特別提出的是,咱們只遷移預訓練大模型最後一層的自注意力知識。該方法主要有如下幾個優勢:

1) 壓縮方法簡單有效,能夠應用在不一樣的預訓練 Transformer 模型上。不一樣模型上的實驗結果也驗證了這一點。

2) 只需遷移大模型最後一層的自注意力知識,將遷移的知識進一步簡化,提高訓練速度。

3) 對小模型層數和隱層大小沒有限制,讓小模型的結構更加靈活。

3.6 小結

總之,KD是一種流行的基於文本的建模方法。各類方法都提出了使用logits、softmax輸出、注意子層輸出、Value關係、相對差別信息從最後一層和教師中間層複製信息的方法。在詞彙表、注意頭數量和隱藏層大小等方面,已經提出了許多方法來處理複雜的師生配置不匹配。。另外,還發現KD在複雜的問題設置(例如多語言任務和具備大量類的任務)中很是有效。 向嘈雜的老師、老師助理學習,多個老師也被發現是有效的。


4.1 嵌入矩陣中的參數共享

給定一個權值矩陣W和預約K,想要共享W中的權值以得到K個惟一值的最大值。

HashedNets使用低成本哈希函數(如xxhash3)將鏈接權重隨機分組到散列桶中,而且在同一個散列桶中的全部鏈接共享單個參數值。

參數共享的另外一種方法是在遞歸模型中跨層共享低秩因子。首先用矩陣分解表示權矩陣 W = W_aW_b 。矩陣分解和參數共享的結合致使了大模型壓縮。

壓縮嵌入矩陣的另外一種方法是將詞彙V分別劃分爲頻繁詞集B和不頻繁詞集C。非頻繁詞「嵌入」用頻繁詞表示,採用稀疏線性組合。在字典中,一個不熟悉的詞一般是由經常使用詞定義的。每一個公共詞都有一個密集的嵌入;另外一方面,一個不常見的單詞,經過普通單詞的嵌入的稀疏組合來計算它的向量表示。這種壓縮對於單詞嵌入矩陣和RNNs/LSTMs的輸出層都頗有用。

LightRNN將單詞嵌入矩陣 O(|V |) 壓縮爲 O(\sqrt{|V |}) ,使用兩個組件共享嵌入來表示單詞。將詞彙表中的每一個單詞分配到一個單詞分配表中,其中每一行與一個學習向量相關聯,每一列與另外一個學習向量相關聯。上表顯示了一個單詞分配表的示例。根據單詞在表中的位置,它由兩個組件聯合表示:行向量和列向量。所以,咱們只須要 2\sqrt{|V |} 向量來表示的詞彙表 |V| 惟一的單詞,它們遠遠小於|V|向量。輸入和輸出使用不一樣的嵌入行/列向量,可是它們共享相同的單詞分配表。詞分配表的建立使用一個自舉程序來迭代地改進基於學習到的單詞嵌入的單詞分配。

Skipgram訓練方法將每一個大小爲D的嵌入向量分割爲大小相等的B個子向量所以 D = B×C 。分配有限數量的參考向量到每一個塊的塊分割向量。若是咱們爲每一個塊分配K個參考向量,則參考向量的數量將變爲K×B。每一個參考向量的大小爲 C

4.2 Transformer參數共享

ALBERT採用了兩種參數壓縮技術:(1)分解嵌入參數化:即將大詞彙嵌入矩陣分解爲兩個小矩陣。所以,它減小了嵌入參數從 O(V × H)O(V × E + E × H) ,其中 H >> E 。(2)跨層參數共享:共享參數的方式有多種,如僅共享前饋網絡(FFN)參數跨層,或僅共享注意力參數。ALBERT的默認決策是跨層共享全部參數。與BERT-large類似的ALBERT配置少了18倍的參數,訓練速度也快了1.7倍。

Universal transformers,編碼器層數不是預先決定的,全部的編碼器層共享參數。某些符號(例如某些單詞或音素)一般比其餘符號更模棱兩可。所以,爲這些比較模糊的符號分配更多的處理資源是合理的。所以,模糊符號比非模糊符號經歷更多的自我注意轉換。所以,它們提供了一種動態的按位置中止機制,以便在將表示形式做爲輸入傳遞給譯碼器以前,動態地調整處理每一個輸入符號所需的計算步驟數(稱爲「思考時間」)。

4.3 小結

除了模型壓縮以外,參數共享方法也起到了很好的調節做用。 Transformer中的參數共享很是成功。 參數共享方法也已經普遍用於壓縮嵌入矩陣。

5.1 Two Low-Rank Factors

除了奇異值分解,矩陣分解的另外一種方法是稀疏編碼。使用稀疏編碼來分解單詞嵌入矩陣。所以,給定大小爲V的詞彙表,單詞嵌入矩陣 X∈R^{L×V} ,稀疏編碼的目的將每一個輸入向量 x_i 表示爲基向量 a_i 的稀疏線性組合。

結合剪枝和矩陣分解進行模型壓縮。設 W 爲權值矩陣。有組織的修剪(刪除一個神經元,即從權值矩陣中刪除一列),能夠經過將計算 W x 替換爲 W Gx 來實現,其中對角稀疏誘導矩陣 G 是利用 W G 上的 L_0 正則化以及監督損失來學習的。這有效地刪除了列索引k且 z_k = 0 的W的列子集。一個限制是,這種結構化的剪枝方法比非結構化的剪枝方法產生的性能更低。所以,在FL0P( L_0 修剪因子)模型中,咱們首先分解 W = PQ 。令r爲P的#列(或等效地爲Q的行), p_kq_k 分別爲 P 的第k列 , Q 的第k行。 我經過爲每一個組件引入修剪變量 z_k 來實現結構化修剪。 W = P GQ = \sum_{k=1}^{r}zk × (p_kq_k) ,G也是修剪變量的對角矩陣。通過訓練,只須要存儲非零對角值對應的列和行,結果會小得多(但仍然稠密)矩陣 PQ G 的非零值能夠被任意一個吸取到 PQ 中。這種帶因子分解的結構化剪枝比普通的結構化剪枝更有效。

5.2 Factorizing into Block Diagonal Matrices

語言模型的最後一層很大,其大小爲HV,其中H是隱藏層的大小,V是詞彙量。 每一個詞由大小相同的嵌入輸出H組成。一種差別化的softmax方法,該方法根據模型容量對給定單詞的適合程度,在單詞之間改變輸出嵌入的尺寸。特別是,將更多的參數分配給頻繁的單詞比分配給罕見的單詞更有意義。根據定義,頻繁詞比罕見詞在訓練數據中出現的頻率更高,所以容許擬合更多的參數。它們根據單詞頻率定義輸出詞彙的分區,而且每一個分區中的單詞具備相同的嵌入大小。劃分的結果是一個稀疏的最終權值矩陣,它將輸出詞的嵌入安排在塊中,每一個塊對應一個單獨的劃分。最終隱藏層H的大小爲分區的嵌入大小之和。雖然該方法不涉及建立多個因子,但它將原始矩陣分解爲多個塊,而將其他部分設置爲0。

5.3 Tensor Train and Block Term Decomposition

張量列分解(Tensor train decomposition, TTD)是一種標準的張量分解技術,它將一個高維張量分解爲多個二維和三維張量,這些張量相乘後能夠重構出原始張量。這些因素稱爲TT-cores,其尺寸稱爲TT-ranks。TTD可用於壓縮RNNs和LSTMs中的各類權重矩陣。第一步是經過簡單的變形變換將一個矩陣表示爲多維張量,而後在其上使用TTD。TTranks的值直接定義了壓縮比,所以選擇它們過小或太大,要麼會致使性能顯著降低,要麼會致使參數的數量減小不多。一般,對於小矩陣,tt -rank在16左右,對於大矩陣,tt -rank在64-192左右,能夠很好地平衡壓縮比和感興趣的精度度量。此外,當咱們使用TTD做爲權重矩陣時,咱們還須要適當地改變輸入以使其在維數方面兼容。

BTD將高階張量分解爲多個Tucker分解模型的總和。輸入與隱藏狀態之間的冗餘密集鏈接首先被拉緊爲一個d維張量,而後使用低秩BTD分解爲N個不一樣Tucker分解位置的和,其中N爲CP-rank。每一個Tucker分解依次由一個核心d維張量和d三維因子張量組成。

5.4 小結

總而言之,矩陣分解技術一般在帶有參數共享的cmombination中使用。 它們在處理RNN和LSTM中的大型輸入/輸出嵌入矩陣方面很是有效。 SVD,Tensor Train,CP,Tucker,BTD是最流行的分解技術,被發現可用於模型壓縮。


6.1 Sparse Transformers

OpenAl 的論文Generating Long Sequences with Sparse Transformers 提出了稀疏的Transformer,其中注意矩陣的稀疏分解將 O(N^2) 複雜度下降到 O(n\sqrt{n}) 。OpenAI的研究人員在最新的論文中爲注意力矩陣引入了多種稀疏的分解方式,經過將徹底注意力計算分解爲多個更快的注意力操做,經過稀疏組合來進行稠密注意力操做,在不犧牲性能的狀況下大幅下降了對於內存和算力的需求。

上圖中間是第一種步進注意力(strided attention的版本,大概等同於每個位置須要注意它所在的行和列;另外一種固定注意力(fixed attention)的方式則在最新的列元素以後處理固定列和元素,這種方式對於非二維結構的數據有着很好的效果。

6.2 Star-Transformers

將模型複雜度從 O(n^2) 下降到 O(2n) ,Star-Transformer 在注意力機制的計算上進行了優化,構建了一個星狀的結構,全部序列中直接相鄰的元素能夠直接相互做用,而非直接相鄰的元素則經過中心元素實現間接的信息傳遞。

如圖右所示,Star-Transformer 的星型結構中,有兩種節點:

  • 衛星節點(Satellite nodes):相似計算機網絡中終端,衛星節點每個節點都和中繼節點連接,在序列表示中,一個Token表明一個衛星節點。
  • 中繼節點(Relay Node):相似計算網絡中的中繼器,充當Token交互的橋樑。

結構中也有兩種連接:

  • 輻射連接(Radical Connections):終端和中繼的連接。有了中繼節點,每個Token能夠經過兩步的方式連接到任意非鄰居節點
  • 環形連接(Ring Connections):左右相鄰的Token互相連接,並且須要將第一個Token和最後一個Token鏈起來,組成一個環。環形連接的角色相似CNN或者雙向LSTM。

環鏈接將一個衛星節點與另外兩個衛星節點鏈接,根鏈接將一個衛星節點與中繼節點鏈接。其思想是基於衛星節點更新星中心中繼節點,而後利用星節點和鄰近衛星節點的信息更新衛星節點。

6.3 Reformer

Reformer將典型Transformer中的點積注意力替換爲使用位置敏感哈希(LSH)的Transformer,改變了其複雜性 O(n^2)O(n log n) ,其中n是序列的長度。

  • 使用可逆層(reversible layers),只存儲單層激活值的一份拷貝
  • 把FF層裏的激活值進行切分
  • 使用局部敏感哈希(LSH)注意力代替傳統多頭注意力

Reformer模型結合了兩種技術來解決注意力問題和內存分配:局部敏感哈希來減小長序列注意力的複雜度,可逆殘差層更有效的利用內存。

Q,K,V是經過三個不一樣的線性變換(矩陣)獲得的,可讓Q,K的變換矩陣相同,讓V單獨有一個。因爲softmax由最大的元素主導,對於每一個查詢 q_i ,只須要關注K中最接近 q_i 的鍵。使用LSH將位置聚類(哈希桶)到不一樣的組中,而後每一個位置須要只關注同一桶中的其餘位置。

詳細介紹參閱以前一篇:

https://zhuanlan.zhihu.com/p/139220925zhuanlan.zhihu.com圖標

6.4 Linformer

Linformer 利用自注意矩陣的低秩因數分解,在時間和空間上將總體自注意複雜性從 O(n^2) 下降到 O(n)


Multi-Head Linear Attention是線性多頭自我注意模塊,是與Linformer體系結構一塊兒提出的。主要思想是添加兩個線性投射矩陣E_i, F_i \in \mathbb{R}^{n \times k}。首先投影原始的(n×d)維 KVKW^K_iVW^V_i投射到(k \times d)維度的上下文映射矩陣\bar{P}。而後使用縮放的點積注意力計算(n×k)維上下文映射矩陣\bar{P}

\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V}) = softmax\left(\boldsymbol{Q}(\boldsymbol{E}\boldsymbol{K})^{\top}\right)\boldsymbol{F}\boldsymbol{V}\end{equation} \\

\bar{\text{head}_{i}} = \text{Attention}\left(QW^{Q}_{i}, E_{i}KW_{i}^{K}, F_{i}VW_{i}^{V}\right)

\bar{\text{head}_{i}} = \text{softmax}\left(\frac{QW^{Q}_{i}\left(E_{i}KW_{i}^{K}\right)^{T}}{\sqrt{d_{k}}}\right) \cdot F_{i}VW_{i}^{V}

最後,咱們使用計算每一個頭的上下文嵌入 \bar{P} \cdot \left(F_{i}{V}W_{i}^{V}\right)

詳細介紹參見以前的一篇

https://zhuanlan.zhihu.com/p/147225773zhuanlan.zhihu.com圖標

6.5 Sparse Sinkhorn Attention

基於稀疏Sinkhorn注意的Transformer是基於內部表示的可微排序。首先,他們將輸入序列分紅B個大小相等的塊,每一個塊的大小爲n/B。

元排序網絡學會在這些塊序列上產生潛在的排列。在給定排序序列的狀況下,能夠計算局部窗口下的擬正則注意,從而提升注意模塊的記憶效率。還提出了因果Sinkhorn平衡和因果場景的SortCut算法,用於針對編碼和/或解碼目的裁減Sinkhorn注意。這種方法將內存複雜度從 O(n^2) 下降到 O(B^2 + (n/B)^2) 。SortCut變量進一步將複雜性下降到線性時間,即 O(nk) ,其中k爲用戶定義的預約超參數,遠小於n。

6.6 Linearized Attention(核函數)

Transformer中的Attention機制Scaled-Dot Attention,形式爲:

爲了給計算複雜度下降到線性,使用核函數來簡化Attention的計算過程,而且替換掉SoftMax。

咱們能夠將任何類似函數的廣義Attention定義通常化:

爲了保留Attention的類似特性,咱們要求\text{sim}(\boldsymbol{Q}_i, \boldsymbol{K}_j)\geq 0恆成立。

咱們能夠給\boldsymbol{Q}_i,\boldsymbol{K}_j各自加個激活函數\phi

\begin{equation}\text{sim}(\boldsymbol{Q}_i, \boldsymbol{K}_j) = \phi(\boldsymbol{Q}_i)^{\top} \phi(\boldsymbol{K}_j)\label{eq:gen-att-2}\end{equation} \\重寫爲以下所示

而後利用矩陣乘法的結合能進一步簡化

當分子寫成向量化的形式時,上面的方程更簡單

請注意,特徵映射是按行向量應用於矩陣Q和K的。

本文選擇的是\phi(x)=\text{elu}(x)+1

Linear Attention最主要的想法是去掉標準Attention中的Softmax,就能夠使得Attention的複雜度下降到\mathscr{O}(n)

6.7 Big Bird

圖1:BigBird中使用的注意機制的構建模塊。白色表示注意力不集中。(a)隨機注意,r = 2; (b)滑動窗口注意,w = 3; (c)全局注意,g = 2。(d)則是前三者融合起來的Big Bird模型

Big Bird,採用稀疏注意力機制,將O(n)依賴降至線性,解決了BERT模型中的全注意力機制帶來的序列長度二次依賴限制,同時兼顧更長的上下文。Big Bird主要由三個部分組成:

  • 一組參與序列的全部部分的g全局token。
  • 對於每一個查詢 q_i ,每一個查詢將處理的r個隨機鍵的集合。
  • 一個本地鄰居塊w,以便每一個節點處理其本地結構。

主要貢獻是:

  • BigBird知足全transformer的全部已知理論性質。特別地,咱們證實了添加額外的tokens能夠將全部連續序列表示爲只有 O(n) 內積的序列函數。代表在關於精度的標準假設下,BigBird是圖靈完備的。
  • 從經驗上證實BigBird模型的擴展上下文對各類NLP任務有很大的好處。


一、Compression of Deep Learning Models for Text: A Survey

二、Pruning BERT to accelerate inference

三、Compressing BERT for faster prediction

四、Smaller, faster, cheaper, lighter: Introducing DistilBERT, a distilled version of BERT

五、騰訊技術工程:比 Bert 體積更小速度更快的 TinyBERT

六、邱震宇:模型壓縮實踐系列之——bert-of-theseus,一個很是親民的bert壓縮方法

七、許一格:微調預訓練模型的新姿式——自集成和自蒸餾

八、FastBERT:又快又穩的推理提速方法

九、如何解決NLP分類任務的11個關鍵問題:類別不平衡&低耗時計算&小樣本&魯棒性&測試檢驗&長文本分類

相關文章
相關標籤/搜索