1. 知識蒸餾-Distilling the knowledge in a neural network
「很多昆蟲在幼蟲形態的時候是最擅長從環境中吸取能量和養分的,而當他們成長為成蟲的時候則需要擅長完全不同能力比如遷移和繁殖。」在2014年Hinton發表的知識蒸餾的論文中用了這樣一個很形象的比喻來說明知識蒸餾的目的。在大型的機器學習任務中,我們也用兩個不同的階段 training stage 和 deployment stage 來表達兩種不同的需求。training stage(訓練階段)可以利用大量的計算資源不需要實時響應,利用大量的數據進行訓練。但是在deployment stage (部署階段)則會有很多限制,比如計算資源,計算速度要求等。知識蒸餾就是為了滿足這種需求而設計的一種模型壓縮的方法。
知識蒸餾的概念最早是在2006年由Bulica提出的,在2014年Hinton對知識蒸餾做了歸納和發展。知識蒸餾的主要思想是訓練一個小的網路模型來模仿一個預先訓練好的大型網路或者集成的網路。這種訓練模式又被稱為 "teacher-student",大型的網路是「老師」,小型的網路是「學生」。
在知識蒸餾中,老師將知識傳授給學生的方法是:在訓練學生的過程中最小化一個以老師預測結果的概率分布為目標的損失函數。老師預測的概率分布就是老師模型的最後的softmax函數層的輸出,然而,在很多情況下傳統的softmax層的輸出,正確的分類的概率值非常大,而其他分類的概率值幾乎接近於0。因此,這樣並不會比原始的數據集提供更多有用的信息,沒有利用到老師強大的泛化性能,比如,訓練MNIST任務中數字『3』相對於數字『5』與數字『8』的關系更加緊密。為了解決這個問題,Hinton在2015年發表的論文中提出了『softmax temperature』的概念,對softmax函數做了改進:
這里的 就是指 temperature 參數。當 等於1 時就是標準的softmax函數。當 增大時,softmax輸出的概率分布就會變得更加 soft(平滑),這樣就可以利用到老師模型的更多信息(老師覺得哪些類別更接近於要預測的類別)。Hinton將這樣的蘊含在老師模型中的信息稱之為 "dark knowledge",蒸餾的方法就是要將這些 "dark knowledge" 傳給學生模型。在訓練學生的時候,學生的softmax函數使用與老師的相同的 ,損失函數以老師輸出的軟標簽為目標。這樣的損失函數我們稱為"distillation loss"。
在Hinton的論文中,還發現了在訓練過程加上正確的數據標簽(hard label)會使效果更好。具體方法是,在計算distillation loss的同時,我利用hard label 把標準的損失( )也計算出來,這個損失我們稱之為 "student loss"。將兩種 loss 整合的公式如下:
這里的 是輸入, 是學生模型的參數, 是交叉熵損失函數, 是 hard label , 是參數有 的函數, 是系數, 分別是學生和老師的logits輸出。模型的具體結構如下圖所示:
在上述公式中, 是作為超參數人為設置的,Hinton的論文中使用的 的范圍為1到20,他們通過實驗發現,當學生模型相對於老師模型非常小的時候, 的值相對小一點效果更好。這樣的結果直觀的理解就是,如果增加 的值,軟標簽的分布蘊含的信息越多導致一個小的模型無法"捕捉"所有信息但是這也只是一種假設,還沒有明確的方法來衡量一個網路「捕捉」信息的能力。關於 ,Hinton的論文中對兩個loss用了加權平均: 。他們實驗發現,在普通情況下 相對於 非常小的情況下能得到最好的效果。其他人也做了一些實驗沒用加權平均,將 設置為1,而對 進行調整。
Hinton的論文中做了三個實驗,前兩個是MNIST和語音識別,在這兩個實驗中通過知識蒸餾得到的學生模型都達到了與老師模型相近的效果,相對於直接在原始數據集上訓練的相同的模型在准確率上都有很大的提高。下面主要講述第三個比較創新的實驗:將知識蒸餾應用在訓練集成模型中。
訓練集成模型(訓練多個同樣的模型然後集成得到更好的泛化效果)是利用並行計算的非常簡單的方法,但是當數據集很大種類很多的時候就會產生巨大的計算量而且效果也不好。Hinton在論文中利用soft label的技巧設計了一種集成模型降低了計算量又取得了很好的效果。這個模型包含兩種小模型:generalist model 和 specialist model(網路模型相同,分工不同)整個模型由很多個specialist model 和一個generalist model 集成。顧名思義generalist model 是負責將數據進行粗略的區分(將相似的圖片歸為一類),而specialist model(專家模型)則負責將相似的圖片進行更細致的分類。這樣的操作也非常符合人類的大腦的思維方式先進行大類的區分再進行具體分類,下面我們看這個實驗的具體細節。
實驗所用的數據集是谷歌內部的JFT數據集,JFT數據集非常大,有一億張圖片和15000個類別。實驗中 generalist model 是用所有數據集進行訓練的,有15000個輸出,也就是每個類別都有一個輸出概率。將數據集進行分類則是用Online k-means聚類的方法對每張圖片輸入generalist model後得到的軟標簽進行聚類,最終將3%的數據為一組分發給各個specialist,每個小數據集包含一些聚集的圖片,也就是generalist認為相近的圖片。
在specialist model的訓練階段,模型的參數在初始化的時候是完全復制的generalist中的數值(specialist和generalist的結構是一模一樣的),這樣可以保留generalist模型的所有知識,然後specialist對分配的數據集進行hard label訓練。但是問題是,specialist如果只專注於分配的數據集(只對分配的數據集訓練)整個網路很快就會過擬合於分配的數據集上,所以Hinton提出的方法是用一半的時間進行hard label訓練,另一半的時間用知識蒸餾的方法學習generalist生成的soft label。這樣specialist就是花一半的時間在進行小分類的學習,另一半的時間是在模仿generalist的行為。
整個模型的預測也與往常不同。在做top-1分類的時候分為以下兩步:
第一步:將圖片輸入generalist model 得到輸出的概率分布,取概率最大的類別k。
第二步:取出數據集包含類別k的所有specialists,為集合 (各個數據集之間是有類別重合的)。然後求解能使如下公式最小化的概率分布q作為預測分布。
這里的KL是指KL散度(用於刻畫兩個概率分布之間的差距) 和 分別是測試圖片輸入generalist 和specialists(m)之後輸出的概率分布,累加就是考慮所有屬於 集合的specialist的「意見」。
由於Specialist model的訓練數據集很小,所以需要訓練的時間很短,從傳統方法需要的幾周時間減少到幾天。下圖是在訓練好generalist模型之後逐個增加specialist進行訓練的測試結果:
從圖中可以看出,specialist個數的增加使top1准確個數有明顯的提高。
本文結合Hinton在2014年發表的論文對知識蒸餾和相關實驗做了一個簡單的介紹,如今很多模型都用到了知識蒸餾的方法,但知識蒸餾在深度學習中還是非常新的方向,還有非常多的應用場景等待研究。
項目地址: https://momodel.cn/explore/5dc3b1223752d662e35925a3?type=app
[1]Hinton G, Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv preprint arXiv:1503.02531, 2015.
[2] https://nervanasystems.github.io/distiller/knowledge_distillation.html
[3] https://www.youtube.com/watch?v=EK61htlw8hY&t=3323s
2. 知識蒸餾綜述:網路結構搜索應用
【GiantPandaCV導語】知識蒸餾將教師網路中的知識遷移到學生網路,而NAS中天然的存在大量的網路,使用KD有助於提升超網整體性能。兩者結合出現了許多工作,本文收集了部分代表性工作,並進行總結。
知識蒸餾可以看做教師網路通過提供soft label的方式將知識傳遞到學生網路中,可以被視為一種更高級的label smooth方法。soft label與hard label相比具有以下優點:
那麼知識蒸餾在網路結構搜索中有什麼作用呢?總結如下:
知識蒸餾在很多工作中作為訓練技巧來使用,比如OFA中使用漸進收縮訓練策略,使用最大的網路指導小網路的學習,採用inplace distillation進行蒸餾。BigNAS中則使用三明治法則,讓最大的網路指導剩下網路的蒸餾。
目標:解決教師網路和學生網路的匹配問題(知識蒸餾中教師網路和學生網路匹配的情況下效果更好)。
在知識蒸餾中,選擇不同的教師網路、不同的學生網路的情況下,最終學生網路的性能千差萬別。如果學生網路和教師網路的容量相差過多,會導致學生難以學習的情況。Cream這篇文章就是為了解決兩者匹配問題。
普通的SPOS方法如左圖所示,通過采樣單路徑子網路進行訓練。右圖則是結合了知識蒸餾的方法,Cream提出了兩個模塊:
Cream中心思想是,子網路可以在整個訓練過程中協作學習並相互教導,目的是提高單個模型的收斂性。
消融實驗如下:
目標:通過教師引導各個block特徵層的學習,根據loss大小評判各子網的性能。
這是一篇將NAS和KD融合的非常深的一個工作,被CVPR20接收。之前寫過一篇文章進行講解,這里簡單回顧一下。
DNA是兩階段的one-shot NAS方法,因此其引入蒸餾也是為了取代普通的acc指標,提出了使用子網路與教師網路接近程度作為衡量子網性能的指標。
在訓練的過程中,進行了分塊蒸餾,學生網路某一層的輸入來自教師網路上一層的輸出,並強制學生網路這一層的輸出與教師網路輸出一致(使用MSELoss)。在搜索過程結束後,通過計算各子網路與教師網路的接近程度來衡量子網路。
目標:通過改進KL divergence防止學生over estimate或者under estimate教師網路。
上圖展示了OFA,BigNAS等搜索演算法中常用到的蒸餾方法,子網使用的是KL divergence進行衡量,文中分析了KL 散度存在的局限性:即避零性以及零強制性。如下公式所示,p是教師的邏輯層輸出,q是學生邏輯層輸出。
AlphaNet提出了一個新的散度衡量損失函數,防止出現過估計或者低估的問題。如下所示,引入了 。
其中 不為0或者1,這樣如下圖所示:
藍色線對應example 2表示,當 為負值,如果q過估計了p中的不確定性, 的值會變大。
紫色線對應example 1表示,當 為正數,如果q低估了p中的不確定性, 的值會變大
同時考慮兩種情況,取兩者中最大值作為散度:
目標:提出了衡量學生網路和教師網路 內部激活相似度 衡量指標,通過表徵匹配可以用來加速網路結構搜索。
這部分其實是屬於知識蒸餾分類中基於關系的知識,構建的知識由不同樣本之間的互作用構成。
具體的指標構成如上圖所示,是一個bsxbs大小的矩陣,這個在文中被稱為Representational Dissmilarity Matrix,其功能是構建了激活層內部的表徵,可以通過評估RDM的相似度通過計算上三角矩陣的關系系數,比如皮爾遜系數。
該文章實際上也是構建了一個指標P+TG來衡量子網的性能,挑選出最優子網路。
如上圖所示,RDM的計算是通過衡量教師網路的feature以及學生網路的feature的相似度,並選擇選取其中最高的RDM相似度。通過構建了一組指標,隨著epoch的進行,排序一致性很快就可以提高。
目標:固定教師網路,搜索最合適的學生網路。
對於相同的教師網路來說,不同的架構的學生網路,即便具有相同的flops或者參數,其泛化能力也有所區別。在這個工作中選擇固定教師網路,通過網路搜索的方法找到最優的學生網路,使用L1 Norm優化基礎上,選擇出與教師網路KL散度差距最小的學生網路。
目標:在給定教師網路情況下,搜索最合適的學生網路。
神經網路中的知識不僅蘊含於參數,還受到網路結構影響。KD普遍方法是將教師網路知識提煉到學生網路中,本文提出了一種架構感知的知識蒸餾方法Architecture-Aware KD (AKD),能夠找到最合適提煉給特定教師模型的學生網路。
Motivation: 先做了一組實驗,發現不同的教師網路會傾向於不同的學生網路,因此在NAS中,使用不同的教師網路會導致模型傾向於選擇不同的網路結構。
AKD做法是選擇使用強化學習的方法指導搜索過程, 使用的是ENAS那種通過RNN采樣的方法。
目標:從集成的教師網路中學習,並使用NAS調整學生網路模型的容量。NAS+KD+集成。
這篇文章之前也進行了講解,是網路結構搜索,知識蒸餾,模型集成的大雜燴。
詳見: https://blog.csdn.net/DD_PP_JJ/article/details/121268840
這篇文章比較有意思,使用上一步中得到的多個子網路進行集成,可以得到教師網路,然後使用知識蒸餾的方法來引導新的子網路的學習。關注重點在於:
AdaNAS受Born Again Network(BAN)啟發, 提出Adaptive Knowledge Distillation(AKD)的方法以輔助子網路的訓練。
集成模型選擇 :
從左到右代表四次迭代,每個迭代中從搜索空間中選擇三個模型。綠色線框出的模型代表每個迭代中最優的模型,AdaNAS選擇將每個迭代中最優subnet作為集成的對象。
最終集成的時候還添加了額外的weight參數w1-w4:
最終輸出邏輯層如下所示:(這個w權重也會被訓練,此時各個集成網路的權重是固定的,只優化w)
Knowledge Distillation
目標:解決知識蒸餾的效率和有效性,通過使用特徵聚合來引導教師網路與學生網路的學習,網路結構搜索則是體現在特徵聚合的過程,使用了類似darts的方法進行自適應調整放縮系數。ECCV20
文章總結了幾種蒸餾範式:
最後一種是本文提出的方法,普通的特徵蒸餾都是每個block的最後feature map進行互相蒸餾,本文認為可以讓教師網路的整個block都引導學生網路。
具體如何將教師網路整個block中所有feature map進行聚合,本文使用的是darts的方法進行動態聚合信息。(a) 圖展示的是對group i進行的可微分搜索過程。(b)表示從教師到學生的路徑loss構建,使用的是CE loss。(c)表示從學生到教師網路的路徑loss構建,使用的是L2 Loss。其中connector實際上是一個1x1 卷積層。
(ps: connector讓人想到VID這個工作)
3. 名師出高徒:關於知識蒸餾技術的一點思考
在最初聽說知識蒸餾技術的時候,我是持懷疑態度的,甚至覺得不可思議,為什麼通過用簡單模型去學習復雜模型的效果會比直接用訓練標簽來訓練簡單模型要好???
但是,它的存在必有其合理性,更何況是我偶像,深度學習第一人Hinton等人最早開始提出這種思想的.
於是便帶著疑惑,對所謂的模型蒸餾技術做了一番研究,發現這個東西確實有過人之處,能夠用更簡單的模型獲得更優質的推理效果,這在工程上,簡直是妙不可言.下面就讓我們來think think,模型蒸餾為什麼有用,又是怎麼來實現的.
眾所周知,對於各類任務,當有足夠多的數據的情況下,我們的神經網路模型越大越深,往往效果也會越好,正如ResNet50在圖像任務上摧枯拉朽,Large Bert在語言任務上效果拔群,除了優秀的模型結構涉及,可以歸結為是大力出奇跡.
但是,在實際的生產中,部署一個很大的推理模型是十分困難的,因為它的計算量是無數大大小小公司不能承受之痛,並不是每個企業都像Google那樣擁有成千上萬的TPU,當然即使有,在大部分場景下,也顯然是不劃算的.為了解決日益增長的模型預測效果的追求和和工程師想要提高性能老闆想要節省成本之間的矛盾,有人提出了知識蒸餾技術.
即我們先在原始的訓練數據上訓練一個大的復雜的擬合的好泛化能力也很好的巨無霸模型(教師模型),再用這個復雜模型的inference結果取代原有的標簽,用於訓練一個新的更小的效果跟教師模型相差不大的模型(學生模型).然後生產環節只要部署這個性能強勁和推理效果足夠好的學生模型就可以了.
好,這個想法實在是太好了..但是旁觀者大概會有些不明覺厲....直接從原始的訓練數據學不好嗎?幹嘛還多此一舉去學一個更不精確的擬合結果數據?
這樣做自然是有好處滴,且聽我給你慢慢分析...這一切應該從一個軟妹字說起..... [噗..抱歉,多打了一個妹字...
人類能夠非常好的從許許多多的特徵之中找到主要特徵來區分不同的物品,而不會被表面很多相似的特徵所迷惑,比如,人類可以較好的區分一隻像貓的狗或是一隻像狗的貓,而對於深度神經網路來說,卻並沒有那麼容易.正如Hinton等人的一個經典論述: 一輛寶馬被深度網路識別為一台垃圾車的可能性很小,但是被錯誤的識別為一個胡蘿卜的可能性卻要高很多倍.
為了讓網路能夠獲得學習這些東西的能力,我們不得不讓網路變得更深更復雜.知識蒸餾的目的就是希望大模型能夠將學習到的這些區分近似特徵的能力教給小模型,教育這種知識的精髓就恰好在於用softmax的軟特徵來取代原始one-hot標注的硬特徵.
仔細想一下,軟特徵的好處實際上是顯而易見的.
就拿手寫數字識別的例子來說,我們的標注數據的不同分類之間,實際是無法捕捉到它們之間的關系的,因為它們都是只有自己的分類位置是0,其餘位置是1,每個目標向量之間的距離是一樣的,因此這種標注的方式實際上是存在一定缺陷的,它無法包含這樣一種信息:比如數字1,和只帶有一點點彎曲的7實際是極為相似的,但實際的標注數據並不能體現這一點.但是經過一個大模型的學習之後,或許對於一個只有一點點彎曲的7模型的預測結果中,1的score是0.4,7的score是0.5,其餘score都接近0. 當我們看到這樣一組特徵向量的時候,是可以很清晰的發現這個手寫圖片非常相7同時又有點像1而和其他數字不像.
因此,再用這個向量作為target給小模型進行學習的時候,小模型只需要很小的代價就能學習到這一復雜的關系了~
是不是覺得我上面的說法很有道理? 如果你真的就這么認為,那就too naive了! 夢想很豐滿,而現實卻很骨感..真實的情況是,經過softmax函數之後,幾乎不可能出現某個分類0.5,另一個分類0.4的情況,更一般的是某個分類0.99,另一個分類0.01......
當然,別擔心,前面的想法這么好,自然遇到一點困難不該輕易放棄,既然softmax不行,那我們就不如就給它調整一下..
Hinton等大佬的解決方案是:將原始logits傳遞給softmax之前,將教師模型的原始logits按一定的溫度進行縮放.這樣,就會在可用的類標簽上得到更加廣泛的分布.並且這個溫度縮放機制同樣可以用於學生模型.
然後,原始的softmax操作就變成了:
其中, 便是一個縮放因子的超參數,這些得到的結果便是所謂的軟目標...
變大,類別概率就會變軟,也就是說會相互之間更加接近,從而達到了捕捉類別間關系的目的.
除了上述這種方法,還有其他人有一些別的不使用softmax獲得軟特徵的方法,各有優劣...因為想快點寫完這篇,所以別的方法先不介紹了,有興趣可以自己了解,或者改天有時間我回來補充上這個部分....
如果想要更大限度的壓縮模型,可以使用一些十分高效的傳統機器學習方法作為學生去蒸餾
比如決策樹。我覺得這可能是一個很好的方法,盡管它們的表達能力不如神經網路,但它們的預測非常可控和具有解釋性,並有可能實現自動的更新和快速迭代.可以看一下Hinton他們的研究,讀下這篇論文 Distilling a Neural Network Into a Soft Decision Tree
他們的研究表明,盡管更簡單的神經網路的表現比他們的研究要好,但蒸餾確實起到了一點作用。在MNIST數據集上,經過蒸餾的決策樹模型的測試准確率達到96.76%,較基線模型的94.34%有所提高。然而,一個簡單的兩層深卷積網路仍然達到了99.21%的准確率。因此,在任務追求的精度和推理性能及邊界性之間尋求一個權衡即可。
個人認為知識蒸餾是一個極具前途的研究.它讓更好的推理效果以更小更便捷的方式得以部署,這在工業界簡直是無敵的存在.正所謂名師出高徒,和人類的學習一樣,能夠有一個牛逼的老師對你進行深入淺出的指導,能讓你的學習過程事半功倍.而知識蒸餾,正好就是實現了這樣一個深入淺出的功能,這種思想我個人十分推崇.