知識(shí)蒸餾:如何用一個(gè)神經(jīng)網(wǎng)絡(luò)訓(xùn)練另一個(gè)神經(jīng)網(wǎng)絡(luò)

極市導(dǎo)讀
?知識(shí)蒸餾的簡(jiǎn)單介紹,讓大家了解知識(shí)蒸餾背后的直覺(jué)。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿
如果你曾經(jīng)用神經(jīng)網(wǎng)絡(luò)來(lái)解決一個(gè)復(fù)雜的問(wèn)題,你就會(huì)知道它們的尺寸可能非常巨大,包含數(shù)百萬(wàn)個(gè)參數(shù)。例如著名的BERT模型約有1億1千萬(wàn)參數(shù)。
為了說(shuō)明這一點(diǎn),參見(jiàn)下圖中的NLP中最常見(jiàn)架構(gòu)的參數(shù)數(shù)量。

各種模型結(jié)構(gòu)的參數(shù)數(shù)量
在Kaggle競(jìng)賽中,勝出的模型通常是由幾個(gè)模型組成的集合。盡管它們?cè)诰_度上可以大大超過(guò)簡(jiǎn)單模型,但其巨大的計(jì)算成本使它們?cè)趯?shí)際應(yīng)用中完全無(wú)法使用。
有沒(méi)有什么方法可以在不擴(kuò)展硬件的情況下利用這些強(qiáng)大但龐大的模型來(lái)訓(xùn)練最先進(jìn)的模型?
目前,有三種方法可以壓縮神經(jīng)網(wǎng)絡(luò),同時(shí)保持預(yù)測(cè)性能:
權(quán)值裁剪
量化
知識(shí)蒸餾
在這篇文章中,我的目標(biāo)是向你介紹“知識(shí)蒸餾”的基本原理,這是一個(gè)令人難以置信的令人興奮的想法,它的基礎(chǔ)是訓(xùn)練一個(gè)較小的網(wǎng)絡(luò)來(lái)逼近大的網(wǎng)絡(luò)。
什么是知識(shí)蒸餾?
讓我們想象一個(gè)非常復(fù)雜的任務(wù),比如對(duì)數(shù)千個(gè)類進(jìn)行圖像分類。通常,你不能指望ResNet50能達(dá)到99%的準(zhǔn)確度。所以,你建立一個(gè)模型集合,平衡每個(gè)模型的缺陷?,F(xiàn)在你有了一個(gè)巨大的模型,盡管它的性能非常出色,但無(wú)法將其部署到生產(chǎn)環(huán)境中,并在合理的時(shí)間內(nèi)獲得預(yù)測(cè)。
然而,該模型可以很好地概括未見(jiàn)的數(shù)據(jù),因此可以放心地相信它的預(yù)測(cè)。(我知道,情況可能不是這樣的,但我們現(xiàn)在就開(kāi)始進(jìn)行思維實(shí)驗(yàn)吧。)
如果我們使用來(lái)自大而笨重的模型的預(yù)測(cè)來(lái)訓(xùn)練一個(gè)更小的,所謂的“學(xué)生”模型來(lái)逼近大模型會(huì)怎么樣?
這本質(zhì)上就是知識(shí)的蒸餾,這是由Geoffrey Hinton、Oriol Vinyals和Jeff Dean在論文Distilling the Knowledge in a Neural Network中介紹的。
大致說(shuō)來(lái),過(guò)程如下。
訓(xùn)練一個(gè)能夠性能很好泛化也很好的大模型。這被稱為教師模型。
利用你所擁有的所有數(shù)據(jù),計(jì)算出教師模型的預(yù)測(cè)。帶有這些預(yù)測(cè)的全部數(shù)據(jù)集被稱為知識(shí),預(yù)測(cè)本身通常被稱為soft targets。這是知識(shí)蒸餾步驟。
利用先前獲得的知識(shí)來(lái)訓(xùn)練較小的網(wǎng)絡(luò),稱為學(xué)生模型。
為了使過(guò)程可視化,見(jiàn)下圖。

知識(shí)蒸餾
讓我們關(guān)注一下細(xì)節(jié)。知識(shí)是如何獲得的?
在分類器模型中,類的概率由softmax層給出,將logits轉(zhuǎn)換為概率:

其中:

是最后一層生成的logits。替換一下,得到一個(gè)稍有修改的版本:

其中,T是一個(gè)超參數(shù),稱為溫度。這些值叫做soft targets。
如果T變大,類別概率會(huì)變軟,也就是說(shuō)會(huì)相互之間更加接近,極端情況下,T趨向于無(wú)窮大。

如果T = 1,就是原來(lái)的softmax函數(shù)。出于我們的目的,T被設(shè)置為大于1,因此叫做蒸餾。
Hinton, Vinyals和Dean證明了一個(gè)經(jīng)過(guò)蒸餾的模型可以像由10個(gè)大型模型的集成一樣出色。

Geoffrey Hinton, Oriol Vinyals和Jeff Dean的論文Distilling the Knowledge in a Neural Network中對(duì)一個(gè)語(yǔ)音識(shí)別問(wèn)題的知識(shí)蒸餾的結(jié)果
為什么不重頭訓(xùn)練一個(gè)小網(wǎng)絡(luò)?
你可能會(huì)問(wèn),為什么不從一開(kāi)始就訓(xùn)練一個(gè)更小的網(wǎng)絡(luò)呢?這不是更容易嗎?當(dāng)然,但這并不一定有效。
實(shí)驗(yàn)結(jié)果表明,參數(shù)越多,泛化效果越好,收斂速度越快。例如,Sanjeev Arora, Nadav Cohen和Elad Hazan在他們的論文“On the Optimization of Deep Networks: Implicit Acceleration by Overparameterization”中對(duì)此進(jìn)行了研究。

左:單層網(wǎng)絡(luò)與4層和8層的線性網(wǎng)絡(luò)。右:使用TensorFlow教程中的MNIST分類的參數(shù)化和基線模型。
對(duì)于復(fù)雜的問(wèn)題,簡(jiǎn)單的模型很難在給定的訓(xùn)練數(shù)據(jù)上很好地泛化。然而,我們擁有的遠(yuǎn)不止訓(xùn)練數(shù)據(jù):教師模型對(duì)所有可用數(shù)據(jù)的預(yù)測(cè)。
這對(duì)我們有兩方面的好處。
首先,教師模型的知識(shí)可以教學(xué)生模型如何通過(guò)訓(xùn)練數(shù)據(jù)集之外的可用預(yù)測(cè)進(jìn)行泛化。回想一下,我們使用教師模型對(duì)所有可用數(shù)據(jù)的預(yù)測(cè)來(lái)訓(xùn)練學(xué)生模型,而不是原始的訓(xùn)練數(shù)據(jù)集。
其次,soft targets提供了比類標(biāo)簽更有用的信息:它表明兩個(gè)類是否彼此相似。例如,如果任務(wù)是分類狗的品種,像“柴犬和秋田犬非常相似”這樣的信息對(duì)于模型泛化是非常有價(jià)值的。

左:秋田犬,右:柴犬
與遷移學(xué)習(xí)的區(qū)別
Hinton等人也提到,最早的嘗試是復(fù)用訓(xùn)練好的集成模型中的一些層來(lái)遷移知識(shí),從而壓縮模型。
用Hinton等人的話來(lái)說(shuō),
“……我們傾向于用學(xué)習(xí)的參數(shù)值在訓(xùn)練過(guò)的模型中識(shí)別知識(shí),這使得我們很難看到如何改變模型的形式而保持相同的知識(shí)。知識(shí)的一個(gè)更抽象的觀點(diǎn)是,它是一個(gè)從輸入向量到輸出向量的學(xué)習(xí)好的映射,它將知識(shí)從任何特定的實(shí)例化中解放出來(lái)?!?Distilling the Knowledge in a Neural Network
因此,與轉(zhuǎn)移學(xué)習(xí)相反,知識(shí)蒸餾不會(huì)直接使用學(xué)到的權(quán)重。
使用決策樹
如果你想進(jìn)一步壓縮模型,你可以嘗試使用更簡(jiǎn)單的模型,如決策樹。盡管它們的表達(dá)能力不如神經(jīng)網(wǎng)絡(luò),但它們的預(yù)測(cè)可以通過(guò)單獨(dú)觀察節(jié)點(diǎn)來(lái)解釋。
這是由Nicholas Frosst和Geoffrey Hinton完成的,他們?cè)谒麄兊恼撐腄istilling a Neural Network Into a Soft Decision Tree中對(duì)此進(jìn)行了研究。

他們的研究表明,盡管更簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)的表現(xiàn)比他們的研究要好,但蒸餾確實(shí)起到了一點(diǎn)作用。在MNIST數(shù)據(jù)集上,經(jīng)過(guò)蒸餾的決策樹模型的測(cè)試準(zhǔn)確率達(dá)到96.76%,較基線模型的94.34%有所提高。然而,一個(gè)簡(jiǎn)單的兩層深卷積網(wǎng)絡(luò)仍然達(dá)到了99.21%的準(zhǔn)確率。因此,在性能和可解釋性之間存在權(quán)衡。
Distilling BERT
到目前為止,我們只看到了理論結(jié)果,沒(méi)有實(shí)際的例子。為了改變這種情況,讓我們考慮近年來(lái)最流行和最有用的模型之一:BERT。
來(lái)自于谷歌的Jacob Devlin等人的論文BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,很快被廣泛應(yīng)用于各種NLP任務(wù),如文檔檢索或情緒分析。這是一個(gè)真正的突破,推動(dòng)了幾個(gè)領(lǐng)域的技術(shù)發(fā)展。
然而,有一個(gè)問(wèn)題。BERT包含約1.1億個(gè)參數(shù),需要大量的時(shí)間來(lái)訓(xùn)練。作者報(bào)告說(shuō),訓(xùn)練需要4天,使用4個(gè)pods中的16個(gè)TPU芯片。訓(xùn)練成本將約為10000美元,不包括碳排放等環(huán)境成本。
Hugging Face成功地嘗試減小BERT的尺寸和計(jì)算成本。他們使用知識(shí)蒸餾來(lái)訓(xùn)練DistilBERT,這是原始模型大小的60%,同時(shí)速度提高了60%,語(yǔ)言理解能力保持在97%。

DistilBERT的性能。
較小的架構(gòu)需要更少的時(shí)間和計(jì)算資源:在8個(gè)16GB V100 gpu上花費(fèi)90小時(shí)。如果你對(duì)更多的細(xì)節(jié)感興趣,你可以閱讀原始論文"DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter"或者文章的綜述,寫的很精彩,強(qiáng)烈推薦。
總結(jié)
知識(shí)蒸餾是壓縮神經(jīng)網(wǎng)絡(luò)的三種主要方法之一,使其適合于性能較弱的硬件。
與其他兩種強(qiáng)大的壓縮方法權(quán)值剪枝和量化不同,知識(shí)蒸餾不直接對(duì)網(wǎng)絡(luò)進(jìn)行縮減。相反,它使用最初的模型來(lái)訓(xùn)練一個(gè)更小的模型,稱為“學(xué)生模型”。由于教師模型甚至可以對(duì)未標(biāo)記的數(shù)據(jù)提供預(yù)測(cè),因此學(xué)生模型可以學(xué)習(xí)如何像教師那樣進(jìn)行泛化。在這里,我們看到了兩個(gè)關(guān)鍵的結(jié)果:最初的論文,它介紹了這個(gè)想法,和一個(gè)后續(xù)的論文,展示了簡(jiǎn)單的模型,如決策樹,也可以用作學(xué)生模型。
CVPR2020 | 一個(gè)全新角度:通過(guò)量化知識(shí)來(lái)解釋知識(shí)蒸餾 CVPR 2020 | 如何同時(shí)保證NAS的效率和有效性?暗物智能等提出基于知識(shí)蒸餾的分塊監(jiān)督神經(jīng)網(wǎng)絡(luò)搜索算法 建神經(jīng)網(wǎng)絡(luò)模型,哪種優(yōu)化算法更好?35000次測(cè)試告訴你丨圖賓根大學(xué)出品


