『壹』 【技術博客】通過量化知識來解釋知識蒸餾
【技術博客】****通過量化知識來解釋知識蒸餾
知識蒸餾介紹
知識蒸餾(Knowledge Distillation)最早是在2006年由 Bulica 提出的,在2014年 Hinton 對知識蒸餾做了歸納和發展。知識蒸餾主要思想是訓練一個小的網路模型來模仿一個預先訓練好的大型網路或者集成的網路。Hinton 在2015年發表的論文中提出了『softmax temperature』的概念,對 softmax 函數做了改進:
當 T 等於1時就是標準的 softmax 參數,前者比後者具有這樣一個優勢:經過訓練後的原模型,其 softmax 分布包含有一定的知識,真實標簽只能告訴我們,某個圖像樣本是一輛寶馬,不是一輛垃圾車,也不是一顆蘿卜;而帶有溫度參數T的softmax函數可能會告訴我們,它最可能是一輛寶馬,不大可能是一輛垃圾車,但不可能是一顆蘿卜。
Hinton 等人做了三組實驗,大體上驗證了知識蒸餾方法的有效性。 Hinton 等人促進了知識蒸餾的發展並從實驗的角度來驗證了知識蒸餾的有效性,而本篇介紹的論文則提出了一些量化知識的概念來解釋知識蒸餾的成功機理。
該論文為了解釋知識蒸餾的成功機理,提出了三個假設,並根據假設基於可視化的量化標准,提出了三種類型的度量標准來驗證了關於知識蒸餾的三個假設,為解釋知識蒸餾提供了依據。
假設提出
假設1:知識蒸餾使 DNN 可以學習更多的視覺概念。我們將與任務相關的視覺概念和其他概念區分開來,如下圖所示,前景上的視覺概念通常被認為是與任務相關的,而背景上的視覺概念則被認為是與任務無關的。
假設2:知識蒸餾確保了 DNN 易於同時學習各種視覺概念。相比之下基礎網路傾向於順序學習視覺概念,即在不同的 epoch 學習不同的概念。
假設3:知識蒸餾的模型優化方向更加穩定。DNN 在對原始數據進行學習時,通常會在早期嘗試對各種視覺概念進行建模,然後在後期拋棄某些視覺概念;而在知識蒸餾的過程中,教師網路直接引導學生網路瞄準特定視覺概念,沒有明顯的迂迴。
在該文章的研究中,視覺概念被定義為一個圖像區域,如物體的一個部分:翅膀、頭、爪子等。基礎網路被定義為從原始數據中學習的網路。
演算法
在該節,我們給定一個提前訓練好的 DNN 網路(教師網路)和一個經蒸餾形成的另一個 DNN 網路(學生網路),為了解釋知識蒸餾,我們將學生網路與從原始數據中學習生成 DNN 網路相比較,另外我們將任務限制為分類任務來簡化下面的理論分析。
為了驗證假設1,這里定義幾個度量的標准:
這里
和[圖片上傳失敗...(image-dffcd3-1601385590605)]
的圖像區域可以視為有效的視覺概念,b為一個正標量。當括弧內條件滿足時,返回1,否則返回0.
(上圖為視覺概念(visual concepts)的可視化表現,第二列表示了不同圖像每個像素的熵值,在第三列中,具有低熵值的區域被視為視覺概念)
參數會更高。
來測量在視覺概念最多時的學習過程。沒有使用 epoch number 而是使用 weight distance 的原因是後者更好的量化了每個epoch後參數更新的總路徑,因此我們使用平均值[圖片上傳失敗...(image-381693-1601385590604)]
和
標准差[圖片上傳失敗...(image-184659-1601385590604)]
來量化一個 DNN 是否同時學習視覺概念:
[圖片上傳失敗...(image-127b3a-1601385590604)]
平均值[圖片上傳失敗...(image-e1aaea-1601385590604)]
和標准差[圖片上傳失敗...(image-171a50-1601385590604)]
的數值越小,代表 DNN 能夠快速同時地學習各種視覺概念。
(DNN 傾向於在前期學習各種視覺概念,之後主要丟棄與任務無關的概念)
結論
該文章從對 DNN 的知識進行量化的角度來解釋了知識蒸餾的成功。提出了三種類型的度量標准來驗證分類場景中的三種假設,也就是相對於從原始數據進行學習,知識蒸餾可以確保 DNN 學習更多與任務相關的概念,學習更少與任務無關的概念,具有更高的學習速度,並以更少的彎路進行優化。
參考文獻
[1]Hinton G, Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv preprint arXiv:1503.02531, 2015.
[2]Cheng X , Rao Z , Chen Y , et al. Explaining Knowledge Distillation by Quantifying the Knowledge[J]. 2020.
『貳』 名師出高徒:關於知識蒸餾技術的一點思考
在最初聽說知識蒸餾技術的時候,我是持懷疑態度的,甚至覺得不可思議,為什麼通過用簡單模型去學習復雜模型的效果會比直接用訓練標簽來訓練簡單模型要好???
但是,它的存在必有其合理性,更何況是我偶像,深度學習第一人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%的准確率。因此,在任務追求的精度和推理性能及邊界性之間尋求一個權衡即可。
個人認為知識蒸餾是一個極具前途的研究.它讓更好的推理效果以更小更便捷的方式得以部署,這在工業界簡直是無敵的存在.正所謂名師出高徒,和人類的學習一樣,能夠有一個牛逼的老師對你進行深入淺出的指導,能讓你的學習過程事半功倍.而知識蒸餾,正好就是實現了這樣一個深入淺出的功能,這種思想我個人十分推崇.
『叄』 知識蒸餾 | 模型壓縮利器_良心總結
最近利用知識蒸餾的方法,對業務中的性能有了可觀的提升,因此在這里總結一波。本文主要從宏觀的角度分析一下各個蒸餾演算法的蒸餾方式,具體細節可以根據興趣閱讀論文~ 知識蒸餾是一種模型壓縮常見方法,用於模型壓縮指的是在teacher-student框架中,將復雜、學習能力強的網路學到的特徵表示「知識蒸餾」出來,傳遞給參數量小、學習能力弱的網路。從而我們會得到一個速度快,能力強的網路,因此這是一個概念上的模型壓縮方案。從另一個角度來說,蒸餾可以使得student學習到teacher中更加軟化的知識,這裡麵包含了類別間的信息,這是傳統one-hot label中所沒有的。由於蒸餾中軟化標簽的本質,因此蒸餾也可以被認為是一種正則化的策略。總結來說,知識蒸餾除了能夠學習到大模型的特徵表徵能力,也能學習到one-hot label中不存在的類別間信息。現有的知識蒸餾方法主要側重於兩點: 從teacher的什麼位置學習 和 用什麼方式學習 。以下的總結圖概述了本文要介紹的蒸餾方法。
目錄結構:
(1)KL:知識蒸餾:蒸餾開山之作
https://arxiv.org/pdf/1503.02531.pdf
如上圖所示,本文中直接利用KL散度來衡量教師模型和學生模型的輸出分布,通過最小化KL散度的方式,使得學生模型的輸出分布能夠盡可能的逼近教師模型,從而實現知識蒸餾的目的。KL散度是一種衡量兩個概率分布之間的差異的數學概念,有不懂的同學請出門左拐網路一下,右拐也行Google一下。
(2)FT:相關性因子加權學習法
https://arxiv.org/pdf/1802.04977.pdf
(3)PKT:概率分布學習法
https://arxiv.org/pdf/1803.10837.pdf
上述兩篇文章的作者認為學生一般都是不聰明的,為了讓學生能夠更好的理解教師模型,FT演算法這篇文章提出了一種新的知識轉移方式,如圖所示,利用卷積運算對教師模型的輸出進行編碼,並解碼(翻譯)給學生。而位於學生模塊部分也添加一個卷積操作,用來學習翻譯後的教師知識。實驗證明這種方式要比直接學習效果好。PKT演算法這篇文章提出了另一種新的知識轉移方式,如圖所示,該文章讓學生模型學習教師模型的概率分布,使得整體的學習更加容易,更魯棒。作者提出了一種通過匹配數據在特徵空間中的概率分布進行知識蒸餾,PKT演算法的另一個優勢是該方法可以直接轉移不同架構和維度層之間的知識。
(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演算法那樣是隨機的。
(1)Fitnet:階段性知識蒸餾
https://arxiv.org/pdf/1412.6550.pdf
FItnet這篇文章首次提出了從教室模型的中間層去進行蒸餾學習,而不僅僅關注教室模型的輸出。因為通過中間層的引導,使得學生模型進行了提前學習,使得最終的蒸餾學習效果變得更好。
(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注意力學習法中,作者認為注意力在人類視覺體驗中起著至關重要的作用。以圖像分類為例,注意力地圖展示了學習完成後的網路模型更關注於圖像的哪個區域,是網路模型學習成果的體現。本文通過迫使學生模型模仿強大的教師模型的注意力特徵圖,來顯著提高學生模型的性能。為此,本文提出了基於激活注意力地圖的蒸餾法。
(5)NST:基於濾波器的知識蒸餾
https://arxiv.org/pdf/1707.01219.pdf
(6)FSP:授之以魚不如授之以漁
http://openaccess.thecvf.com/content_cvpr_2017/papers/Yim_A_Gift_From_CVPR_2017_paper.pdf
和之前對中間層特徵進行直接學習的方式不同,本文提出了一個偏哲學的論點:授之以魚不如授之以漁。具體來說就是,如上圖所示,本文將教師模型網路層與層之間的映射關系作為學生網路學習的目標,而不是像之前提到的直接對教師模型的中間結果進行學習。通過讓學生學習這種獲得特徵的方法,而不是直接學習特徵本身,文章的結果顯示,這種方式確實有助於提高學生模型的魯棒性。
(1)AB:激活邊界學習
https://arxiv.org/abs/1811.03233.pdf
(2)利用對抗樣本進行激活邊界學習
https://arxiv.org/abs/1805.05532.pdf
在分類任務中,小模型真正的缺陷更多的在於對邊界樣本(難例樣本)的分類困難。而這真是我們在分類任務中最關心的問題。而教師模型處理邊界的能力一定是要優於學生模型的。因此嘗試用學生模型學習教師模型的邊界分布,這將是蒸餾學習的新思路。本部分列舉了兩種不同的邊界學習方法。AB激活邊界學習法,通過最大化邊界誤差的方式,來引導學生模型學習更強的邊界約束能力。利用對抗樣本進行邊界激活學習的方法,首先定義一個基類並通過基類找到各個類別中的對抗邊界,最終通過對抗邊界樣本進行蒸餾學習。
(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之後通過卷積層提取全局特徵,並將得到的特徵向量進行對應的切分,在訓練過程中通過最小化切分後特徵向量間的差異,從而增強同一個類內的多樣性提升魯棒性,該過程也可以被認為是自己和自己學習。
(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散度。而知識蒸餾這篇文章更像是一種廣義上的互相學習方法,該文章的主要是思想是並行地訓練多個網路,對所有網路的參數進行重要性排序,並另一個並行網路中的更有效的權重替換到當前網路的不重要權重的位置,在訓練過程中通過這種重要性權重的互相替換實現互相學習。
(1)GAN對抗學習
https://arxiv.org/pdf/1709.00513.pdf
(2)無監督對抗學習
https://arxiv.org/pdf/1904.01186.pdf
本部分主要列舉了兩種利用GAN網路進行蒸餾的文章。GAN對抗學習這篇文章就是典型的利用生成對抗網路的例子,具體來說,學生網路作為生成器,生成對應的輸出結果,而教師網路用來表徵GT信息,而鑒別器主要被用來鑒別學生網路的輸出和教師網路的輸出,最終學習的目的就是是的學生網路能夠欺騙鑒別器,是的鑒別起無法區分出學生網路和教師網路的輸出。最終實現學生網路學習到了教師網路的輸出特徵和分布。而無監督對抗學習這篇文章的出發點有點不一樣,由於一些實踐問題(如隱私、法律等問題),給定深度網路的訓練數據往往不可用,除了一些介面之外,給定網路的架構也是未知的。基於此,本文提出了一種利用生成對抗網路訓練高效深度神經網路的新框架。講預先訓練好的教師網路看作一個固定的鑒別器,利用該鑒別器產生的訓練樣本可以得到最大的鑒別結果。然後,利用生成的數據和教師網路,同時訓練出模型尺寸較小、計算復雜度較低的高效網路。
『肆』 知識蒸餾-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
『伍』 剪枝論文統計
先確定哪些連接是重要的,然後prune,在fine tune
L1正則pruning和L2正則 retrain和iterative prune效果好
prune/fine tune, quantize weights, Huffman coding
3-4x speep
動態的修剪,並且加入splicing,避免不正確的prune
prune filter,也就是prune cout
(1)每次prune最不重要的參數,迭代
(2)taylor展開判斷哪個該減
(3)每層都要normalization
irregularize prune,先跳過
retrain少 設定一個laye-wise 的error,計算它的二階導,這和paper#5的區別?
根據輸入,動態的自適應的prune cin
自上而下,逐層剪枝
基於能耗 channel prune
每層剪枝後,進行最小二乘微調,快速回復精度。全部剪枝完後,再全局反向傳播微調
filter prune,根據下一層的統計信息來prune當前層 和paper#5區別?
這個和paper#12有啥區別??待細看
修剪input channel,也就是cin,使用BN的scaling來做判斷卷積channel的重要性
訓練時對channel的scale參數進行L1正則化,抑制為0
以前假設較小的權重或feature map是不重要的,該文不基於這個假設
訓練模型使某個通道輸出恆定,然後把這個通道剪掉?
大的稀疏網路效果優於小的密集網路
漸進式prune,sparsity逐漸增加 訓練時不斷稀疏
待細看
量化輸出對參數的敏感性(相關性),引入一個正則項,降低敏感性參數的絕對值,直接將低於閾值的設為0
感覺之後可以用於層間只適應,待細看next to read
使用了AutoMl 有必要之後細看
使用一個參數比例因子來縮放某個結構(group block neuron)的輸出,正則化稀疏該因子,使用Accelerated Proximal Gradient優化問題,然後刪除(感覺和paper#17有點像)
不需要retrain, 有量化和Huffman編碼。不知道啥玩意
跳過
prune參數,剩餘參數用來訓練新任務
以前只考慮單層或者兩層的誤差,沒有考慮對整個網路的影響,本文基於一個統一的目標,即最小化分類前倒數第二層的「最終響應層」(FRL)中重要響應的重構誤差,提出了神經元重要性評分傳播(NISP)演算法,將最終響應的重要性得分傳播到網路中的每個神經元。
同時減枝和量化 跳過
自動學習每層prune多少
(1)不是將刪除濾波器固定為0
(2)能從頭訓練,邊訓邊減
有必要細看
全局的動態剪枝,還可以將誤刪的恢復
既NAS又蒸餾
給channel設置因子gate,gate為0,則刪除,用taylor展開判斷gate為0時對損失函數的影響 全局的剪枝 tick-tock框架
先跳過
先跳過
全局的,找到每層稀疏比;端到端訓練;不需要retrain;效果比lottery ticket好
一般修剪權重會降低魯棒性,或者需要先驗的知識確定超參數,本文用一個autoprune的方法,輔助新的更新規則,緩解了前面的兩個問題。還是pre-train prune fine-tune三步走
不損害魯棒性的壓縮
逐層剪枝,之後有必要細看
魯棒性的,先跳過
前面的工作認為值小的不重要,這需要兩個前提條件:(1)fliter偏差大(2)最小的norm應該更小 本文提出了一種基於幾何中值的filter prune
用GAN 跳過
跳過
跳過
可以控制prune的大小和速度,還用了蒸餾,跳過
估計神經元對最終loss的影響,迭代的刪去最小的那個。用了一階和二階的泰勒展開,而不是每層的敏感度分析。
感覺很重要,之後細看
之前的工作只考慮層內的關系,沒有考慮層間的關系,這篇文章考慮了連續層之間的關系,當前層的out和下一層的in
速度和精度上取折衷 跳過
變分貝葉斯 不需要retrain
先跳過
自動確定每層稀疏率
剪枝再fine-tune的會比從頭訓練的網路要差。剪枝後的網路結構不應該復用之前的訓練好的模型中的權重。所以應該從頭訓練。
並不是像單純的剪枝一樣刪除結構,而是通過FBS動態的放大重要的通道,跳過不重要的通道。
不是先訓練再減枝,而是先減枝,再從頭開始訓練。還是先做一個鏈接的敏感度分析,但是仍然是一個使用一階泰勒展開,然後做softmax,一次性減k個值
可以用來訓練,有空再看。
剪channel,分析通道對loss的影響,用ccp逼近Hessian矩陣
oracle減枝評估filter的重要性,但是時間復雜度高,且需要給定結果寬度,本文通過近似oracle法來優化
基於Kronecker因子特徵基(KFE)的網路重參數化方法,並在此基礎上應用了基於Hessian的結構化剪枝方法。
filter減枝,先跳過
可以讓每層稀疏率可微,採用梯度的方式搜索稀疏率,而且可以train from scratch
automl跳過
把剪枝用於元學習,跳過
反向傳播中的激活梯度大部分很小,使用一種隨機剪枝的方式對激活梯度進行剪枝,剪枝閾值通過分布確定,理論分析。
之後細看
NAS跳過
聯合量化剪枝,跳過
跳過
跳過
加強的彩票假設
自動調節稀疏的閾值
不是刪除網路中的神經元,而是貪婪的從空網路中添加網路中的神經元
跳過
每次刪去訓練樣本平均後激活值最低的那個點
學習跨不同層的濾波器的全局排名,通過修剪排名靠後的濾波器來獲得一組具有不同精度/延遲權衡的結構
跳過
跳過
跳過
跳過
低秩分解和剪枝一起用,全局壓縮
蒸餾,跳過
跳過
對非結構化稀疏的權重進行加密,推理的時候用異或門解碼
每一層自適應的選擇不同的剪枝
聯合NAS,prune,quantization
rewind 和 fine-tune兩種方法的對比
解釋了為什麼修剪只初始化,還沒開始訓練的網路,這種方法是有效的。
跳過
RNN的一次性剪枝
基於基於幅值的剪枝確實能使單層線性運算元的Frobenius失真最小化,我們將單層優化擴展為多層優化,提出了一種簡單的剪枝方法,即超前剪枝
通過反饋重新激活早期刪除的權重
跳過
跳過
跳過
用所獲得的信息作為指導,我們首先提出了一種新的塊最大加權掩蔽(BMWM)方法,它可以有效地保留顯著的權重,同時對權重矩陣施加高度的正則性。作為進一步的優化,我們提出了一種密度自適應規則塊(DARB)剪枝方法
『陸』 AI常見面試35題
交叉熵做損失函數,訓練時傳播的梯度和訓練誤差是成正比的(單調),而當採用均方誤差做損失函數時,訓練時傳播的梯度和訓練誤差不是成正比的(非單調),具體表現是,訓練誤差從0開始增大,梯度增大(這點與我們預期相符),但訓練誤差繼續增大,梯度開始下降(這點就與我們的預期不符了),這樣就顯得,模型在訓練誤差大的時候,根本不願意繼續學習,模型顯得「自暴自棄」不肯學習。
決在低維空間 線性 不可分的問題,通過核函數把低維映射到高維,實現線性可分。
常見 核函數 有線性核函數,多項式核函數,高斯核函數,sigmoid 核函數
Adaboost用錯分數據點來識別問題,通過調整錯分數據點的權重來改進模型。GBDT通過負梯度來識別問題,通過計算負梯度來改進模型。
1.樣本選擇:bagging訓練集是在原始集有放回的選取,每次選取訓練集都是獨立的.boosting:每一輪的訓練集的數量不變,但是訓練集里的樣例比重根據上一輪的分類結果進行調整
2.樣本權重:bagging:均勻取樣,每個樣例的權重都相等。boosting:根據您錯誤率不斷調整樣例的權值,錯誤率越大的則權重越大
3.預測函數:bagging每個基分類器投票,權重比例都是一樣的,boosting每個分類器的權重是不一樣的
4.運行規律:bagging:各個預測函數可以並行生成 boosting:每個基分類器都都是根據前一個分類器的結果調整過來的
之所以被稱為「樸素」, 是因為它假定所有的特徵在數據集中的作用是同樣重要和獨立的,正如我們所知,這個假設在現實世界中是很不真實的,因此,說是很「樸素的」。
1.線性回歸
2.邏輯回歸
3.嶺回歸
4.多項式回歸
順序關系,先求出特徵值再來求SVD
PCA: 無監督學習,找到最優重構子空間,使主成分能刻畫樣本絕大部分的方差。
應用:數據降維、Eigenfaces、PCA-SIFT
CCA(Canonical Correlation Analysis): 無監督學習,對兩組變數降維,找到一個最優相關子空間進行相關性分析。
應用:問卷調查中變數的相關性分析、跨模態學習。
LDA: 有監督學習,學習一個可分性最好的投影方向。相當於是白化(whitening) + PCA,得到的是假設條件下的最優分類子空間(假設每個類都是單模態高斯分布、每個類協方差矩陣相同)。
應用:數據降維、模式分類
ICA: 無監督學習,各個分量之間相互獨立,利用數據的高階統計信息而不是二階信息得到用於信號分離的獨立子空間。
應用:語音信號分離
隨機森林中樹的選擇是隨機選擇的,生成每棵樹的樣本也是隨機采樣有放回產生的
預訓練初始化:一般是在大規模數據上已經訓練過的模型可以提供一個較好的參數初始值,並能提升模型的泛化能力(一種解釋是預訓練任務起到一定的正則化作用)。
隨機初始化:如果全部初始化為0,在神經網路第一遍前向傳播所有隱層神經網路激活值相同,反向傳播權重更新也相同,導致隱層神經元沒有區分性,稱為「對稱權重」現象。為打破這個平衡,比較好的方式是對每個參數進行隨機初始化。
固定值初始化:比如對於偏置(bias)通常用0初始化,LSTM遺忘門偏置通常為1或2,使時序上的梯度變大,對於ReLU神經元,偏置設為0.01,使得訓練初期更容易激活。
1.dropout
L2正則化方法就是通過使參數變小,進而使模型變得簡單的方法。dropout方法原理類似,只不過它不是減少權值,而是隨機的刪除某些節點,使得模型的網路結構變得簡單,起到正則化的效果。
直接限制模型參數的方法:
從數據集入手的方法:
集成化方法(通過訓練多個不同的模型,並讓所有模型一起表決測試集的輸出):
baggingdropout
其他:
early stop交叉驗證(bagging為又放回採樣,而交叉驗證可以理解為無放回模型平均)
self-attention:attention(q,t,v) = softmax(qk.T/根號DK)*v
多頭的本質是多個獨立的attention計算,作為一個集成的作用,不同的權重矩陣映射到不同的空間
RNN:輸入與輸出長度相等,很多時候機器翻譯的輸入跟輸出是不等的
seq2seq:encoder+decoder 所有輸入的信息都保存在隱藏層的最後一個印象里,作為解碼器的初始隱向量,銀項鏈稱之為上下文向量,長度固定,當輸入句子很長的時候,上下文向量會丟失相關信息,效果很差
seq2seq+attention:seq2seq忽略了輸入跟輸出之間的對應關系,利用attention來尋求輸入跟輸出之間的對應關系
tranfarmer:解決了翻譯中網路訓練時間過長,難以並行計算的問題,利用self-attention代替RNN實現並行計算,用postion embedding記錄位置信息
類似cnn的多個卷積核,不同卷積核提取不同方面的特徵,不同head關注不同的表示子控制項,總和利用各方面的信息,獲得更豐富的特徵
由兩個線性層組成,兩個線性層直接具有relu激活函數
點乘注意力可以用高度優化的矩陣乘法來實現
速度更快,空間效率更高
概率密度函數:由已知計算未知
似然函數:對於不同的模型參數,出現已知的概率是多少
將各個特徵分布調整到標准正態分布,若某些特徵方差很大,會主導目標函數從而使得模型無法正確學習其他特徵
將數據劃分成K份,留作一份作為測試集,其他作為訓練集
重復K次得到K個測試結果,取平均
進程是火車,線程是車廂
復雜的模型佔用大量內存,且具有龐大的計算開銷,導致模型難以被部署在手機等計算能力較差的設備上,抑或是時延要求較高的應用中。
模型壓縮的主要方法可以分為:
1.系統級優化,包括單設備優化和多設備優化。比如ZeRO-Offload,就設計了精細的策略來安排CPU內存和GPU內存之間的交換,以便內存交換和設備計算能夠盡可能多地重疊。
2.探索更高效的預訓練方法和模型架構,以降低方案的成本。
3.模型壓縮策略,包括參數共享、模型剪枝、知識蒸餾和模型量化。
深度學習時代,為了充分訓練深層模型參數並防止過擬合,通常需要更多標注數據喂養。在NLP領域,標注數據更是一個昂貴資源。PTMs從大量無標注數據中進行預訓練使許多NLP任務獲得顯著的性能提升。總的來看,預訓練模型PTMs的優勢包括:
詞嵌入是自然語言處理(NLP)中語言模型與表徵學習技術的統稱。概念上而言,它是指把一個維數為所有詞的數量的高維空間嵌入到一個維數低得多的連續向量空間中,每個單詞或片語被映射為實數域上的向量,這也是分布式表示:向量的每一維度都沒有實際意義,而整體代表一個具體概念。
分布式表示相較於傳統的獨熱編碼(one-hot)表示具備更強的表示能力,而獨熱編碼存在維度災難和語義鴻溝(不能進行相似度計算)等問題。傳統的分布式表示方法,如矩陣分解(SVD/LSA)、LDA等均是根據全局語料進行訓練,是機器學習時代的產物。
PTMs的發展經歷從淺層的詞嵌入到深層編碼兩個階段,按照這兩個主要的發展階段,我們歸納出PTMs兩大範式:「淺層詞嵌入」和「預訓練編碼器」。
淺層詞嵌入的主要缺陷為:
PTMs範式為預訓練編碼器,主要目的是通過一個預訓練的編碼器能夠輸出上下文相關的詞向量,解決一詞多義的問題。這一類預訓練編碼器輸出的向量稱之為「上下文相關的詞嵌入」
隨著網路層數的增加,從前面的層傳遞到後面的層的梯度會越來越小,進而就梯度消失了
梯度消失和梯度爆炸,簡單來說,就是因為激活函數sigmoid導致的,輸入值過大或過小導致sigmoid函數趨於0和1,對應的求導趨近於0,而且sigmoid的導數在(0,1/4)之間,這就導致如果初始化W為0-1之間的比較小的值,通過過多的層數之後,梯度下降的時候,慢慢就會出現梯度消失。如果W初始化為較大的值,通過多層之後,梯度下降會導致梯度越來越大,產生爆炸。
當w越大,其wx+b很可能變的很大,而根據上面 sigmoid 函數導數的圖像可以看到,wx+b越大,導數的值也會變的很小。因此,若要出現梯度爆炸,其w既要大還要保證激活函數的導數不要太小。
下面說下解決辦法:
在數學上是一個函數,,意思就從高緯抽象空間映射到低緯具象空間
抽象-具象
詞-語義
為什麼要做embedding?
1.抽象的事物都應該有一個低緯的表示
2.計算機善於處理低緯度信息
3.解決one-hot編碼帶來的緯度爆炸問題
嵌入的好處?
1.計算詞向量的相似度,擴充標簽
2.累加得到一個文本向量
3.用於聚類會比詞聚類有更好的聚類效果
1.輸入層:前者用N-GRAM模型,後者是CBOW
2.輸入到投影層的操作:前者是拼接,後者是累加求和
3.隱藏層:前者有,後者無
4.輸出層:前者線性結構,後者是樹形結構
1.導致全連接層爆炸
2.樣本數量少於特徵數會造成模型過擬合
飽和:sigmoid,tanh
缺點:出現梯度消失問題
非飽和:relu及其變體
優點:解決梯度消失問題
加快收斂速度
計算速度快
NLP網路第一層參數使用其他任務訓練的word embedding ,高層參數仍然隨機初始化
為什麼可行?
因為網路底層提取出的特徵是基礎特徵,跟具體任務相關性不大,具備任務的通用性,而網路高層提取出的特徵跟具體任務密切相關
設有一個多層感知機模型,假設輸出層只保留一個輸出單元 ,且隱藏層使用相同的激活函數。如果將每個隱藏單元的參數都初始化為相等的值,那麼在正向傳播時每個隱藏單元將根據相同的輸入計算出相同的值,並傳遞至輸出層。
在反向傳播中,每個隱藏單元的參數梯度值相等。因此,這些參數在使用基於梯度的優化演算法迭代後值依然相等。之後的迭代也是如此。在這種情況下,無論隱藏單元有多少,隱藏層本質上只有一個隱藏單元在發揮作用。
因此,通常對神經網路的模型參數,特別是權重參數進行隨機初始化。隨機初始化模型參數的方法有很多,可以使用正態分布的隨機初始化方式。
1.賽題理解
2.數據探索跟預處理
3.特徵工程
4.演算法嘗試
5 演算法選擇
1.隨機欠采樣:
優點:平衡數據的同事減小了數據量
缺點:數據減少會影響模型的特徵學習能力跟泛化能力
2.隨機過采樣:
優點:沒有導致數據信息的丟失
缺點:增加了過擬合的可能性
類別特徵常用的處理方法:
1.序號編碼:成績的高中低,轉成3,2,1
2.獨熱編碼:比如血性中的a=[1,0,0,0],b = [0,1,0,0]
3.二進制編碼:跟獨熱類似
把一階離散特徵兩兩組合,就構成高階組合特徵
中文 - 電影 = 中文電影,中文電視劇
英文-電視劇 = 英文電影,英文電視劇,
一般當引入id類型的特徵,通常需要降維
組合特徵
利用決策樹方法來組合特徵
樸素貝葉斯,邏輯回歸,sVM,感知機,最大熵模型,em演算法,決策樹,主成分分析
感知機:是二類分類的線性分類模型,輸入為實例的特徵向量,輸出是正負1
K近鄰演算法:是一種基本分類跟回歸演算法,演算法步驟是,計算當前數據跟其他數據距離最近的K個數據點,然後查看他們的類,類最多的就是數據的分類類別
樸素貝葉斯:是一種基於貝葉斯定力跟條件獨立假設的分類演算法
決策樹:是一種基本的分類跟回歸方法,呈現樹形結構,基於樹的特徵依次對實例進行分類
邏輯回歸:對數線性模型分類回歸方法
主要是為了加速,因為反向傳播求導一次就可以求出所有的偏導數,反之前向傳播因為數據的輸入入口會變慢很多倍
pytorch是一個動態的框架,而TensorFlow是一個靜態的框架。何為靜態的框架呢?我們知道,TensorFlow的尿性是,我們需要先構建一個TensorFlow的計算圖,構建好了之後,這樣一個計算圖是不能夠變的了,然後我們再傳入不同的數據進去,進行計算。這就帶來一個問題,就是固定了計算的流程,勢必帶來了不靈活性,如果我們要改變計算的邏輯,或者隨著時間變化的計算邏輯,這樣的動態計算TensorFlow是實現不了的,或者是很麻煩
K折交叉法,留一法,留P法
網格搜索,也就是一種窮舉的方法,劃定一個范圍,不斷的嘗試,所有的可能性,選出表現最好的參數
1.直接刪除2.平均值填充,中值填充,眾數填充3.預測模型填充
isnull:返回是否空值
notnull:isnull的否定
統計量填充:連續值
特殊值填充:比如0
不處理:xgb跟LGB會自動處理
主要是特徵降維
1.過濾法:按照發散性跟相關性對各個特徵進行評分,通過設定閾值或者帶選擇閾值的個數來選擇特徵
(代表:相關系數,互信息,卡方檢驗,信息增益)
2.包裝法:根據預測效果得分,每次選擇若干特徵,或者排除若干特徵
(代表:遺傳演算法,模擬退火演算法)
3.嵌入發:使用機器學習演算法進行訓練,得到每個特徵的權值系數,並根據系數從大到小選擇特徵
(代表:決策樹-熵,信息增益,正則化)
1.第一,根據電化學模型進行溫度修正,兼顧不同場景
2.電化學模型的RUL結果會作為LSTM的一個新特徵輸入
1.bagging,boosting
2.投票法,平均法,權重法,
1.網格搜索
2.隨機森林
1.查看訓練集特徵變數信息
2.查看數據統計信息
3.查看數據欄位信息
4.畫箱線圖探索數據
5.查看數據分布圖
6.可視化線性回歸關系
7.查看特徵變數的相關性(畫出相關性熱力圖,找出特徵變數和target變數相關系數大於0.5的特徵變數)
8.查看特徵變數跟target變數的
1.刪除異常值
2.最大最小值歸一化
3.查看訓練集數據和測試集數據分布情況
4.特徵降維
5相關性初篩
6.多重共線性篩選降維
7.pca主成分降維
8.決策樹構建新特徵
1.平均絕對值誤差:MAE是預測值跟真實值的絕對值
2.均方誤差:mse指參數估計值跟參數真實值之差的平方
3.均方根誤差:均方誤差的平方根
4.R2:反映了回歸模型在多大程度上解釋了因變數的變化,換句話就是模型對觀測值的擬合程度如何
個體學習模型的准確性越高,多樣性越大,模型融合的提升效果越好
如果需要稀疏性就⽤l1,因為l1的梯度是1或-1,所以每次更新都穩步向0趨近。
⼀般多⽤l2因為計算⽅便「求導置零解⽅程」,l2隻有最好的⼀條預測線⽽l1可能有多個最優解。
l1魯棒性更強對異常值不敏感
歸⼀化:對不同特徵維度的伸縮變換的⽬的是使各個特徵維度對⽬標函數的影響權᯿是⼀致的,即使得那些扁平分
布的數據伸縮變換成類圓形。這也就改變了原始數據的⼀個分布。
好處:
1 提⾼迭代求解的收斂速度,不歸⼀化梯度可能會震盪
2 提⾼迭代求解的精度
標准化:對不同特徵維度的伸縮變換的⽬的是使得不同度ᰁ之間的特徵具有可⽐性。同時不改變原始數據的分布。
好處
1 使得不同度ᰁ之間的特徵具有可⽐性,對⽬標函數的影響體現在⼏何分布上,⽽不是數值上
2 不改變原始數據的分布
『柒』 模型壓縮:剪枝演算法
過參數化主要是指在訓練階段,在數學上需要進行大量的微分求解,去捕抓數據中的微小變化信息,一旦完成迭代式的訓練之後,網路模型推理的時候就不需要這么多參數。而剪枝演算法正是基於過參數化的理論基礎而提出的。
剪枝演算法核心思想就是減少網路模型中參數量和計算量,同時盡量保證模型的性能不受影響。
那在AI框架中,實際上剪枝主要作用在右下角的端側模型推理應用場景中,為的就是讓端側模型更小,無論是平板、手機、手錶、耳機等小型IOT設備都可以輕松使用AI模型。而實際在訓練過程更多體現在剪枝演算法和框架提供的剪枝API上面。
實際上大部分剛接觸剪枝演算法的時候,都會從從宏觀層面去劃分剪枝技術,主要是分為Drop Out和Drop Connect兩種經典的剪枝演算法,如下圖所示。
1)Drop Out:隨機的將一些神經元的輸出置零,稱之為神經元剪枝。
2)Drop Connect:隨機將部分神經元間的連接Connect置零,使得權重連接矩陣變得稀疏。
下面會把剪枝的更多種方式呈現出來,可能會稍微復雜哈。從剪枝的粒度來劃分,可以分為結構化剪枝和非結構化剪枝,2個剪枝結構方法。下面來看看具體的剪枝方法有4種:
細粒度剪枝、向量剪枝、核剪枝在參數量與模型性能之間取得了一定的平衡,但是網路模型單層的神經元之間的組合結構發生了變化,需要專門的演算法或者硬體結構來支持稀疏的運算,這種叫做 結構化剪枝(Unstructured Pruning) 。
其中,非結構化剪枝能夠實現更高的壓縮率,同時保持較高的模型性能,然而會帶來網路模型稀疏化,其稀疏結構對於硬體加速計算並不友好,除非底層硬體和計算加速庫對稀疏計算有比較好的支持,否則剪枝後很難獲得實質的性能提升。
濾波器剪枝(Filter-level)主要改變網路中的濾波器組和特徵通道數目,所獲得的模型不需要專門的演算法和硬體就能夠運行,被稱為 結構化剪枝(Structured Pruning) 。結構化剪枝又可進一步細分:可以是channel-wise,也可以是filter-wise,還可以是在shape-wise。
結構化剪枝與非結構化剪枝恰恰相反,可以方便改變網路模型的結構特徵,從而達到壓縮模型的效果,例如知識蒸餾中的student網路模型、NAS搜索或者如VGG19和VGG16這種裁剪模型,也可以看做變相的結構化剪枝行為。
雖然剪枝演算法的分類看上去很多,但是核心思想還是對神經網路模型進行剪枝,目前剪枝演算法的總體流程大同小異,可以歸結為三種:標准剪枝、基於子模型采樣的剪枝、以及基於搜索的剪枝,如下圖所示。
標准剪枝是目前最流行的剪枝流程,在Tensorflow、Pytroch都有標準的介面。主要包含三個部分:訓練、剪枝、以及微調。
1) 訓練 :首先是對網路模型進行訓練。在剪枝流程中,訓練部分主要指預訓練,訓練的目的是為剪枝演算法獲得在特定基礎SOTA任務上訓練好的原始模型。
3) 微調 :微調是恢復被剪枝操作影響的模型表達能力的必要步驟。結構化模型剪枝會對原始模型結構進行調整,因此剪枝後的模型參數雖然保留了原始的模型參數,但是由於模型結構的改變,剪枝後模型的表達能力會受到一定程度的影響。實現上,微調網路模型,參數在計算的時候先乘以該Mask,Mask為1的參數值將繼續訓練通過BP調整梯度,而Mask為0的部分因為輸出始終為0則不對後續部分產生影響。
4) 再剪枝 :再剪枝過程將微調之後的網路模型再送到剪枝模塊中,再次進行模型結構評估和執行剪枝演算法。目的是使得每次剪枝都在性能更優的模型上面進行,不斷迭代式地進行優化剪枝模型,直到模型能夠滿足剪枝目標需求。
最後輸出模型參數儲存的時候,因為有大量的稀疏,所以可以重新定義儲存的數據結構, 僅儲存非零值以及其矩陣位置。重新讀取模型參數的時候,就可以還原矩陣。
除標准剪枝之外,基於子模型采樣的剪枝《EagleEye: Fast sub-net evaluation for efficient neural network pruning》最近也表現出比較好的剪枝效果。得到訓練好的模型之後,進行子模型采樣過程。一次子模型采樣過程為:
1)對訓練好的原模型中可修剪的網路結構,按照剪枝目標進行采樣,采樣過程可以是隨機的,也可以按照網路結構的重要性或者通過KL散度計算進行概率采樣。
2)對采樣後的網路結構進行剪枝,得到采樣子模型。子模型采樣過程通常進行 次,得到 個子模型( ≥1), 之後對每一個子模型進行性能評估。子模型評估結束之後,選取最優的子模型進行微調以得倒最後的剪枝模型。
基於搜索的剪枝主要依靠強化學習等一系列無監督學習或者半監督學習演算法,也可以是神經網路結構搜索相關理論。
給定剪枝目標之後,基於搜索的剪枝在網路結構中搜索較優的子結構,這個搜索過程往往伴隨著網路參數的學習過程,因此一些基於搜索的剪枝演算法在剪枝結束後不需要再進行微調。
這幾年神經網路剪枝pruning作為模型壓縮技術的四小龍之一,正在受到越來越多的關注。當然,各種更好的pruning參數選取方法一定還會層出不窮。另外,從趨勢來看,以下幾個方向值得關註:
打破固定假設 :挑戰已有的固有的假設,例如ICLR2019會議的best paper彩票假說《The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks 》的出現。還有一開始提到的對於over-parameterization,與重用已有參數是否有有益的反思非常有意思。這樣的工作會給剪枝演算法非常大的啟發,從而根本改變解決問題的思路。
自動化剪枝 :隨著AutoML的大潮,越來越多的演算法開始走向自動化。模型壓縮能拉下嗎?當然不能。經過前面的介紹我們知道,像ADC,RNP,N2N Learning這些工作都是試圖將剪枝中部分工作自動化。如量化中的《HAQ: Hardware-Aware Automated Quantization》考慮網路中不同層信息的冗餘程度不一樣,所以自動化使用混合量化比特進行壓縮。
與NAS融合 :如前面模型剪枝流程中提到,剪枝演算法與神經網路搜索NAS的界限已經模糊了。NAS有針對結構化剪枝進行搜索方法,如One-Shot Architecture Search是先有一個大網路,然後做減法。NAS與模型壓縮兩個一開始看似關系不是那麼大的分支,在近幾年的發展過程中因為下游任務和部署場景的需求,最後似乎會走到一塊去。這兩個分支今天有了更多的交集,也必將擦出更多的火花。
與GAN融合 :這幾年機器學習最火熱的分支之一GAN,正在不斷滲透到已有領域,在pruning中也開始有它的身影。如2019年《Towards Optimal Structured CNN Pruning via Generative Adversarial Learning》讓generator生成裁剪後網路,discrimintor來判別是否屬於原網路還是裁剪後網路,從而進行更有效的網路結構化裁剪。
硬體稀疏性支持 :剪枝會給神經網路模型帶來稀疏性特徵,參數稀疏性在計算中會有大量的索引,所以並不能加速。現在雖然有像cuSPARSE這樣的計算庫,但底層硬體AI晶元本身設計並不是專門為稀疏數據處理打造的。如果能將稀疏計算和處理能力做進晶元那必將極大提高計算效率。僅2021年中國就推出了10+款基於ASIC的AI加速晶元,相信針對稀疏性場景的支持在未來會有所突破。
模型壓縮演算法中針對已有的模型,有:張量分解,模型剪枝,模型量化。針對新構建的網路,有:知識蒸餾,緊湊網路設計等方法。
剪枝只是模型壓縮方法中的一種,它與其它模型壓縮方法並不沖突,因此會與量化、蒸餾、NAS、強化學習等方法慢慢融合,這些都是很值得研究的方向。另外在上面的發展來看,打破固有的假設定義,與NAS、GAN、AutoML、RL等技術進行相互的融合,可能到最後會模糊purning方式,出現新的範式或者壓縮模式也是很吸引的。
『捌』 知識蒸餾綜述:網路結構搜索應用
【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這個工作)
『玖』 模型壓縮簡述
如今學術界新提出的神經網路模型越來越大,而在實際應用中很多模型都要被部屬在移動端。移動端的存儲空間以及算力都有限,無法運行太大的模型,所以模型壓縮這個概念就應運而生。本文簡單介紹一下在演算法(軟體)層面的模型壓縮方法和paper,不涉及硬體上的技巧。內容大多來自2020年李宏毅老師的課程。
目前在演算法層面模型壓縮主要有四個流派,簡介如下:
剪枝思想加入神經網路中。將網路中不重要的weight和neuron(網路中每層的層數)刪除。
傳說中的知識蒸餾。利用已經訓練好的大模型來指導小模型。主要用在分類任務上。
從數據存儲角度節省空間,將存儲參數的浮點數壓縮為更小的單位,用更少的位來表示值。
調整結構/使用特殊的結構來節省參數,後面再詳細介紹。
前面提到了刪除不重要的weight和neuron。對於權重來說,他的范數(比如L1或L2)大小可以看出重要程度:范數太小,不重要。對於神經元,不同輸入下的輸出是0的頻率可以看出重要程度:經常輸出0,不重要。刪完之後,對新的模型進行fine-tune。這是剪枝最基礎的思路,具體每層剪幾個,低於多少要剪掉不同paper有提出不同演算法。注意可以迭代多次刪除,不要一次刪除太多。在實踐中,刪除神經元的方式更容易被執行計算。
下面兩張圖是對於剪枝降低了參數的示意圖:
至於為什麼不直接訓練小的模型,因為大的網路容易訓練,小的網路容易陷入局部最優,所以就把大網路裁剪成小網路而不是直接訓練小網路。
當然可以剪枝的部分不限於weight和neuron,對於剪枝完之後模型的處理方法也有新的發現。下面給出相關的paper list:
Pruning Filters for Efficient ConvNets(ICLR 2017)
Learning Efficient Convolutional Networks Through Network Slimming(ICCV2017)
Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration(CVPR2019)
The Lottery Ticket Hypothesis:Finding Sparse,Trainable Neural Networks(ICLR2019)
Rethinking the value of network pruning(ICLR2019)
Deconstructing Lottery Tickets:Zeros,Signs,and the Supermask(ICML2019)
通過已訓練好的teacher模型訓練student模型,指導/學習的過程在這里被抽象為蒸餾(distillation)。可以蒸餾模型的輸出,直接匹配logits,或者蒸餾模型中間輸出的特徵feature,直接匹配feature或者學習feature如何轉換 。
先說最經典的,對logits的蒸餾。結構如下圖:
至於為什麼要在softmax前除T,paper給的解釋是讓softmax的輸出更平滑(意為輸入更加類似soft target,而不是one-hot那樣的hard target)。知識蒸餾還有一個有趣的點就是讓小的模型還學會了不同輸出label間的關系,比如在mnist模型可以學會label1和7很相似。
對於logits distillation的研究還有Deep Mutual Learning,Born Again Neural Networks,Improved Knowledge Distiilation via Teacher Assistant等研究,在下面的paperlist也有列出。
接下來簡單介紹feature distillation。
類似的研究還有Similarity-Preserving Knowledge Distiilation,下面是paper list:
Distilling the knowledge in a Neural Network(NIPS2014)
Deep Mutual Learning(CVPR2018)
Born Again Neural Networks(ICML2018)
Improved Knowledge Distiilation via Teacher Assistant(AAAI2020)
Paying More Attention to Attention:Improving the Performance of Convolutional Neural Networks via Attention Transfer(ICLR2017)
Relational Knowledge Distiilation(CVPR2019)
Similarity-Preserving Knowledge Distiilation(ICCV2019)
可以用的方法有權重聚類,如下圖:
也可以用一些經典的方法比如哈夫曼編碼。
還有一種方法是使權重全都是+1或-1:
調整結構來節省參數的圖示如下:
對於卷積結構也類似,傳統的卷積結構需要3x3x2x4=72個參數,而以下結構只需要18+8=26個:
著名的模型有SqueezeNet,MobileNet,ShuffleNet,Xception。