動機:
目標:想要獲得一個實時的模型,且盡可能的准確。
我們有一個大模型性能很好,但是很慢:

我們有個小模型速度很快,但是性能很差:

動機:面臨的挑戰
1、由於容量和能力,小模型很難達到一個很好的性能。
2、精確度和模型壓縮之間的差距還是很大
3、物體檢測比分類要困難得多:
a、 標簽的計算更加昂貴
b、 類別不均衡
c、多任務同時需要分類和回歸
4、直接應用蒸餾在檢測模型上並不能很好的工作。
背景,前人的工作:
1、 大網絡的加速
a、減少通道的數量 (訓練前)
b、剪枝 (訓練后)
c、low rank decomposition (低秩分解見下圖)
HWS:高寬通道數。D越小越快,D越大總結信息能力越強。 resnet bottlenek 也是同樣的道理,FC層也可以分解

壓縮一個模型的步驟:

常用的張量分解方式是:Tucker 分解。將4維張量分解為4個小張量
還可以用SVD分解,就要將四位tensor轉變成2維的向量,比如(D*D*R1, R2)2 、 進行SVD分解 3、 恢復成D*D的卷積核 和 1*1 的卷積核

2、 提高小網絡的性能:
a、設計新的結構(squeeze Net, Binary connection)
b、知識蒸餾
知識蒸餾:
利用已經訓練好的模型
用壓縮之前的模型作為老師,壓縮之后的模型作為學生。
如何模仿呢?
Hints的方法是,老師的分類標簽當成人為設定的標簽來用。
當然,有人也探索過別的方法,不用標簽用標簽的前一層,去模仿老師的神經元,而不是模仿標簽。
傳統標簽是one hot。 老師給出的標簽只給出概率值。
qi: 是老師給出的每一類的可能性,Zi 是老師預測最終一層的神經元。第i類神經元的指數處以所有神經元的指數
T :溫度軟化神經元。不會跟人工給的標簽一模一樣。放大老師的標簽,含有豐富的信息量。
為什么要放大呢?
因為老師的標簽中可能含有人工標簽沒有的信息。image中的汽車預測正確的概率是90%,預測成卡車的概率10%,汽車卡車相似性要遠高於汽車和人。但是傳統標簽中汽車預測稱人和汽車預測成卡車的概率都是0
但是老師會捕捉到這一點,可以學到人類沒有給出但是確實成立的信息。

基於目標檢測的模型蒸餾(景馳):
挑戰? 1 分類問題+回歸問題
2 在大規模數據集上證明其有效性
1、 成功的應用了知識蒸餾對於多類別物體檢測問題
2、 提出了新的LOSS函數對於物體檢測任務
3 、 在不同的dataset上驗證了方法
4、 分析了只是蒸餾的方法在什么條件下是管用的,為什么管用,且解決了神經網絡訓練中的哪些問題
模型:
1、目標檢測使用的比較傳統的fastrcnn,wo stage:
a、 隨機產生框,不同比例和大小,先用一個網絡判斷是否有物體,選擇很可能物體的框,(RPN網絡)
b、 再把框放回一個分類網絡中 解決是什么物體的問題(rcnn 區域分類網絡)
在分類的過程中每個框由兩部分:1、是否是背景還是有物體,車 還是交通燈?
2、調整大小和位置
2、在知識蒸餾中,分類和回歸都要作為學生學習的目標,不僅僅要學習標簽,還讓學生網絡去學習中間層的一些信息,被證明是很有效的。

例如:下圖中上面非常長的是teacher網路,藍色的是標簽

學生網絡:
一方面要學生把老師的輸出去學習
另一方面學生的中間層(下圖第一塊紫色)去盡量模仿老師的某一層。

模仿標簽時候,是把老師的標簽和學生標簽放到一起,接入到一個目標函數,計算反向傳播
在模仿中間層的時候並不是直接接目標函數,而是中間加了一個適應層,通過這個適應層使得學生和老師的神經元進行匹配
原因呢?
1、老師和學生盡管有聯系,但並不是一一對應的。例如:學生網絡比較淺,同一層的神經元看到的區域比較小,老師的一個神經元看到的區域比較大,比較深,直接去匹配是不合適的。
需要進行一些領域的遷移,方便學到有用的信息。
2、卷積網絡分卷積層和全連接層。卷積層是一一對應,全連接層是順序打亂的。
學生和老師每一層里面的神經元,統計上攜帶的信息可以相比,但是順序未必是一一對應的,所以要+1層,使其順序對應。
目標函數:

詳細來看呢? Lhard 表示的是:從人工給的標簽中學習
Lso'f't 表示的是:從老師給的標簽中學習
Lsoft使用的是類似交叉熵,但是給每一類加了不同的權重。是因為目標檢測問題和分類問題是不同的:負類遠多於正類
回歸問題:
不能使用交叉熵,甚至於不能直接使用老師給出的標簽。
例如:對於分類問題某個框 70%的概率是一張臉,只蓋住了臉的70% 其余是背景
但是對於回歸問題:老師給出的是:往右挪10cm才能蓋住臉,人給的標簽顯然是更精准的,老師給的最精准的也無非是挪10cm剛好蓋住臉
因此把老師給的當作標簽是不合理的。
怎么利用老師給的信息呢?
可以把它當成一個下屆來用。比如:當學生預測的比老師還要遠的時候,老師預測 老師和人工給的目標更近 ,這個學生做得很差,加倍改正錯誤
如果學生做的比老師好,就不需要額外的結構學習更多的東西了
所以在這里用了一種把老師的信息當作下屆來使用。

學習中間神經元的目標函數:
L2 loss 距離的平方來做的,通過適應層以后,讓學生神經元模仿老師神經元的輸出。
分析是否知識蒸餾只對特定的老師和學生有用?
比如說:壓縮網絡得到一個學生,學生參數和老師理應相同,如果是完全不同的網絡結構,就不合理了呢?
還有,假設學生和老師的輸入是一致的,得到一致的輸出,如果不一致呢?
學生在壓縮到多少的時候方法管用,壓縮的范圍是?
工作的流程是:
1,訓練一個比較好的網絡,來當作老師
2,壓縮網絡,用SVD或者tucker分解 來壓縮
3,最好用imagenet 預訓練一個淺層的學生網絡
4,用比較深的網絡引導學生的訓練

下圖是將方法,加在不同的學生老師 和不同的數據集上的結果:
最左邊是用的經典學生網絡:ALEX 7層 VGG是用到最復雜的結構 VGGM 是 VGG16的簡化版
Tucker ,是前面提到用tucker分解 壓縮alexnet得到的網絡結構
第二列是:對於一個學生用不同的老師
可以看到,隨着老師越來越好,學生能提高到的精確性也越來越好,例如:Tucker 如果使用VGG16作為引導可以將pascal數據集上精度提升到54.7到59.4 4.7個點
這個數值和老師的70.4 還是有差距,畢竟很深,容量大太多了
有意思的是PASCAL和KITTI都是小數據集,幾千到1W
COCO 和ILSVRC 幾萬到十幾萬
可以看到,在小數據集上提升很大,在大數據集上提升小,某些情況下還挺大。說明了容量其實是有極限的,知識蒸餾可以幫助召回一些精度,但是很難和復雜網絡相媲美

之前提到了很多知識蒸餾的策略,比如:
1、對交叉熵進行加權
2、對於回歸問題作為一個上屆
3、網絡中加一個適應層,去匹配老師的神經元和學生的神經元
下圖說明了這些操作有沒有效果,現在小數據集上進行測試,再投放大數據集
第一列是baseline:
第二列是在回歸任務中,直接讓學生模仿老師,會損害精度,是不如人工給的標簽精確的
第三列是把老師作為上屆之后提升不少。
后面是是否給分類權重
在后面是去模仿老師神經元的時候,要不要加適應層。
合到一起把之前所有的方法,可以得到最好的精度

下圖是:模型大小和精度之間的關系:
就是蒸餾的極限在哪里?
壓縮網絡的極限在哪里?什么壓縮比,速度和精確性更好的均衡。
所以使用的Tucker
FLOPS 代表的是運算量,FLOPS 20%代表 保留20%的運算量
隨着壓縮比的提升,實際上知識蒸餾隨着壓縮比的提高,效果是增加的,比如壓縮比在25%的時候,效果提升了+6.1 ,45是只提升+4.3
但是模型容量太小,也不行,只能進行有限的提升

學生和老師的輸入是相同,模仿行為是合理的
但是學生和老師輸入不相同呢?
都用alexnet 老師看高分辨率的 學生看低分辨率的。畢竟改變大小是提升速度最有效的辦法。
可以看到不管是用alexnet作為老師和學生還是壓縮過的模型作為老師和學生都有提高

分析一下背后的原理:
為什么知識蒸餾對學生網絡會有提升呢?
1、 老師會通過很深的網絡學到人類並沒有給出但是確實存在的信息。比如:車和卡車更像,和8更像
但是學生網絡不能總結出這些信息,讓老師交給他,跟容易分類它能力之外的情況
所以它的泛化能力也會相應變強

標簽學習為什么會起作用?(知識蒸餾)
知識蒸餾是把網絡的輸出當成一個標簽來用,給出暗藏的信息
但是為什么模仿神經元也是有效的呢?
神經元很難說攜帶什么信息,每一個卷積對圖像不同的位置是有特定的反應的。比如,有些對人臉,有些對電視機
通過模仿神經元的行為,就可以感知到老師是怎么看待這張圖像的。
學生網絡太淺了,是欠擬合的,訓練數據都不能分對,老師欠擬合程度會少一些。
所以:模仿神經元可以幫助學生解決欠擬合的問題,得到更多的信息繞過局部最小和鞍點。

總結一下:
為什么知識蒸餾有用的時候,提到了老師會提供隱含的信息,人類沒有給的信息,學生有了這個這個信息以后擬合人類標簽的程度是會降低的,解決過擬合問題
模仿神經元解決的是欠擬合的問題。
推測:
如果網絡面臨是過擬合問題,越教他,在訓練集上的表現會越差,至少不會改進
如果欠擬合的問題,對訓練集的擬合程度是加深的,也就是說會更加貼合到人類給的標簽上去。
但是在實際訓練過程中,比如目標檢測問題可能同時存在過擬合和欠擬合問題,因為目標檢測既要分對前景背景 和 是人是狗,這倆問題同時存在。
所以就做了相應的測試來驗證:
知識蒸餾會提升測試的准確性,但是訓練的准確性不一定提升。
隱藏神經元學習兩個都會提升

得出的結論和預測是一致的:
下圖看到在一大一小兩個數據集上,知識蒸餾提升了測試的效果,沒有提升訓練的效果,或者提升很小
模擬神經元會同步的提升

之前提到了過擬合的問題,過擬合解決辦法是dropout,用我們的方法(知識蒸餾)和dropout進行對比,下面的綠線是沒有知識蒸餾的,也不用模擬神經元,可以看到dropout對他的影響還挺大的,目標檢測的最佳比例是0.15. 圖像分類最佳是0.5
上面的藍線是,用了知識蒸餾調節dropout。
可以看到,在不用知識蒸餾和隱藏學習的情況下dropput 影響挺大的,相差了將近0.7.但是用了知識蒸餾相差在0.1,0.2以內,可以下結論說知識蒸餾確實起到了防止過擬合的作用。
但是更嚴重的欠擬合,模擬神經元有沒有提升精度呢? 更快的更精確的擬合人類給的標簽

補充:壓縮模型的方法,還有很多其他方法,還有很流行的mobilnet和shufflenet。
知識蒸餾和模型壓縮是互補的,為了在壓縮之后提升精度,這是在不改變任何網絡結構的情況下的免費提升
論文的題目:
FAQ: NEC公司決定 代碼無法開源
適應層: 並不一定是1*1的卷積層 conv 或者 deconv 比較靈活的層 ,按照 FM size而定,讓T和S的神經元數量相匹配
RPN 的標簽,分類 :二分類 回歸: 框 的回歸
RPN 和 RCN的區別是 :一個2分類,一個N+1分類
L2的位置經驗:
不要用太淺的層即可
蒸餾網絡的溫度,使用與出了softmax的其他分類和回歸嗎? 回歸不能直接學老師的
T 二分類問題盡量不要用,應為沒有很多隱藏的空間
YOLO也可以在頂層進行蒸餾的,1.2-1.6 如果只對頂層的蒸餾,高度抽象的信息,目標檢測有很嚴重的欠擬合,不一定只對頂層做蒸餾。
