㈠ 什麼是蒸餾,蒸餾操作有什麼作用
把水煮開收集那些水蒸氣就叫蒸餾可以提純,比如說白酒就是用蒸餾技術提取酒精的。
㈡ 名師出高徒:關於知識蒸餾技術的一點思考
在最初聽說知識蒸餾技術的時候,我是持懷疑態度的,甚至覺得不可思議,為什麼通過用簡單模型去學習復雜模型的效果會比直接用訓練標簽來訓練簡單模型要好???
但是,它的存在必有其合理性,更何況是我偶像,深度學習第一人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%的准確率。因此,在任務追求的精度和推理性能及邊界性之間尋求一個權衡即可。
個人認為知識蒸餾是一個極具前途的研究.它讓更好的推理效果以更小更便捷的方式得以部署,這在工業界簡直是無敵的存在.正所謂名師出高徒,和人類的學習一樣,能夠有一個牛逼的老師對你進行深入淺出的指導,能讓你的學習過程事半功倍.而知識蒸餾,正好就是實現了這樣一個深入淺出的功能,這種思想我個人十分推崇.