該文主要采用“知識蒸餾”方法對BERT(預訓練語言模型)精簡、優化,將較大模型壓縮成較小的模型,最終目的是:提高模型推理的效率,讓運行在智能手機等硬件設備上的深度學習模型具有輕量級、響應快及能源利用率高等特性。
在2019年的NLP領域預訓練+微調的模型訓練思路百家爭鳴,ElMo、GPT、BERT、Mass、ULMFit等模型陸續登台成為當前領域最閃耀的星星,縱覽全局能夠真正快速用於產品化落地的model也唯有BERT了,雖說GPT-2被傳的神乎其神,但其未公開的預訓練模型還是不能讓廣大粉絲熱捧。既然如此,我不妨在BERT上做做研究,以其在產品落地上進一步發揮威力。
雖然各類BERT的衍生模型頻繁霸榜,但由於其block堆疊實在太多,在實際任務推理時性能瓶頸是一個很大的問題。不得不承認使用BERT確實比其它的傳統DL方法效果要好,而且簡單、快速、易操作,既然堅持要用它,就要面對它的瓶頸-推理速度慢,慢到什么程度?使用一個12層的model,對單個句子(不超過30個字)的預測耗時在100ms-200ms,如果這個時間你能夠承受,可以滿足你的業務要求,那很ok,你可以直接使用BERT完成任務。。。如果無法接受,就得想辦法在影響性能的地方搞事情了。
在模型這塊,精簡參數,加快推理的方法有:1)量化:使用更小的精度模型替換全精度模型;2)權重剪枝:合理去除網絡中的部分連接;3)知識蒸餾:算法層面的提速方式,且成本較低。
2015年hinton等人將知識蒸餾方法進一步發揚光大,可進一步參看《Distilling the Knowledge in a Neural Network》細節之處,大體思路是:使用兩個網絡(teacher model 和 student model),用teacher model 指導 student model的生成,最終蒸餾出來的student model就是我們需要的精簡model。在這里teacher model是海量數據集下預訓練得到的大模型,目的是將大模型的eval結果soft label 指導student model 學習;而student model 是由soft label和hard label組成,如下圖所示:
有基礎知識的看圖就一目了然了,有幾個重要的地方:1)文章指出,對計算性能影響較大的不是隱含層節點的個數而是隱含層的層數,所以在大模型每兩層去掉一層,之后再指導小模型;2)也要去掉token type embedding;3)小模型的初始化用的是大模型預訓練好的參數
損失的計算:
- KLDivLoss: teacher model 和student model的soft label損失兩者的KL散度,之所以稱之為soft label是在softmax中引入了溫度參數T
- Cos: teacher hidden state 和 student hidden state 的余弦相似度,也好理解,約束兩個模型的相似性
- Cross-entropy: hard label 損失函數,傳統BERT 的 MLM 損失
以上求權重和計算整個網絡的損失:Loss = 5.0*KLDivLoss + 2.0*Cross-entropy + 1.0*Cos
性能比較如下圖:
1)DistilBERT擁有BERT的99%性能;2)在下游任務中也不差;3)DistilBERT相比較推理速度更快(基線BERT的61.4%),模型容量更小,只有66M
總結:作者使用知識蒸餾方法,提出了一個通用的BERT版本-DistilBERT,其更小、更快並保留有BERT 99%的語言理解能力
本質:知識蒸餾相當於引入先驗知識,提供強有力的指導,即名師出高徒!
BERT之后思路的確定:語義表示的框架已基本確定,短期內不會有大的變革,之后就是以提升模型的精度和速度兩個方面,現今主要以多任務、知識蒸餾、優化網絡結構、提升算力四個方向來做。那么,以后就有選擇的側重這個幾個方向。