BERT 模型蒸餾 TinyBERT

2021-01-08 NLP學習筆記

BERT 的效果好,但是模型太大且速度慢,因此需要有一些模型壓縮的方法。TinyBERT 是一種對 BERT 壓縮後的模型,由華中科技和華為的研究人員提出。TinyBERT 主要用來模型蒸餾的方法進行壓縮,在 GLUE 實驗中可以保留 BERT-base 96% 的性能,但體積比 BERT 小了 7 倍,速度快了 9 倍。

1.前言

模型蒸餾 Distillation 是一種常用的模型壓縮方法,首先訓練一個大的 teacher 模型,然後使用 teacher 模型輸出的預測值訓練小的 student 模型。student 模型學習 teacher 模型的預測結果 (概率值) 從而學習到 teacher 模型的泛化能力。

有不少利用模型蒸餾壓縮 BERT 的研究,例如將 BERT 蒸餾到 BiLSTM,還有 huggingface 的 DistilBERT 等,在之前的文章BERT 模型蒸餾 Distillation BERT有比較詳細的介紹,對模型蒸餾不熟悉的童鞋可以參考一下。

這裡主要介紹另一種 BERT 蒸餾的模型 TinyBERT,之前蒸餾模型的損失函數主要是針對 teacher 模型輸出的預測概率值,而 TinyBERT 的損失函數包括四個部分:Embedding 層的損失,Transformer 層 attention 的損失,Transformer 層 hidden state 的損失和最後預測層的損失。即 student 模型不僅僅學習 teacher 模型的預測概率,也學習其 Embedding 層和 Transformer 層的特性。

上面的圖片展示了 TinyBERT (studet) 和 BERT (teacher) 的結構,可以看到 TinyBERT 減少了 BERT 的層數,並且減小了 BERT 隱藏層的維度。

2.TinyBERT

TinyBERT 蒸餾過程中的損失函數主要包含以下四個:

Embedding 層損失函數Transformer 層 attention 損失函數Transformer 層 hidden state 損失函數預測層損失函數 我們先看一下 TinyBERT 蒸餾時候每一層的映射方法。

2.1 TinyBERT 蒸餾的映射方法

假設 TinyBERT 有 M 個 Transformer 層,而 BERT 有 N 個 Transformer 層。TinyBERT 蒸餾主要涉及的層有 embedding 層 (編號為0)、Transformer 層 (編號為1到M) 和輸出層 (編號 M+1)。

我們需要將 TinyBERT 每一層和 BERT 中要學習的層對應起來,然後再蒸餾。對應的函數為 g(m) = n,m 是 TinyBERT 層的編號,n 是 BERT 層的編號。

對於 embedding 層,TinyBERT 蒸餾的時候 embedding 層 (0) 對應了 BERT 的 embedding 層 (0),即 g(0) = 0。

對於輸出層,TinyBERT 的輸出層 (M+1) 對應了 BERT 的輸出層 (N+1),即 g(M+1) = N+1。

對於中間的 Transformer 層,TinyBERT 採用 k 層蒸餾的方法,即 g(m) = m × N / M。例如 TinyBERT 有 4 層 Transformer,BERT 有 12 層 Transformer,則 TinyBERT 第 1 層 Transformer 學習的是 BERT 的第 3 層;而TinyBERT 第 2 層學習 BERT 的第 6 層。

2.2 Embedding 層損失函數

Embedding

ES是 TinyBERT 的 embedding,ET 是 BERT 的 embedding,l 是句子序列的長度,而 d『 是 TinyBERT embedding 維度,d 是 BERT embedding 維度。因為是要壓縮 BERT 模型,所以 d' < d,TinyBERT 希望模型學到的 embedding 與 BERT 原來的 embedding 具有相似的語義,因此採用了上面的損失函數,減少兩者 embedding 的差異。

embedding 維度不同,不能直接計算 loss,因此 TInyBERT 增加了一個映射矩陣 We(d'×d) 的矩陣,ES 乘以映射矩陣後維度與 ET 一樣。embedding loss 就是二者的均方誤差 MSE。

2.3 Transformer 層 attention 損失函數

TinyBERT 在 Transformer 層損失函數有兩個,第一個是 attention loss,如下圖所示。

Transformer 層的 attention loss

attention loss 主要是希望 TinyBERT Multi-Head Attention 部分輸出的 attention score 矩陣 能夠接近 BERT 的 attention score 矩陣。因為有研究發現 BERT 學習到的 attention score 矩陣能夠包含語義知識,例如語法和相互關係等,具體可參考論文《What Does BERT Look At? An Analysis of BERT’s Attention》。TinyBERT 通過下面的損失函數學習 BERT attention 的功能,h 表示 Multi-Head Attention 中 head 的個數。

Attention loss

2.4 Transformer 層 hidden state 損失函數

TinyBERT 在 Transformer 層的第二個損失函數是 hidden loss,如下圖所示。

Transformer 層的 hidden loss

hidden state loss 和 embedding loss 類似,計算公式如下,也需要經過一個映射矩陣。

Hidden loss

2.5 預測層損失函數

預測層的損失函數採用了交叉熵,計算公式如下,其中 t 是模型蒸餾的 temperature value,zT是 BERT 的預測概率,而 zS 是 TinyBERT 的預測概率。

Prediction loss

3.TinyBERT 兩階段訓練方法

TinyBERT 兩階段訓練

BERT 有兩個訓練階段,第一個訓練階段是訓練一個預訓練模型 (預訓練 BERT),第二個訓練階段是針對具體下遊任務微調 (微調後的 BERT)。TinyBERT 的蒸餾過程也分為兩個階段。

第一個階段,TinyBERT 在大規模的 general 數據集上,利用預訓練 BERT 蒸餾出一個 General TinyBERT。第二個階段,TinyBERT 採用數據增強,利用微調後的 BERT 訓練一個 task specific 模型。4.參考文獻

TINYBERT: DISTILLING BERT FOR NATURAL LANGUAGE UNDERSTANDING

相關焦點

  • 速度×6,模型縮小20倍:華為&華科TinyBERT做搜索,性能達BERT90%
    現在,就有人用這個Transformer蒸餾方法,讓BERT搜索變快6倍,模型大小則只有原來的1/20。TinyBERT搜索首先,用微軟的MS Marco訓練三元組,在PyTorch中訓練一個基於BERT的教師網絡。
  • 剛剛,Google發布24個小型BERT模型,直接通過MLM損失進行預訓練
    【新智元導讀】Google剛剛發布了24個小型BERT模型,使用WordPiece masking進行訓練,具有更少的層數,在MLM蒸餾的更精細的預訓練策略方面極具優勢,適用於資源受限的場景,並鼓勵構建更緊湊的模型。
  • 一種多層對多層的BERT蒸餾方法
    BERT蒸餾技術應運而生,解決了模型大小和推理速度的問題,而且使用該技術的模型大小並沒有明顯的下降。近一年來,知識蒸餾(Knowledge Distillation)作為一種常用的模型壓縮方法逐漸成為BERT蒸餾的研究熱點分支。最初針對BERT模型的蒸餾學習是利用教師和學生網絡的輸出logits計算蒸餾損失,然而這樣不能學到Transformer 中間層的信息。
  • 谷歌最強NLP模型BERT,為何炫酷又強大?騰訊程式設計師給你從頭講起
    雖然知道了 bert能解決這個問題,我們更好奇的是"Ϊʲô":為什麼 bert 的表現能這麼好?這裡面有沒有可解釋的部分呢?因為 Multi-head-attention 是 bert 的主要組成部分,所以我們從"頭"入手,希望弄清楚各個 head 對 bert 模型有什麼作用。為了研究某個 head 對模型的影響,我們需要比較有這個 head 和沒有這個 head 模型的前後表現。
  • MobileBERT:一個在資源有限設備上使用的BERT模型
    隨著NLP模型的大小增加到數千億個參數,創建這些模型的更緊湊表示的重要性也隨之增加。知識蒸餾成功地實現了這一點,在一個例子中,教師模型的性能的96%保留在了一個小7倍的模型中。然而,在設計教師模型時,知識的提煉仍然被認為是事後考慮的事情,這可能會降低效率,把潛在的性能改進留給學生。
  • 萬字詳文:超越 BERT 模型的 ELECTRA 代碼解讀
    2、ELECTRA 模型2、1 總體框架ELECTRA 模型(BASE 版本)本質是換一種方法來訓練 BERT 模型的參數;BERT 模型主要是利用 MLM 的思想來訓練參數,直接把需要預測的詞給挖掉了,挖了 15%的比例。由於每次訓練是一段話中 15%的 token,導致模型收斂更新較慢,需要的語料也比較龐大。
  • 橫掃各項NLP任務的BERT模型有了PyTorch實現
    這個腳本將TensorFlow checkpoint(以bert_model.ckpt開頭的三個文件)和相關的配置文件(bert_config.json)作為輸入,並為此配置創建PyTorch模型,從PyTorch模型的TensorFlow checkpoint加載權重並保存生成的模型在一個標準PyTorch保存文件中,可以使用 torch.load() 導入(
  • MobileBERT—資源受限設備上的任務無關BERT
    隨著NLP模型的規模增加到數千億個參數,對這些模型進行高效的壓縮也越來越重要。知識蒸餾成功地實現了這一目標,典型例子:student模型壓縮了1/7卻達到了模型96%的效果(https://medium.com/dair-ai/tinybert-size-does-matter-but-how-you-train-it-can-be-more-important-a5834831fa7d)。
  • 內存用量1/20,速度加快80倍,QQ提全新BERT蒸餾框架,未來將開源
    為了解決這個問題,QQ 研究團隊提出了一種基於知識蒸餾的方法,在儘可能保證預訓練 BERT 具備的文本理解能力不丟失的前提下,可以大大降低模型規模,提高預測速度。QQ 研究團隊主要針對的是基於從 BERT 得到的 sentence embedding 去完成更上層任務的需求,這也能滿足當前對於 BERT 的大部分的需求,囊括了文本分類、文本聚類、相似度計算等等。
  • 所有你要知道的 BERT 模型壓縮方法,都在這裡!
    模型壓縮可減少受訓神經網絡的冗餘,由於幾乎沒有 BERT 或者 BERT-Large 模型可直接在 GPU 及智慧型手機上應用,因此模型壓縮方法對於 BERT 的未來的應用前景而言,非常有價值。軟體工程師 Mitchell A.
  • 2020自然語言處理 BERT 模型(上)
    這裡想說一件有趣的事,就是當下比較火的自然語言處理模型如 ElMo 和 BERT 都是動畫片芝麻街中角色。bert_cover.jpeg(1)2020機器學習 Transform 模型(2)2020機器學習 Transform 模型(3)我們先用一句話來概括一下
  • 被封神的多語言BERT模型是如何開啟NER新時代的?
    如何在Deeppavlov中使用基於Bert的NER模型 任何預處理的模型都可以通過命令行界面和Python進行推理。在使用模型之前,請確保使用以下命令安裝了所有必需的軟體包:python -m deeppavlov install ner_ontonotes_bert_multpython -m deeppavlov interact ner_ontonotes_bert_mult [-d]其中ner_ontonotes_bert_mult表示配置文件的名稱。
  • 如何設置BERT模型不參與參數訓練
    如上題,BERT是一個功能非常強大的預訓練語言模型,被廣泛用於自然語言處理領域。實測表明,在BERT模型參與參數訓練情況下,佔用顯存非常大。如果我們只想通過BERT生成嵌入序列而不像BERT參與訓練,該怎麼辦呢?需要調整兩個地方:(1)在初始化BERT時,將is_training設置為False.
  • 谷歌再次發布BERT的多語言模型和中文模型
    谷歌再次發布BERT的多語言模型和中文模型 李倩 發表於 2018-11-08 09:50:19 今天,在開源最強NLP模型BERT的TensorFlow代碼和預訓練模型的基礎上,谷歌AI團隊再次發布一個多語言模型和一個中文模型
  • 華為雲摘得NLPCC 輕量級預訓練中文語言模型測評桂冠
    當下,預訓練語言模型已經成為NLP的主流方法,在多項NLP任務上都取得了明顯的效果提升。但是預訓練語言模型往往比較大,限制了預訓練語言模型的應用場景。因此,如何構建輕量級的預訓練語言模型就成了一個關鍵問題。
  • 新冠疫情醫療問答-基於對抗訓練的BERT多模型融合相似問匹配算法
    嘗試了多種不同的預訓練模型, 包括BERT-Base, BERT-wwm, BERT-wwm-ext, roeberta_zh, chinese_roberta_wwm_ext, chinese_roberta_wwm_large_ext, RoBERTa-large-pair以及百度的ERNIE1.0, 小模型中BERT-wwm-ext和RENIE的表現最好, 大模型中RoBERTa-large-pair
  • TinyBERT:模型小7倍,速度快8倍,華中科大、華為出品
    假定 student 模型有 M 個 Transformer 層,teacher 模型有 N 個 Transformer 層,從 teacher 模型中選擇 M 個 Transformer 層用於 Transformer 層蒸餾。
  • 谷歌開源 BERT 模型原始碼
    驚鴻一瞥後,人們都在期待谷歌何時會放出 BERT 模型原始碼。直至今日,谷歌終於一鼓作氣發布了包括 BERT 模型 TensorFlow 代碼、BERT-Base 與 BERT-Large 模型的預訓練檢查點、微調實驗結果的自動化復現 TensorFlow 代碼、預訓練數據生成和數據訓練的代碼在內的「BERT 模型大禮包」。
  • 小版BERT也能出奇蹟:最火的預訓練語言庫探索小巧之路
    想了解更多,可以查看這篇關於 BERT 量化的精彩博客:https://blog.rasa.com/compressing-bert-for-faster-prediction-2/。Hugging Face 的研究者決定把重點放在知識蒸餾(distillation)上。蒸餾即,將較大模型(教師模型)壓縮成較小模型(學生模型)的方法。
  • 別再蒸餾3層BERT了!變矮又能變瘦的DynaBERT了解一下
    最細粒度為權重剪枝,即將某個連接權重置為0,得到稀疏矩陣;其次為神經元剪枝,去掉矩陣中的一個vector;模型層面則為結構性剪枝,可以是去掉attention、FFN或整個層,典型的工作是LayerDrop[1]。這兩種方法都是同時對速度和內存進行優化。蒸餾:訓練時讓小模型學習大模型的泛化能力,預測時只是用小模型。比較有名的工作是DistillBERT[2]和TinyBERT[3]。