在最初聽說知識蒸餾技術的時候,我是持懷疑態(tài)度的,甚至覺得不可思議,為什么通過用簡單模型去學習復雜模型的效果會比直接用訓練標簽來訓練簡單模型要好???

但是,它的存在必有其合理性,更何況是我偶像,深度學習第一人Hinton等人最早開始提出這種思想的.
于是便帶著疑惑,對所謂的模型蒸餾技術做了一番研究,發(fā)現(xiàn)這個東西確實有過人之處,能夠用更簡單的模型獲得更優(yōu)質的推理效果,這在工程上,簡直是妙不可言.下面就讓我們來think think,模型蒸餾為什么有用,又是怎么來實現(xiàn)的.
什么是知識蒸餾
眾所周知,對于各類任務,當有足夠多的數(shù)據(jù)的情況下,我們的神經網絡模型越大越深,往往效果也會越好,正如ResNet50在圖像任務上摧枯拉朽,Large Bert在語言任務上效果拔群,除了優(yōu)秀的模型結構涉及,可以歸結為是大力出奇跡.
但是,在實際的生產中,部署一個很大的推理模型是十分困難的,因為它的計算量是無數(shù)大大小小公司不能承受之痛,并不是每個企業(yè)都像Google那樣擁有成千上萬的TPU,當然即使有,在大部分場景下,也顯然是不劃算的.為了解決日益增長的模型預測效果的追求和和工程師想要提高性能老板想要節(jié)省成本之間的矛盾,有人提出了知識蒸餾技術.
即我們先在原始的訓練數(shù)據(jù)上訓練一個大的復雜的擬合的好泛化能力也很好的巨無霸模型(教師模型),再用這個復雜模型的inference結果取代原有的標簽,用于訓練一個新的更小的效果跟教師模型相差不大的模型(學生模型).然后生產環(huán)節(jié)只要部署這個性能強勁和推理效果足夠好的學生模型就可以了.
好,這個想法實在是太好了..但是旁觀者大概會有些不明覺厲....直接從原始的訓練數(shù)據(jù)學不好嗎?干嘛還多此一舉去學一個更不精確的擬合結果數(shù)據(jù)?
這樣做自然是有好處滴,且聽我給你慢慢分析...這一切應該從一個軟妹字說起..... [噗..抱歉,多打了一個妹字...

一切從soft特征開始說起
人類能夠非常好的從許許多多的特征之中找到主要特征來區(qū)分不同的物品,而不會被表面很多相似的特征所迷惑,比如,人類可以較好的區(qū)分一只像貓的狗或是一只像狗的貓,而對于深度神經網絡來說,卻并沒有那么容易.正如Hinton等人的一個經典論述: 一輛寶馬被深度網絡識別為一臺垃圾車的可能性很小,但是被錯誤的識別為一個胡蘿卜的可能性卻要高很多倍.
為了讓網絡能夠獲得學習這些東西的能力,我們不得不讓網絡變得更深更復雜.知識蒸餾的目的就是希望大模型能夠將學習到的這些區(qū)分近似特征的能力教給小模型,教育這種知識的精髓就恰好在于用softmax的軟特征來取代原始one-hot標注的硬特征.
仔細想一下,軟特征的好處實際上是顯而易見的.
就拿手寫數(shù)字識別的例子來說,我們的標注數(shù)據(jù)的不同分類之間,實際是無法捕捉到它們之間的關系的,因為它們都是只有自己的分類位置是0,其余位置是1,每個目標向量之間的距離是一樣的,因此這種標注的方式實際上是存在一定缺陷的,它無法包含這樣一種信息:比如數(shù)字1,和只帶有一點點彎曲的7實際是極為相似的,但實際的標注數(shù)據(jù)并不能體現(xiàn)這一點.但是經過一個大模型的學習之后,或許對于一個只有一點點彎曲的7模型的預測結果中,1的score是0.4,7的score是0.5,其余score都接近0. 當我們看到這樣一組特征向量的時候,是可以很清晰的發(fā)現(xiàn)這個手寫圖片非常相7同時又有點像1而和其他數(shù)字不像.
因此,再用這個向量作為target給小模型進行學習的時候,小模型只需要很小的代價就能學習到這一復雜的關系了~
softmax的擴展
是不是覺得我上面的說法很有道理? 如果你真的就這么認為,那就too naive了! 夢想很豐滿,而現(xiàn)實卻很骨感..真實的情況是,經過softmax函數(shù)之后,幾乎不可能出現(xiàn)某個分類0.5,另一個分類0.4的情況,更一般的是某個分類0.99,另一個分類0.01......
當然,別擔心,前面的想法這么好,自然遇到一點困難不該輕易放棄,既然softmax不行,那我們就不如就給它調整一下..
Hinton等大佬的解決方案是:將原始logits傳遞給softmax之前,將教師模型的原始logits按一定的溫度進行縮放.這樣,就會在可用的類標簽上得到更加廣泛的分布.并且這個溫度縮放機制同樣可以用于學生模型.
然后,原始的softmax操作就變成了:
其中, 便是一個縮放因子的超參數(shù),這些得到的結果便是所謂的軟目標...
變大,類別概率就會變軟,也就是說會相互之間更加接近,從而達到了捕捉類別間關系的目的.
除了上述這種方法,還有其他人有一些別的不使用softmax獲得軟特征的方法,各有優(yōu)劣...因為想快點寫完這篇,所以別的方法先不介紹了,有興趣可以自己了解,或者改天有時間我回來補充上這個部分....
使用傳統(tǒng)機器學習方法
如果想要更大限度的壓縮模型,可以使用一些十分高效的傳統(tǒng)機器學習方法作為學生去蒸餾
比如決策樹。我覺得這可能是一個很好的方法,盡管它們的表達能力不如神經網絡,但它們的預測非??煽睾途哂薪忉屝?并有可能實現(xiàn)自動的更新和快速迭代.可以看一下Hinton他們的研究,讀下這篇論文Distilling a Neural Network Into a Soft Decision Tree
他們的研究表明,盡管更簡單的神經網絡的表現(xiàn)比他們的研究要好,但蒸餾確實起到了一點作用。在MNIST數(shù)據(jù)集上,經過蒸餾的決策樹模型的測試準確率達到96.76%,較基線模型的94.34%有所提高。然而,一個簡單的兩層深卷積網絡仍然達到了99.21%的準確率。因此,在任務追求的精度和推理性能及邊界性之間尋求一個權衡即可。
總結
個人認為知識蒸餾是一個極具前途的研究.它讓更好的推理效果以更小更便捷的方式得以部署,這在工業(yè)界簡直是無敵的存在.正所謂名師出高徒,和人類的學習一樣,能夠有一個牛逼的老師對你進行深入淺出的指導,能讓你的學習過程事半功倍.而知識蒸餾,正好就是實現(xiàn)了這樣一個深入淺出的功能,這種思想我個人十分推崇.