我最近在閱讀 ICCV 關於神經網絡模型壓縮與加速的文章,順藤摸瓜閱讀了 Hinton 等大佬們在這方面的開山鉅作(Distilling the Knowledge in Neural Network)。文章很有創意,做點筆記。
文章針對的是分類問題,其主要工作解決兩個問題:
- 如何把大型網絡壓縮成小型網絡?
- 如何訓練多個網絡後融合模型以提高網絡表現能力又不佔用過大內存?(解決了第一個問題,也就解決了第二個問題)
1 硬標籤和軟標籤
假設我們做個關於汽車的分類任務,需要識別奔馳,寶馬,自行車。於是我們建立了一個以 softmax 爲損失函數的神經網絡進行識別。假設原標籤是[0,1,0],這是硬標籤(hard target)。練好的網絡對於車輛識別後給出的概率值,很可能如下圖所示:
如果採用軟標籤(soft target),練好的網絡對於車輛識別後給出的概率值,則可能如下圖所示:
誠然,一輛奔馳被識別成自行車的概率微乎其微,但是被識別成寶馬還是有一定可能性的。那麼,神經網絡爲什麼要設計軟標籤呢,它對於模型的擬合以及泛化能力會產生什麼樣的影響?
我的理解是,神經網絡採用硬標籤的時候,其實了損失了原始數據的信息,降低了模型對於數據的擬合難度,使得模型變得更加容易擬合,於是可能產生過擬合,導致模型的泛化能力下降。而採用軟標籤的時候,模型需要學習更多的知識,比如兩個接近的概率之間的相似性和差異性,從而爲模型的擬合能力帶來挑戰,增強模型的泛化能力。當然這部分我沒有嚴格的數學證明。
如何使用軟標籤呢?
就是修改了下softmax,增加了溫度係數T,如下所示:
2 如何訓練網絡
使用軟標籤是爲了更好得讓模型學習數據的分佈。但是作者模型融合的方式不是傳統的多個模型求均值,而是採用軟硬標籤加權結合的交叉熵損失函數來訓練小型模型(另外簡單講下交叉熵函數和KL散度的關係:交叉熵= 真實熵 + KL散度。參數更新時,最小化交叉熵與最小化KL散度的效果是一樣的)。如下圖所示:
訓練的過程採用以下的步驟:
- 先用硬標籤訓練大型複雜網絡(Teacher Net);
- 採用值大的T,經訓練好的 TN 進行前向傳播獲得軟標籤;
- 分別採用值大的 T 和 T=1 兩種情況,讓小型網絡(Student Net)獲得兩種不同的輸出,加權計算兩種交叉熵損失,訓練SN;
- 採用訓練好的 SN 預測類別。
綜上,採用軟標籤的知識蒸餾方法,一方面壓縮了模型,另一方面,增強了模型的泛化能力(因爲 SN 在訓練集上的效果肯定沒 TN 好)
如何採用合適的權重值、如何劃分數據集、梯度的傳遞、t如何取得好的訓練效果等問題,具體可看原文。如有描述不當的地方還請博友指正。
參考博文及資料:
https://www.cnblogs.com/liaohuiqiang/p/9170582.html
https://www.jianshu.com/p/4893122112fa
https://www.zhihu.com/question/50519680
https://arxiv.org/abs/1503.02531