【轉】知乎 知識蒸餾 survey -- 知識蒸餾 | 模型壓縮利器_良心總結 (附 Awesome-Knowledge-Distillation)

知識蒸餾 | 模型壓縮利器_良心總結

https://zhuanlan.zhihu.com/p/138210881

深度學習“煉丹師”,計算機視覺算法工程師 公衆號:CV煉丹猿

附:【Awesome-Knowledge-Distillation

1.什麼是知識蒸餾

最近利用知識蒸餾的方法,對業務中的性能有了可觀的提升,因此在這裏總結一波。本文主要從宏觀的角度分析一下各個蒸餾算法的蒸餾方式,具體細節可以根據興趣閱讀論文~ 知識蒸餾是一種模型壓縮常見方法,用於模型壓縮指的是在teacher-student框架中,將複雜、學習能力強的網絡學到的特徵表示“知識蒸餾”出來,傳遞給參數量小、學習能力弱的網絡。從而我們會得到一個速度快,能力強的網絡,因此這是一個概念上的模型壓縮方案。從另一個角度來說,蒸餾可以使得student學習到teacher中更加軟化的知識,這裏麪包含了類別間的信息,這是傳統one-hot label中所沒有的。由於蒸餾中軟化標籤的本質,因此蒸餾也可以被認爲是一種正則化的策略。總結來說,知識蒸餾除了能夠學習到大模型的特徵表徵能力,也能學習到one-hot label中不存在的類別間信息。現有的知識蒸餾方法主要側重於兩點:從teacher的什麼位置學習 和 用什麼方式學習。以下的總結圖概述了本文要介紹的蒸餾方法。

目錄結構:

 

深度學習(異步圖書出品)

京東

¥ 140.70

去購買​

2.知識蒸餾詳解

1.從teacher的輸出進行學習

(1)KL:知識蒸餾:蒸餾開山之作 https://arxiv.org/pdf/1503.02531.pdf

 

如上圖所示,本文中直接利用KL散度來衡量教師模型和學生模型的輸出分佈,通過最小化KL散度的方式,使得學生模型的輸出分佈能夠儘可能的逼近教師模型,從而實現知識蒸餾的目的。KL散度是一種衡量兩個概率分佈之間的差異的數學概念,有不懂的同學請出門左拐百度一下,右拐也行Google一下。

2:學生並不是很聰明,需要優化學習方法

(2)FT:相關性因子加權學習法 https://arxiv.org/pdf/1802.04977.pdf

(3)PKT:概率分佈學習法 https://arxiv.org/pdf/1803.10837.pdf

 

 

上述兩篇文章的作者認爲學生一般都是不聰明的,爲了讓學生能夠更好的理解教師模型,FT算法這篇文章提出了一種新的知識轉移方式,如圖所示,利用卷積運算對教師模型的輸出進行編碼,並解碼(翻譯)給學生。而位於學生模塊部分也添加一個卷積操作,用來學習翻譯後的教師知識。實驗證明這種方式要比直接學習效果好。PKT算法這篇文章提出了另一種新的知識轉移方式,如圖所示,該文章讓學生模型學習教師模型的概率分佈,使得整體的學習更加容易,更魯棒。作者提出了一種通過匹配數據在特徵空間中的概率分佈進行知識蒸餾,PKT算法的另一個優勢是該方法可以直接轉移不同架構和維度層之間的知識。

3:學習不能單打獨鬥,要學會合作

(4)RKD:關係型學習法 https://arxiv.org/pdf/1904.05068.pdf

(5)CC:多輸入聯繫型學習法 https://arxiv.org/pdf/1904.01802.pdf

 

所謂的單打獨鬥就是一個樣本進行自我學習,單打獨鬥的蒸餾方法使得學生模型只能學習教師模型的輸出表現,無法真正學習到教師模型的結構信息。而這兩篇文章的作者都提出了多個樣本之間進行合作學習的蒸餾學習方法,使得學生模型能夠更好的學習到教師模型的結構信息。RKD關係型學習算法的核心是以多個教師模型的輸出爲結構單元,取代傳統蒸餾學習中以單個教師模型輸出學習的方式,利用多輸出組合成結構單元,更能體現出教師模型的結構化特徵,使得學生模型得到更好的指導。CC多輸入聯繫型學習法在上述RKD算法的基礎上,爲了更好的擴大類間差異,更好的縮小類間距離,CC算法提出了兩種採樣方法:包括均衡類別採樣法和均衡超類別採樣法。所謂的均衡類別採樣法,即假設每個batch大小爲48,則這48個樣本分佈來自於6個類別,每個類別8個樣本,使得整體的學習樣本不像RKD算法那樣是隨機的。

2.從teacher的中間進行學習

1.首次提出的中間學習法

(1)Fitnet:階段性知識蒸餾 https://arxiv.org/pdf/1412.6550.pdf

 

FItnet這篇文章首次提出了從教室模型的中間層去進行蒸餾學習,而不僅僅關注教室模型的輸出。因爲通過中間層的引導,使得學生模型進行了提前學習,使得最終的蒸餾學習效果變得更好。

2.幾種新的表示中間層信息的方式

(2)VID:互信息學習法 https://arxiv.org/pdf/1904.05835.pdf

(3)SP:相似性矩陣學習 https://arxiv.org/pdf/1907.09682.pdf

(4)AT:注意力學習法 https://arxiv.org/pdf/1612.03928.pdf

 

 

爲了更好的表徵神經網絡中間層的特徵,如上圖所示,本文列舉了三種不同形式的用於更好抽象的表徵中間層特徵的新的蒸餾形式。其中VID互信息學習法,將中間層知識蒸餾的最優性能定義爲最大化教師和學生網絡之間的互信息。那麼爲什麼通過最大化互信息可以使得蒸餾學習變得有效呢?首先作者對互信息做了定義:互信息爲[教師模型的熵值] - [已知學生模型的條件下的教師模型熵值]。而我們又有如下常識:當學生模型已知,能夠使得教師模型的熵很小,這說明學生模型以及獲得了能夠恢復教師模型所需要的“壓縮”知識,間接說明了此時學生模型已經學習的很好了。而這種情況下也就是說明上述公式中的熵很小,從而使得互信息會很大。作者從這個角度解釋了爲什麼可以通過最大化互信息的方式來進行蒸餾學習。而在SP相似性矩陣學習法中,作者提出了一種新的知識蒸餾形式,該方法是作者觀察到相似語義的輸入往往會使得神經網絡輸出相似的激活模式這一現象啓發得到的。該知識蒸餾方法被稱爲保持相似性知識蒸餾(SPKD),該方法使得教師網絡中相似(不同)激活的輸入樣本對,能夠在學生網絡中產生相同(不同)的激活,從而指導學生網絡的學習。而在AT注意力學習法中,作者認爲注意力在人類視覺體驗中起着至關重要的作用。以圖像分類爲例,注意力地圖展示了學習完成後的網絡模型更關注於圖像的哪個區域,是網絡模型學習成果的體現。本文通過迫使學生模型模仿強大的教師模型的注意力特徵圖,來顯著提高學生模型的性能。爲此,本文提出了基於激活注意力地圖的蒸餾法。

3.更細節的選擇性中間層學習法

(5)NST:基於濾波器的知識蒸餾 https://arxiv.org/pdf/1707.01219.pdf

上述提到的FitNet由於讓學生模仿全部的特徵圖,這種過於嚴格的設定,使得最終可能對性能和收斂性產生不利的影響。而上述提到的三種通過不同編碼格式表徵特徵的方式,都是以層爲單位進行特徵編碼和學習的。而本文提出了一種更細節也更靈活的知識蒸餾策略,該方法關注的是每一個通道的激活,以一種可選擇的方式進行蒸餾學習。具體來說:按照深度學習的特點,每個神經元按照任務從輸入提取某(幾)種特定的特徵,這是神經元的選擇性。反過來說如果一個神經元被某些樣本或者圖像某些區域激活,那麼這些區域/樣本就是有共同語義特徵的。因此在每一層中,以濾波器爲單位,對每個濾波器進行loss匹配,實現基於濾波器的知識蒸餾,也間接實現了對特徵的選擇學習能力。

4.授人以魚不如授人以漁

(6)FSP:授之以魚不如授之以漁 http://openaccess.thecvf.com/content_cvpr_2017/papers/Yim_A_Gift_From_CVPR_2017_paper.pdf

 

和之前對中間層特徵進行直接學習的方式不同,本文提出了一個偏哲學的論點:授之以魚不如授之以漁。具體來說就是,如上圖所示,本文將教師模型網絡層與層之間的映射關係作爲學生網絡學習的目標,而不是像之前提到的直接對教師模型的中間結果進行學習。通過讓學生學習這種獲得特徵的方法,而不是直接學習特徵本身,文章的結果顯示,這種方式確實有助於提高學生模型的魯棒性。

3.從teacher的激活邊界進行學習

(1)AB:激活邊界學習 https://arxiv.org/abs/1811.03233.pdf

(2)利用對抗樣本進行激活邊界學習 https://arxiv.org/abs/1805.05532.pdf

 

在分類任務中,小模型真正的缺陷更多的在於對邊界樣本(難例樣本)的分類困難。而這真是我們在分類任務中最關心的問題。而教師模型處理邊界的能力一定是要優於學生模型的。因此嘗試用學生模型學習教師模型的邊界分佈,這將是蒸餾學習的新思路。本部分列舉了兩種不同的邊界學習方法。AB激活邊界學習法,通過最大化邊界誤差的方式,來引導學生模型學習更強的邊界約束能力。利用對抗樣本進行邊界激活學習的方法,首先定義一個基類並通過基類找到各個類別中的對抗邊界,最終通過對抗邊界樣本進行蒸餾學習。

4.自己向自己學習

1.自學

(1)be your own teacherr https://arxiv.org/pdf/1905.08094.pdf

(2)強制拉近類內距離:regularzing class-wise https://arxiv.org/pdf/2003.13964.pdf

(3)類內的魯棒性學習:Data-Distortion Guided https://www.researchgate.net/publication/335476911_Data-Distortion_Guided_Self-Distillation_for_Deep_Neural_Networks

 

 

由於我們不一定可以在所有任務中都順利的獲取教師模型,有的大模型由於數據的缺失,很難被正常的訓練出來。基於這種情況,很多研究者提出了自我學習的策略。簡單來說該策略就是自己作爲自己的老師,進行自我優化。本部分列舉了三種自學習的方式。be your own teacher這篇文章將網絡較深部分的知識壓縮到較淺部分,也就是說該蒸餾策略的教師模型和學生模型來自與同一個模型,這大大降低了蒸餾學習的複雜度,並且通過增加額外的訓練檢測模型,在不增加前向推理時間的前提下提升了自我學習的能力。舉例來說,如上圖中以resnet50爲例,在每個block之後都接出一個bottleneck作爲隱藏層的監督輸出模塊,並接出一個全連接層作爲每個子模塊的子分類器。每個子分類器都作爲一個小的學生模型,其對應的教師模型爲主分類層的輸出,最終實現自我蒸餾的學習。另外兩篇文章的思路主要從同一個類內的樣本出發進行自我學習。其中強制拉近類內距離這篇文章,在訓練的過程中,首先我們會從數據迭代器中提取batch1大小的數據,同時選出和當前batch1中類別相同的樣本形成batch2,並將兩個batch的樣本組合起來進行聯合訓練。具體來說就是每一此計算loss時,從batch1和batch2中各挑選出一個同類樣本,在loss計算中儘可能的是的這兩個同類樣本的輸出分佈一致,這種方式是一種廣義上的自我學習的策略,且這種訓練方式能夠強制減小類內的差異,且可以利用這種方式減小某些過度自信的異常值的預測。其中增強類內魯棒性這篇文章,也是從對同一個類別的樣本進行聯合學習,具體操作如下:對輸入batch中每個圖片利用不同的數據增強方式增強層兩份輸入,這兩份輸入的標籤爲同一個類別,將兩份輸入特徵concat之後通過卷積層提取全局特徵,並將得到的特徵向量進行對應的切分,在訓練過程中通過最小化切分後特徵向量間的差異,從而增強同一個類內的多樣性提升魯棒性,該過程也可以被認爲是自己和自己學習。

2.互相學習

(1)DML:互相學習 https://arxiv.org/pdf/1706.00384.pdf

(2)知識嫁接 https://arxiv.org/pdf/2001.05868.pdf

 

 

與自學習類似的是互相學習策略中不存在教師模型,與自學習不同的是互相學習的方式通用是多個模型之間的學習,而自學習僅僅只有一個模型。其中DML:互相學習這篇文章就是一種典型的互相學習的方式,DML是在訓練過程中,幾個需要反向傳播的待訓學生網絡協同學習,互相傳遞知識。每個互相學習的網絡都有一個標準的分類Loss和互學習Loss,其中互學習Loss是一個KL散度。 具體而言,兩個網絡的softmax輸出爲p1,p2.則互學習的意義在於,對於Net1(Net2亦然),對了提高其泛化能力,使用Net2的p2作爲一種後驗概率,然後最小化p1,p2的KL散度。而知識蒸餾這篇文章更像是一種廣義上的互相學習方法,該文章的主要是思想是並行地訓練多個網絡,對所有網絡的參數進行重要性排序,並另一個並行網絡中的更有效的權重替換到當前網絡的不重要權重的位置,在訓練過程中通過這種重要性權重的互相替換實現互相學習。

6.利用對抗的方式進行學習

(1)GAN對抗學習 https://arxiv.org/pdf/1709.00513.pdf

(2)無監督對抗學習 https://arxiv.org/pdf/1904.01186.pdf

 

本部分主要列舉了兩種利用GAN網絡進行蒸餾的文章。GAN對抗學習這篇文章就是典型的利用生成對抗網絡的例子,具體來說,學生網絡作爲生成器,生成對應的輸出結果,而教師網絡用來表徵GT信息,而鑑別器主要被用來鑑別學生網絡的輸出和教師網絡的輸出,最終學習的目的就是是的學生網絡能夠欺騙鑑別器,是的鑑別起無法區分出學生網絡和教師網絡的輸出。最終實現學生網絡學習到了教師網絡的輸出特徵和分佈。而無監督對抗學習這篇文章的出發點有點不一樣,由於一些實踐問題(如隱私、法律等問題),給定深度網絡的訓練數據往往不可用,除了一些接口之外,給定網絡的架構也是未知的。基於此,本文提出了一種利用生成對抗網絡訓練高效深度神經網絡的新框架。講預先訓練好的教師網絡看作一個固定的鑑別器,利用該鑑別器產生的訓練樣本可以得到最大的鑑別結果。然後,利用生成的數據和教師網絡,同時訓練出模型尺寸較小、計算複雜度較低的高效網絡。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章