最近看了幾篇KD方法用于模型壓縮的文章,現總結如下:
- Knowledge Distillation 最先由 Hinton 提出的,大意是說:小模型在分類的時候,光用訓練集里的 one-hot label 不好,因為這種標注把類別間的關系割裂開了。而如果讓小模型跟著大模型輸出的概率分布去學的話,就相當于給出了類別之間的相似性信息,提供了額外的監督信號,因此學起來更容易。比如說識別手寫數字,同時標簽為 3 的圖片,可能有的比較像 8,有的比較像2,one-hot labels 區分不出來這個信息,但是一個 well-trained 大模型可以給出。因此,修改一下損失函數,讓小模型在擬合訓練數據的 ground truth labels 的同時,也要擬合大模型輸出的概率分布。這個方法叫做 KD Training (Knowledge Distillation Training)。
- 后來 Romero 又提出了 FitNet,大意是說:直接讓小模型在輸出端模仿大模型,這個對于小模型來說太難了,模型越深越難訓,最后一層的監督信號要傳到前面去還是挺難的。解決方案就是說,不如在中間加一些監督信號。于是訓練的方法就是所謂的 hint training,把網絡中間的輸出也拿出來,讓大模型和小模型中間層的輸出也要盡量接近,讓小模型去學習大模型做預測時的中間步驟。實際做的時候是用兩階段法:先用 hint training 去 pretrain 小模型前半部分的參數,再用 KD Training 去訓練全體參數。
- Sergey在ICLR‘17上發表了一篇文章,他將NLP里面的Attention機制也引入到KD方法中。具體做法是student網絡不僅模仿teacher網絡softmax輸出,也模仿teacher網絡的feature map中的attention map,attention map的獲取方法并不是唯一的,文中的做法是將網絡的feature map取絕對值。
- 圖森的王乃巖今年也出了兩篇用KD思想做網絡壓縮的文章,其中一篇和Sergey的引入attention的做法十分類似,只不過在論文中作者換了個名詞“Neuron Selectivity Transfer”,就是模仿teacher網絡中的神經元激活值比較大的區域,但是并沒有對feature map取絕對值,而是直接用子網絡mimic母網絡的feature map;另一篇文章“DarkRank”的做法比較新穎,作者試圖將teacher網絡中一種特殊的知識遷移到student網絡中,文中叫“Cross Sample Similarities”,意思是說如果有N個樣本,它們在student網絡中提取的特征之間的相似性大小要和這些樣本在teacher網絡中保持一致。
References:
https://www.zhihu.com/question/63942461