所謂“知識精煉”我的理解就是將一個訓練好的復雜模型的“知識”遷移到一個結構更為簡單的網絡中,或者通過簡單的網絡去學習復雜模型中“知識”或模仿復雜模型的行為。當然“知識”的定義方式并不是唯一的,見仁見智。KD不同于遷移學習和多任務學習的地方在于它是單一任務在同一個域下的知識傳遞。隨著深度網絡的層數和參數的迅速增長,深度學習在實際應用中的部署越來越困難。因此,結合KD來壓縮和加速網絡的推理就顯得尤為重要。目前關于KD的文章大致分為三類:
如何定義知識
outputs: logits / soften probability
《Distilling the knowledge in a neural networks》
知識精煉方法最早可以追溯到2006年的這篇文章,作者的做法是用小網絡去擬合復雜網絡的logits。Hinton在這個工作的基礎上做了改進,他提出了soft target的做法。擬合soft target的優點是很多的,一方面可以提供更多信息,彌補監督信號不足的問題;另一方面可以恢復類內variance和類間distance。其本質是打散原來壓縮到了一個點的監督信息,讓小模型的輸出盡量match 復雜模型的輸出分布;另外soft target還可以看作一個正則項,起到防止過擬合的作用。soft target其實就是軟化的softmax,比常規的softmax多了一個溫度系數T,以達到蒸餾的目的。而且當T充分大的時候,擬合soft target的做法和logits其實是等價的。文章的不足在于只將網絡輸出作為知識傳遞給小網絡的做法過于簡單,teacher模型理論上是有很多知識可以傳遞給student模型的;而且這種做法只適合有softmax的分類任務,并且要求類別數比較多,對于二分類問題就沒有太大效果;最后一點不足是student模型不能是太深的網絡。-
feature map
《Fitnets: hints for thin deep nets》
本文試圖將一個復雜網絡的知識傳遞給一個深度更深但是參數更少的網絡,因為作者認為深度對于網絡的表達能力至關重要。訓練一個深層網絡的難度在于優化,即如何克服梯度消失的問題。文章提出了intermediate-level hints的概念,即先用student模型學習teacher 模型的中間表示,目的是讓student模型取得一個較好的局部最優點作為初始參數。第二階段的訓練把整個student模型作為優化目標,讓student模型學習teacher模型的soft targets。得益于網絡的深度,student模型的性能甚至超過teacher模型。文章的不足在于用student模型粗暴地學習teacher模型中間層的feature map,這有可能發過來影響student模型的性能和收斂,而且teacher模型和student模型的中間層的選取有很大的人為因素。《Knowledge Projection for DNN》
這篇文章的做法和fitnet的做法幾乎完全相同,兩點改變:中間層的選取上采用了迭代選擇的方案,選擇標準是聯合loss最?。籺eacher模型的中間輸出不只監督student模型的底層,也被繼續利用監督student模型的高層訓練。 attention map
《Pay more attention to attention》
本文將attention map作為知識從teacher模型遷移到student模型。注意力機制很早就被用在NLP中,后來被證明將attention應用在CNN中也可以取得不錯的效果。作者提出attention map的原因是feature map的做法太多生硬,表現不佳。定義attention map的做法是將feature map不同通道的feature plane取絕對值然后相加。損失函數也做了改變,即在原損失函數的基礎上加上teacher和student模型的attention maps之間的歐氏距離。attention map的做法可以看作全激活feature map的summary,所以擬合attention map的效果略好于feature map也是容易理解的。雖然比feature map的做法有進步,但是仍然存在要人為選取中間層的問題。mini-batch MMD
《Like What You Like: Knowledge Distill via Neuron Selectivity Transfer》
這篇文章在attention transfer的基礎上引入了kernel trick,insight來自于風格遷移的做法,當kernel取線性核的時候attention transfer只是MMD的特例。作者之所以利用kernel trick將feature map映射到高維空間,是因為他認為attention map的做法粒度還是比較大。當kernel取二階多項式核的時候,根據gram矩陣的性質,feature map的channel之間的內積可以轉化為feature map空間的相關性,即讓student模型學習teacher模型的feature map通道之間的關系或者空間像素點之間的關系。具體的方法和attention transfer相同。layers relation
《Gift from Knowledge Distillation》
這篇文章定義的知識不是模型的輸出而是層與層之間的關系,相當于把MMD中的同一層feature map的相關性用到了不同層的feature map上,這里的關系用FSP矩陣表示。因為層之間的關系相比輸出更本質,更能反映網絡的knowledge。其中FSP矩陣(i,j)位置的值等于第i個channel和第j個channel的內積,然后讓student和teacher模型的FSP矩陣之間的距離最小。感覺這篇文章的做法不是直接學結果,而是學習得到這種結果的方法和過程,是一個不錯的思路。-
gradient map
《Pay more attention to attention》
基于gradient的attention map和基于activation的attention map的思想來自于同一篇文章,輸出對于輸入的梯度也反映了輸入和輸出層之間的關系,而且直接考慮輸入輸出的關系省去了很多人為選擇中間層的操作。文中提到把teacher模型中loss對input的導數作為知識傳遞給student模型,因為loss對input的導數反映了網絡output的變化對于input的敏感程度,如果某個像素一個小的變化對于對于網絡輸出有一個大的影響,我們就可以認為網絡"pay attention"那個像素。具體做法和基于activation的attention map相同,不過這里在反傳梯度的時候相當于對student模型的input求了兩次導數。《Sobolev training for neural network》
這是NIPS'17的文章,作者提出在sobolev空間中近似兩個函數,即不光match兩個函數的輸出,還match輸出對于輸入的梯度,即梯度也提供了非常豐富的信息。把teacher和student模型分別看作兩個函數,采用sobolev訓練的方式比只match輸出要好很多。 mini-batch rank
《DarkRank: Accelerating Deep Metric Learning via Cross Sample Similarities Transfer》
之前的工作都是考慮teacher模型和student模型的輸出以及中間結果的匹配,insight來源于Hinton的soft target,即讓student模型學習teacher模型的不同樣本之間的排序關系。假設1個batch有7個樣本進來,輸出端得到7張feature map,但這7張feature map是有親疏遠近關系的,對于類別6, 樣本0到它的距離小于5到它的距離。換句話說,在teacher模型中這7個樣本在類別6上的排序關系也可以作為知識傳遞給student模型。
改進學習框架
《Rocket Launching: A Universal and Efficient Framework》
這篇文章在定義知識上沒有大的創新,使用的仍然是logits,但是在學習框架上和之前有所不同。它不用預訓練teacher模型,而是student和teacher模型同時訓練;另外一點是共享網絡參數,共享一部分參數相當于火箭發射點火助推器的作用。所以student模型不是向一個已經完全學好的teacher模型學習,每次都去學習一個相對正確的輸出,而是和teacher模型一起學習成長,連同teacher模型犯錯后糾錯的過程也一并學習了。
特定場景應用
《Mimicking Very Efficient Network for Object Detection》
在檢測任務中,直接擬合logits或者feature map都是不可行的。所以作者采用匹配proposal的做法。
《Cross Modal Distillation for Supervision Transfer》
作者提出跨模態遷移知識的做法,即在RGB數據集學習到的知識也能遷移到深度場景中來。
《Face Model Compression by Distilling Knowledge from Neurons》
人臉識別中,遷移的知識更具針對性,選擇特定的特征去擬合,盡量做到特征選擇的均勻性。
《Data-free knowledge distillation for deep neural networks》
這篇文章的應用場景是當訓練數據由于隱私等問題對于student模型不可用的時候,如何通過extra metadata的方式解決。
經典方法結合
《Learning loss for knowledge distillation with conditional adversarial networks》
這篇文章將GAN和KD做了一個結合,取得了不錯的效果。作者認為student模型的容量遠小于teacher模型,讓student模型完全匹配teacher的做法有點困難,而且采用l2損失逼近的方式一定程度上限制了student模型的自主學習空間。學生網絡是生成器,判別器是一個多層感知機網絡,生成器和判別器迭代優化,生成器的目標是生成讓判別器無法辨別的logits。某種程度上,這個工作也可以理解成對損失函數做了改進。
《Using Knowledge Distillation To Improve Low-Precision Network Accuracy》
本文將KD和網絡量化做了一個結合,用高精度teacher模型指導低精度student模型的訓練。網絡參數精度下降后準確率勢必會受到影響,在獲得teacher模型的知識之后或許可以從一個壞的局部最優點爬上來。作者提出了3種思路:teacher模型和量化后的student模型聯合訓練;預訓練的teacher模型指導量化的student模型從頭開始訓練;teacher模型和student模型均進行了預訓練,不過student模型在全精度權重基礎上做了量化,然后student在teacher模型的指導下進行finetuning。
《Moonshine: Distilling with Cheap Convolutions》
這篇工作將KD和設計輕便的網絡結構方法做了結合。當復雜網絡結構被簡化的卷積模塊替換的時候,計算更加高效,精度勢必受到影響。此時,將原網絡作為teacher模型,簡化之后的網絡作為student模型,然后通過teacher模型指導student模型的訓練。