摘要: 本篇為模型壓縮系列文章的第二部分,上一篇通過直觀的思路引出三種壓縮方式,包括模型替換、模型蒸餾和協同訓練,並詳細介紹了模型替換在貝殼真實業務場景的實踐。本篇我們繼續介紹對模型蒸餾的探索。
模型蒸餾,本質是將大模型壓縮為小模型,其過程採用了遷移學習,通過將預訓練好的複雜模型在下遊任務中學到的相關信息作為先驗知識,並結合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
注:
所有結果都是非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月畢業於武漢大學計算機學院,畢業後加入貝殼找房人工智慧中心業務智能部,主要從事自然語言理解相關工作。