BERT模型蒸馏有哪些方法?
?PaperWeekly 原創 ·?作者|蔡杰
學校|北京大學碩士生
研究方向|問答系統
我們都知道預訓練模型的標準范式:
pretrain-利用大量的未標記數據通過一些自監督的學習方式學習豐富的語義和句法知識。例如:Bert 的 MLM,NSP 等等。
finetune-將預訓練過程中所學到的知識應用到子任務中,以達到優異的效果。
預訓練模型在各個領域雖然帶來了巨大的提升,但是也有一些致命的問題:
預訓練模型高計算復雜度-不可能在實時系統中運行。
大存儲需求——預訓練模型一般都很大,少則幾百 M,大則幾 G,無法在有限資源的設備上部署。
所以模型壓縮和加速技術的研究迫在眉睫!
Logit Distillation
知識蒸餾最早是 Hinton 在 15 年提出的一個黑科技技術,核心思想是通過遷移知識,從而通過訓練好的大模型得到更加適合推理的小模型。
論文標題:Distilling the Knowledge in a Neural Network
論文來源:NIPS 2014
論文鏈接:http://arxiv.org/abs/1503.02531
神經網絡通常使用 “softmax” 輸出層生成每個類別的概率:
輸出層通過將 與其他 logit 進行比較,以 表示為每個類計算出的 logit。T 是溫度系數,通常設置為 1。
softmax 是一種 “soft max”,在使用 cross-entropy 計算 loss 的時候,相對的差別規模較小的 logit 值被壓縮甚至丟失。
論文中用了對 softmax 的公式進行了推導,如果 T 遠高于對數的量級,且對數為零均值,則上圖公式(4)和公式(2)和幾乎相同。在 T 非常小的情況下,梯度會接近于 qi-pi,所以當多個類別的 pi 接近于 0 時,最終輸出的相似性信息是沒有體現在梯度中的,所以網絡會忽略掉這些信息;
所以,單純的用logits來蒸餾的方法是存在一些 bias 的,那能否有更準確以及更快速的蒸餾方法呢?
Beyond Logit Distillation
論文標題:TinyBERT: Distilling BERT for Natural Language Understanding
論文來源:ICLR 2020
論文鏈接:http://arxiv.org/abs/1909.10351
代碼鏈接:https://github.com/huawei-noah/Pretrained-Language-Model
TINYBERT 提出了新的遷移蒸餾方法,蒸餾的 loss 可以從 4 個方面來構造:
Embedding Layer
Transformer Layer(Hidden States 和 Attention Matricies)
Prediction Layer
整個模型的 loss 是學生模型的每一層 loss 的求和:
構造的 Loss 都是清一色的 MSE 函數:
Embedding-layer Distillation
Hidden-layer Distillation
Self-Attention Distillation
Target Classifier Distillation
最終每一層的 loss 如下:
通過論文中的實證研究表明了 TinyBERT 的有效性,在 GLUE 上達到了與 BERT 相當(下降 3 個百分點)的效果,同時模型大小只有 BERT 的 13.3%(BERT 是 TinyBERT 的 7.5 倍),Inference 的速度是 BERT 的 9.4 倍。
此外,TinyBERT 還顯著優于當前的 SOTA 基準方法(BERT-PKD),但參數僅為為后者的 28%,推理時間僅為后者的 31%。
Curriculum Distillation
論文標題:FitNets : Hints for Thin Deep Nets
論文來源:ICLR 2015
論文鏈接:https://arxiv.org/abs/1412.6550
代碼鏈接:https://github.com/adri-romsor/FitNets
蒸餾時采用的中間層匹配本質上是一種正則化形式,Transformer 的分層蒸餾可能會導致過度正則化。
本文將 Hinton 的蒸餾 output 的 logits 的 idea 進行了擴展,不僅使用輸出的 logits,同時也用模型的中間層信息來作為 hints 來提高 student 模型的性能。通過這樣的方法可以訓練出一個 deeper 和 thinner 的 student 模型。
代表 teacher 網絡中的第一層到 hint 層的函數映射,Whint 表示其中的參數;
代表 student 網絡中的第一層到 hidden 層的函數映射,Wguided 表示其中的參數;
r 代表 hidden 層的一個額外的映射關系,Wr 是其中的參數,這是為了使得 hidden 層與 hint 層的神經元大小一致。
Fig. 1 (a) 作者選擇 FitNet 的一個隱藏層,作為學習層,去學習 teacher model 的某一層(引導層)。我們希望學習層能夠預測引導層的輸出。
Fig. 1 (b) 作者從一個訓練過的 teacher 網絡和一個隨機初始化的 FitNet 開始,在 FitNet 學習層的頂部加入一個由 Wr 參數化的回歸因子,將 FitNet 參數 WGuided 訓練到學習層,使 Eq.(3) 最小化 (Fig. 1 (b))。
最后,從預訓練的參數中,我們對整個 FitNet 的 Ws 的參數進行訓練,使 Eq.(2) 最小化 (Fig. 1 (c))。
從實驗結果上看,student 比 teacher 參數少,效果卻比 teacher 還要好,可能是因為網絡更深的原因,某種程度上說明了深層網絡的有效性,深層網絡的表示性能要更優一些。
實驗也說明了 Hint 損失的重要性,Hint 損失在某種程度上彌補了交叉熵和 KD loss 損失的信息,而這種丟失的信息在某種程度上可以被更深層的網絡來彌補。
Dynamic Early Exit
通過分辨簡單樣本和復雜樣本,有針對性的去優化網絡性能,加快 inference 的速度,具體可參考之前寫的 FastBert。
論文標題:FastBERT: a Self-distilling BERT with Adaptive Inference Time
論文來源:ACL 2020
論文鏈接:https://arxiv.org/abs/2004.02178
代碼鏈接:https://github.com/autoliuweijie/FastBERT
為了在保證模型性能的前提下提高其效率,本文提出了一種新的具有自適應推斷時間的速度可調快速 bert。推理速度可根據不同需求靈活調整,同時避免了樣本的冗余計算。此外,該模型采用了一種獨特的自蒸餾機制進行微調,有更強的計算效能與最小的性能損失。
原 BERT 模型為主干(Backbone),每個分類器稱為分支(Branch),其中分支 Classifier 都是由最后一層的分類器蒸餾而來,在預訓練和微調階段都只調整主干參數,finetune 之后主干參數 freeze,把最后一層classifier蒸餾到每一層 student classifier 中。
之所以叫自蒸餾,因為 student 和 teacher 都是由一個模型得到的,以往的 KD 都是兩個模型,student 模型經過參數初始化,讓 teacher 模型去優化 student 模型。
一共包含以下幾個階段:
Pre-training:和 BERT 預訓練的流程一致,主要是要得到一個預訓練模型。
Fine-tuning for Backbone:Backbone 的微調,也就是訓練一個 Bert 的分類器,預訓練模型后添加一層 classifier,classifier 的參數用于后期的指導訓練。
Self-distillation for branch:分支(branch)的自蒸餾,每一層都有一個 student 的 classfier,由微調過的 Bert 的最后一層 classifier 蒸餾而來,每個 branch 都有一個 classifier。
Adaptive inference:自適應 inference,可以根據樣本的難易程度決定樣本要走幾層分支分類器,簡單的樣本可以在底層直接給結果,困難的繼續往高層走。
同類的文章還有:
論文標題:DeeBERT: Dynamic Early Exiting for Accelerating BERT Inference
論文來源:ACL 2020
論文鏈接:https://arxiv.org/abs/2004.12993
代碼鏈接:https://github.com/castorini/DeeBERT
論文標題:DynaBERT: Dynamic BERT with Adaptive Width and Depth
論文來源:NeurIPS 2020
論文鏈接:https://arxiv.org/abs/2004.04037
代碼鏈接:https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/DynaBERT
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的BERT模型蒸馏有哪些方法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 古尔曼:苹果正逐渐远离产品“一年一更”模
- 下一篇: 英伟达 CEO 黄仁勋个人身价超英特尔市