【模型壓縮】模型剪枝,知識蒸餾,ShuffleNet知識與實戰小結

【模型壓縮】模型剪枝,知識蒸餾,ShuffleNet知識與實戰小結

什麼是知識蒸餾: 根據Hinton15年的文章,Distilling the knowledge in aneural network來看,模型蒸餾的設計思路,和物理變化上的蒸餾確實是很像的,而論文中涉及到的一些關鍵詞,也是用相應的物理詞彙進行描述。最具有代表性的就是關於溫度變化的超參數T,通過T來改變建立的soft target的,使得蒸餾後的模型更具有特定數據集下的表現力,直觀地表達就是在這種‘溫度’,這種數據集的情況下,模型表現力更加強,‘純度’更高。
說回本質上,可以說是一種遷移學習,使得模型對特定的數據集更加具有針對性,相應的蒸餾出來的模型也會具有對某個數據集的特異性。

知識蒸餾的基本原理: 用一個已訓練的teacher網絡,去教會一個student網絡
知識蒸餾和模型剪枝的異同: 模型剪枝是剪裁去掉一些不影響表現力的參數,從而達到模型的縮小,相應地,多多少少都會失去對於一些數據的表達信息,從而體現出對於當前數據的特異性,這與知識蒸餾在直接表現上是一致的,而知識蒸餾是通過fine tune更小的數據集來實現這個目的。

開源的壓縮工具包:

  • Intel 開源了一個用於神經網絡壓縮的開源 Python 軟件包Distiller,它可以減少深度神經網絡的內存佔用、加快推斷速度及節省能耗。Distiller 爲 PyTorch環境提供原型和分析壓縮算法,例如產生稀疏性張量的方法和低精度運算等。

【模型壓縮】蒸餾算法小結

知識蒸餾:

  • Rocket Launching: A Universal and Efficient Framework for Training Well-performing Light Net:其中簡單的網絡稱爲輕量網絡(lightnet),複雜的網絡稱爲助推器網絡(booster net),相比前者,有更強的學習能力。兩個網絡共享部分參數和層次,分別學習類別標記,此外,輕量網絡通過學習助推器的soft target來模仿助推器的學習過程,從而得到更好的訓練效果。測試階段,僅採用輕量網絡進行預測。()
    || 關於loss : 第一項是交叉熵函,第二項是logits 的平方差(hint loss),通過hint loss在兩個網絡間共享學習信息,論文中給出了三種方案,具體看這裏,多數其他人後續的實驗證明是加了T超參數的loss的效果最好。
    || 通過Gradient block防止Booster Net性能受Light Net牽連 :本文由於採用同時訓練兩個網絡,因此兩個網絡的性能會接近,這會妨礙Booster Net直接從Ground Truth的學習,Booster Net不能達到更有,使得兩個網絡的性能都下降。文章設計了Gradient block模塊:在訓練的反向傳播hint loss項階段,固定Booster Net的Wb權重參數來實現,即該參數僅通過H(y,q(x))的反向傳播更新。

模型剪枝:

  • 基於幅值的剪枝
    主要思想: 將小於一定閾值的權重拋棄。該閾值可根據剪枝率確定。
    方法: 設置一個跟權重形狀相同的mask(其值爲二值張量,0或者1),用來與權重相乘,從而決定哪些權重要被剪掉(剪枝掉的權重不會再接收梯度,不可逆)。而mask中值的設置,可將權重排序,將低於閾值的權重對應的掩碼設置爲0.
    實驗過程包括三步:第一,訓練原始模型;第二,對訓練得到的模型,進行剪枝;第三,刪除訓練圖中的剪枝結點(這一步必須要做,否則的話會導致模型變大)
  • 基於通道的剪枝
    主要思想: 該方法是將不重要的整個權重通道剪掉,從而將模型變小
    方法: 對已經訓練好的模型,選擇要剪枝的不重要(或不太重要)的通道,刪除這些通道,構造新的模型圖;重新訓練,恢復準確率

部分內容出處:
https://blog.csdn.net/firsttimett/article/details/85597506
https://blog.csdn.net/m0_37665984/article/details/103344743

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