【模型壓縮系列】二:模型蒸餾

2021-03-02 AINLP

摘要: 本篇為模型壓縮系列文章的第二部分,上一篇通過直觀的思路引出三種壓縮方式,包括模型替換、模型蒸餾和協同訓練,並詳細介紹了模型替換在貝殼真實業務場景的實踐。本篇我們繼續介紹對模型蒸餾的探索。

模型蒸餾,本質是將大模型壓縮為小模型,其過程採用了遷移學習,通過將預訓練好的複雜模型在下遊任務中學到的相關信息作為先驗知識,並結合one-hot label來指導小模型在該任務上進行學習,目標是使小模型學習到大模型的泛化能力,從而在實際業務中,應用推理更快的小模型。

知識蒸餾的核心在於知識,有何知識可用以及知識該怎麼用是蒸餾的重點。參照Jianping Gou的論文[1],簡單先介紹下知識類型。

1.1 知識類型

在論文[1]中,作者將知識類型劃分為三種,包括Feature-Based Knowledge, Response-Based Knowledge和Relation-Based Knowledge。

1.1.1 Feature-Based Knowledge

無論是最後一層的輸出,還是中間層的輸出,都可以作為知識來監督學生模型的訓練。基於特徵的知識強調關注中間層的信息,如隱層輸出、注意力層輸出等。

其中,

1.1.2 Response-Based Knowledge

基於響應的知識,通常指教師模型中最後一個輸出層的神經響應,主要思想是直接模仿教師模型的最終預測結果,也就是我們熟悉的soft logits。這是最早的知識蒸餾思想,因此也有了廣泛的應用。

其中,

1.1.3 Relation-Based Knowledge

基於關係的知識,顧名思義,度量的是教師模型層間關係與學生模型層間關係的損失,其不再只關注與層與層的對應,而是考慮到把層間關係從教師模型傳遞到學生模型。此外,該思想還關注數據樣本之間的相互關係。以傳遞特徵關係為例,表述為:

其中,

1.2 蒸餾方法

上圖即為我們蒸餾方法的設計,包括所用知識,損失的計算。下面分別具體進行介紹。

1.2.1 所用知識

在上一節,我們簡單描述了知識類型。在進行調研與分析後,我們最終嘗試了feature-based knowledge和response-based knowledge,具體來說,如下所示:

1.2.2 損失計算

確定了知識之後,接下來就要設計蒸餾方法,也就是損失的度量。

對於feature-based knowledge, 我們分別用

其中:

對於response-based knowledge, 也就是soft logits,損失用

其中:

說明:

大小模型的概率分布都要先用溫度係數

此外,還有小模型自身訓練的交叉熵損失,

綜上,蒸餾過程的損失函數為:

說明:  

對於feature-based knowledge值得注意的是:

使用前提是大小模型同構,我們的大模型是bert系列模型,由多層transformer構成,如果要蒸到TextCNN, lstm等非transformer-based模型,只用到soft targets大小模型中間層是skip方式對應的,比如大模型12層,小模型4層,那麼小模型的1,2,3,4層分別對應大模型的第3,6,9,12層如果完全學習中間層的話,計算量很大,為了避免這個問題,實際可以讓student模型去學習對應層中首個字符的輸出,也就是[CLS]的向量表示1.3 工程流程

預訓練好的bert large在下遊任務finetune,得到 task-specific bert large保存large模型相關knowledge,若需數據增強,可用large模型預測偽標籤作為數據的補充小模型預先進行預訓練作為初始化參數,實驗表明使用預訓練後的小模型進行初始化,結果更為穩定,效果有顯著提高利用訓練數據(此過程可以加入增強的數據)和大模型的相關知識執行蒸餾過程注: 實際實驗中,不一定用的知識越多效果越好,不過整體來說,使用了中間層知識效果會好一些二、實驗

相較於模型替換,我們同樣使用了小貝的技能分類數據,不同的是,我們沒有繼續在智能話務上實驗,而是以vr帶看經紀人意圖數據替換,文本仍是由語音轉換而來。實驗任務有以下兩個:

2.1 小貝技能分類結果

teacher: layer=24, hidden_size=1024, intermediate_size=4096, attention_heads=16

student: layer=4, hidden_size=312, intermediate_size=1248, attention_heads=12

modelaccuracysupportteacher0.8824105824層finetune0.865610582student-base0.877910582student-add-att0.877610582student-add-hid0.878610582student-add-all0.877110582

其中,4層finetune為學生模型同初始化,同結構的finetune結果;student-base只用到了教師模型的soft logits,作為學生模型的baseline;student-add-att, student-add-hid分別表示相對於base,添加了注意力層知識和隱層知識;student-add-all則為用到了上述提到的所有教師模型知識的學生模型結果。

為了方便直觀展示,我們僅列出accuracy的結果。相比於上篇在模型替換上的實驗,小貝技能數據沒有任何變化,模型由12層的bert-base改用24層的bert-large,最終大模型的accuracy由0.8813提升到了0.8824。在大模型相差不多的前提下,知識蒸餾的結果達到了0.8786,遠高於模型替換0.86數量級的結果。相比於同模型finetune,在此任務上蒸餾同樣有優異的表現。

從學生模型的對比來看,此任務中,加入hidden層知識後,蒸餾結果有顯著地提升;而包含attention層知識的兩個實驗結果,甚至比base還要低一些。

2.2 經紀人vr帶看結果

一般來說,在成熟的業務中,任務表現接近瓶頸,我們可能會引入模型壓縮來進一步提高模型的表現。在任務初期,數據建設通常是首要任務。然而,有些任務本身複雜度較高,數據建設並未成熟,但需要較快的迭代以滿足業務需要,我們也會希望運用大的預訓練模型和模型壓縮來迭代。

經紀人vr意圖識別就是這樣一項任務,我們要實現一個單層的209分類任務,數據由vr帶看過程的語音轉換而來,簡單的模型表現較差。讓我們看下bert-large與蒸餾的效果如何。

teacher: layer=24, hidden_size=1024, intermediate_size=4096, attention_heads=16

student: layer=4, hidden_size=312, intermediate_size=1248, attention_heads=12


precisionrecallf-scoresupportbert-small0.6240.7320.6563892teacher0.6990.7390.7063892student-base0.6790.7490.7003982student-add-hid0.6910.7450.7043892student-add-att0.6910.7370.7023892student-add-all0.6950.7340.7003892

注:

所有結果都是非other意圖的加權結果,我們衡量的指標是f-scorebaseline為bert small直接finetune的表現

在此場景下,複雜度高的bert-large是非常有優勢的,f值較bert-small直接finetune要高5%,蒸餾後的結果就比較接近了,均達到了0.700數量級。另外,我們發現large模型並非所有指標都達到了最佳,這是因為數據量相對較少,large並沒有完全能夠發揮其優勢,也因此蒸餾後的結果沒有明顯的「降級」。

本次實驗中,引入了中間層信息的蒸餾同樣達到了最佳,巧合的是,我們最終採用的仍然是添加了隱層知識的蒸餾方法。後續在其他實驗中,有相同的結論,如果你們感興趣也可以試一下是否也是這樣。總之,能確定的一點是: 利用soft targets以及feature-based knowledge進行蒸餾效果最佳。

三、分析

正如上文所述,知識蒸餾的核心是知識,為什麼大模型的知識如此有效呢?

我覺得這要從soft logits說起,無論是中間層信息還是關係特徵,其最終都是希望得到與教師模型相近的logits。

小模型相對大模型,缺少的是擬合能力。而有了大模型的軟標籤之後:

如果數據集足夠複雜,那麼小的模型可能不太能夠捕捉訓練目標所需的隱藏表示,軟標籤可以對其引導如果數據足夠簡單,小模型的hard label可以很好奏效如果數據有一定相關性,軟標籤可以幫助學習dark knowledge

當兩個類別共享一系列特徵的時候(如 對數字 1 和 7 的識別),一個類別的概率是0.99,另一個是0.01,模型其實並不容易捕捉到有效學習所需的信息,它幾乎不可能傳遞圖像具有數字7的特徵知識。

早期的處理方式是label smooth,利用一個參數對label進行軟化,不直接使用0.99,而是設0.99為低一些的值,其他類別平分剩餘值。這樣的做法直觀上就是讓模型不完全地相信label,數據中一些模稜兩可的處於邊緣的樣本,就不會因為人的主觀分類,導致模型受到影響,這也是label smooth能夠增加模型泛化性的原因。

soft label中Temperature的設置,可以對logits進行縮放,這樣可以在可用的類標籤中得到更廣泛的分布,傳遞了「dark knowledge」,幫助小模型更好地區分概率相近的相似數據。

四、總結

本文從蒸餾的原理出發,介紹了我們對知識的運用和流程的設計,並在實際業務數據中開展了實驗。實驗表明了蒸餾的有效,確定了整個體系設定。我們沒有著力研究如何創新,而是將近年來的一些方法綜合在一起做了實踐,旨在確定適合我們自己的方法,沉澱經驗和工具庫。

從結果來看,蒸餾在各個業務的任務中都可以帶來提升,是可以實際使用的,而且蒸餾非常靈活,小模型可以是任何常見的神經網絡模型以應對不同的需要。本文僅僅展示了蒸餾到bert的結果,實際上,我們也在cnn上做了嘗試。那麼蒸餾到cnn這種簡單的模型效果如何呢?進一步,保持整體框架不變的前提下,還有什麼改進空間呢?敬請期待我們模型壓縮系列的最後一篇吧。

五、參考文獻

[1] Gou J, Yu B, Maybank S J, et al. Knowledge Distillation: A Survey[J]. arXiv preprint arXiv:2006.05525, 2020.

[2] Hinton G, Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv preprint arXiv:1503.02531, 2015.

[3] Tang R, Lu Y, Liu L, et al. Distilling task-specific knowledge from bert into simple neural networks[J]. arXiv preprint arXiv:1903.12136, 2019.

[4] Sun S, Cheng Y, Gan Z, et al. Patient knowledge distillation for bert model compression[J]. arXiv preprint arXiv:1908.09355, 2019.

[5] Sanh V, Debut L, Chaumond J, et al. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter[J]. arXiv preprint arXiv:1910.01108, 2019.

[6] Jiao X, Yin Y, Shang L, et al. Tinybert: Distilling bert for natural language understanding[J]. arXiv preprint arXiv:1909.10351, 2019.

作者介紹

楊蘊凱,2019年6月畢業於武漢大學計算機學院,畢業後加入貝殼找房人工智慧中心業務智能部,主要從事自然語言理解相關工作。

相關焦點

  • 模型壓縮:量化、剪枝和蒸餾
    導讀:近年來,BERT 系列模型成了應用最廣的預訓練語言模型,隨著模型性能的提升,其參數規模不斷增大,推理速度也急劇提升,導致原始模型必須部署在高端的GPU 顯卡上,甚至部分模型需要多塊顯卡才能正常運行。
  • 模型壓縮之知識蒸餾
    ,KD屬於模型壓縮算法的一種,從2014年發展至今。Bucilua et al. (2006) [1]首次提出通過知識蒸餾壓縮模型的思想,但是沒有實際的工作闡述。作者實驗觀察到,並不是性能越好的teacher就能蒸餾出更好的student;推測是容量不匹配的原因,導致student模型不能夠mimic teacher,反而帶偏了主要的loss;提出一種early-stop teacher regularization進行蒸餾,接近收斂時要提前停止蒸餾。如下圖,teacher網絡越深,student蒸餾效果並一定提升。
  • BERT模型蒸餾有哪些方法?
    ,蒸餾的 loss 可以從 4 個方面來構造:Transformer Layer(Hidden States 和 Attention Matricies)整個模型的 loss 是學生模型的每一層 loss 的求和:構造的 Loss 都是清一色的 MSE 函數:Embedding-layer DistillationHidden-layer DistillationSelf-Attention
  • Bert與模型蒸餾: PKD和DistillBert
    最近要開始使用Transformer去做一些事情了,特地把與此相關的知識點記錄下來,構建相關的、完整的知識結構體系,以下是要寫的文章,本文是這個系列的第五篇主要介紹的是參考論文[1]中的PKD方法,參考論文[2]中的DistillBert本身較為簡單,本文也會簡要介紹一下。知識蒸餾首先,我們先來了解一下知識蒸餾,知識蒸餾是讓一個小模型去學習一個大模型,所以首先會有一個預訓練好的大模型,稱之為Teacher模型,小模型被稱為Student模型。知識蒸餾的方法就是會讓Student模型去儘量擬合。
  • Teacher模型線上授課,蒸餾訓練速度提升2.3倍
    但受限於推理速度,顯存資源等要求,大模型通常無法直接部署,需要對模型進行壓縮。目前主流的壓縮方法有裁剪、量化、知識蒸餾等。其中知識蒸餾這一概念是由Hinton等人在2015年發表的《Distilling the Knowledge in a Neural Network》論文中提出的一個黑科技,一種非常經典的模型壓縮技術,是將知識從一個複雜模型(Teacher)遷移到另一個輕量級模型(Student)上的方式來實現模型壓縮。
  • 模型蒸餾開山之作:Distilling the Knowledge in a Neural Network
    動機:    其中一種潛在的解決方法是,將cubersome model中的信息(knowledge)壓縮到一個單獨的模型(single model),將此過程稱為distilling(蒸餾)。    對於目標檢測或語音識別等任務,模型訓練所花費的大部分時間及計算資源是可以接受的,但當模型部署到生產環境中,對模型所需資源的要求則會嚴格很多可以通過distilling(蒸餾)來提取cubersome model中的knowledge從而使模型更易部署 對於實現distilling(蒸餾)的阻礙之一在於,knowledge是一個比較抽象的概念,可以認為cubersome model
  • ACL 2020 | MobileBERT:一種與任務無關的模型壓縮方法
    目前很多預訓練模型的壓縮方法都是和下遊任務相關的,一般做法都是把 pre-train 的模型在下遊任務上 fine-tune 之後,進行縮小操作(蒸餾,裁剪等等)。要做一個預訓練的小模型,用蒸餾?蒸餾完的模型要麼淺,要麼窄,但是這兩種模型都有自己的缺點,淺的表示能力不足,窄的不好訓練(畢竟還是要考慮後續 fine-tune 的)。
  • AI新視野 | 數據蒸餾Dataset Distillation
    該想法是合成少量數據,這些數據不需要一定來自正確的數據分布,但是當作為模型的訓練數據學習時,能達到近似在原始數據上訓練的效果。例如,我們展示了可以壓縮60000個MNIST圖像成僅10個合成蒸餾圖像(每個類別一個),並且在給定固定網絡初始化的情況下,僅通過幾個梯度下降步驟實現接近原始訓練的性能。我們在各種初始化設置和不同的學習目標中評估了我們的方法。在多個數據集上的實驗表明了我們方法的優勢。
  • NLP集大成之預訓練模型綜述
    多模態預訓練模型視頻-文本:VideoBERT,CBT,UniViLM;圖片-文本:ViLBERT,LXMERT,VisualBERT,B2T2,VLBERT,Unicoder-VL,UNITER;語音-文本:SpeechBERT。
  • PaddlePaddle升級解讀 |PaddleSlim為你的模型瘦身
    PaddleSlim 是一個無論是新手還是經驗者都可以很方便用來優化模型以進行部署的模型壓縮庫:在普通的模型訓練上,只需要兩行 python 代碼,構造一個 Compressor 對象,即可調用。PaddleSlim 實現了目前主流的網絡量化、剪枝、蒸餾三種壓縮策略,並可快速配置多種壓縮策略組合使用。
  • 入坑知識蒸餾(Knowledge Distillation)
    1 為什麼要模型壓縮        提高機器學習算法性能的一個簡單方法是在同一個數據集上訓練很多不同的模型,然後對它們的預測進行平均。然而,用整個模型集合進行預測是很麻煩的,並且計算量大,無法部署到大量用戶,特別是單個模型是大型神經網絡。
  • 深度學習中的3個秘密:集成,知識蒸餾和自蒸餾
    ,用自己蒸餾一下,就能提高性能,是不是很神奇,這裡面的原理到底是什麼呢,這要從模型集成開始說起。神秘之處3:自蒸餾 注意,知識蒸餾至少直觀上是有意義的:教師集成模型的測試準確率為84.8%,所以單個學生模型的測試準確率可以達到83.8%。
  • 知識蒸餾:如何用一個神經網絡訓練另一個神經網絡
    有沒有什麼方法可以在不擴展硬體的情況下利用這些強大但龐大的模型來訓練最先進的模型?目前,有三種方法可以壓縮神經網絡,同時保持預測性能:在這篇文章中,我的目標是向你介紹「知識蒸餾」的基本原理,這是一個令人難以置信的令人興奮的想法,它的基礎是訓練一個較小的網絡來逼近大的網絡。讓我們想像一個非常複雜的任務,比如對數千個類進行圖像分類。
  • 知識蒸餾-Distilling the knowledge in a neural network
    知識蒸餾就是為了滿足這種需求而設計的一種模型壓縮的方法。知識蒸餾的概念最早是在2006年由Bulica提出的,在2014年Hinton對知識蒸餾做了歸納和發展。知識蒸餾的主要思想是訓練一個小的網絡模型來模仿一個預先訓練好的大型網絡或者集成的網絡。這種訓練模式又被稱為 "teacher-student",大型的網絡是「老師」,小型的網絡是「學生」。
  • 推薦精排模型之多目標模型
    ,點擊率模型、時長模型和完播率模型是大部分信息流產品推薦算法團隊都會嘗試去做的模型。 完播率和點擊模型兩者相關性較大,所以在使用共享NN層時在其它指標下降的情況下,其指標也能提升。前期點擊模型的線上指標下降比較多的,整體也沒有收益,考慮到時長和完播率都是對點擊樣本進行學習,這可能對點擊模型的影響有點大了,於是稍微調大了點擊模型的學習率,加上撤掉共享NN層,整體指標基本就由負轉正了。
  • 深度學習三大謎團:集成、知識蒸餾和自蒸餾
    但接下來這個現象就讓人難以理解了,使用自蒸餾技術,也即老師的學生就是它自己:通過對具有相同架構的單個模型進行知識蒸餾,竟然可以提高測試準確率。 想像一下: 訓練出一個測試準確率為81.5% 的單個模型,結果使用相同結構的模型進行自蒸餾一下,測試準確率竟然提高到了83.5%,這不是很奇怪麼?
  • 谷歌提出任務無關的輕量級預訓練模型MobileBERT:比BERT小4倍、速度快5倍
    最近,Google Brain 團隊提出了 MobileBERT 模型,對 BERT 模型進行壓縮,在損失效果不大的前提下,使得模型大小減少了 3-4 倍,而速度提升了 4-5 倍,讓各種 NLP 應用程式都能在移動端輕鬆部署。相關 論文 已被 ACL 2020 接收。本文是 AI 前線第 108 篇論文導讀,我們將對這項研究工作進行詳細解讀。
  • 復旦邱錫鵬教授:2020最新NLP預訓練模型綜述
    例如nlp中的log-linear、CRF模型等,cv中各種抽取特徵的模型,如sift特徵等。深度學習中本質上是一種表示學習,能夠一定程度上避免手動的特徵工程。究其原因,主要得益於深度學習中一系列很強大的特徵提取器,如CNN、RNN、Transformer等,這些特徵提取器能夠有效地捕獲原始輸入數據中所蘊含的特點和規律。nlp領域的發展比cv領域相對緩慢的原因是什麼呢?
  • 超讚,以QA形式對NLP預訓練模型進行的全面總結!
    總的來看,預訓練模型PTMs的優勢包括:在龐大的無標註數據上進行預訓練可以獲取更通用的語言表示,並有利於下遊任務;為模型提供了一個更好的初始化參數,在目標任務上具備更好的泛化性能、並加速收斂;是一種有效的正則化手段,避免在小數據集上過擬合(一個隨機初始化的深層模型容易對小數據集過擬合);二、詞嵌入和分布式表示
  • 深度學習中的3個秘密:集成,知識蒸餾和蒸餾
    神秘之處3:自蒸餾 注意,知識蒸餾至少直觀上是有意義的:教師集成模型的測試準確率為84.8%,所以單個學生模型的測試準確率可以達到83.8%。下面的現象,被稱為自蒸餾(或「Be Your Own Teacher」),是完全令人驚訝的 ——通過對同一架構的單個模型執行知識蒸餾,測試的準確性也可以得到提高。(請參見上面的圖2。) 考慮一下這個問題:如果訓練一個單獨的模型只能得到81.5%的測試準確率,那麼為什麼「再次訓練同一個模型把自己當作老師」突然可以把測試準確率提高到83.5%呢?