机器学习笔记 network compression
來自于李宏毅教授的ML課件,作業七部分
Hung-yi Lee (ntu.edu.tw)
0 前言
????????我們為什么要進行network compression呢?
因為在某些環境中(比如在手機,手環等設備中),如果我們要嵌入深度學習model的話,那么鑒于設備的原因,其存儲空間,或是計算能力,都是有限的。所以我們不能需要太大的模型。
1 network pruning
對于很大的模型來說,并不是它的所有參數都是有用的,我們也許不需要那么多的參數
以人腦神經元的pruning過程為例,人腦也是在成長過程中先是有很多的神經元連接,然后慢慢地將冗余的神經元連接去掉
????????
?
比如我們以用L1范數評估weight的重要性為例:
我們現在有3個filter(橙、藍、綠),我們通過計算這三個filter的L1范數,判斷各個filter權重的重要性,把小的那個去掉
?
1.1 為什么不一開始train一個小模型
?????????那么問題來了:為什么不一開始就trian一個小的network呢?而是要從一個大的network再慢慢地prune成一個小model呢
? ? ? ? 因為如果只是一個小模型的話,可能會遇到鞍點或者局部最小值,不一定能learn得很好。但是大模型的話(尤其是足夠大的模型),是可以避開鞍點和local minimal的
1.1.1?lottery ticket hypothesis
這是19ICLR的一篇paper,大致意思是這樣的
????????對于一個大模型,我首先隨機初始化一組參數(紅色部分),然后進行tuning,得到效果還不錯的模型(紫色部分)
? ? ? ? 之后我們進行model pruning,得到一個小一點的模型(但是剩下的這些部分參數不變,仍然為紫色的部分)
? ? ? ? 此時如果我們對剩下的模型部分重新隨機初始化(綠色部分),可能是learn不出一個很好的模型的。但是如果我們將原來隨機初始化大模型對應的參數直接復制過來,是可以train得不錯的
?1.2 network pruning 實際操作上的選擇
如果我們是weight pruning,那么這會使得模型不易實現,也不易用GPU加速
- 因為這樣的話模型就不是一個矩陣的形式,那么無論是pytorch這種深度學習框架,還是依靠矩陣運算來加速的GPU,都無法實現
- 如果我們只是將prune的weight用0表示,那么模型參數的規模還是不變的
?如果我們是neuron pruning,那么我們只是減掉矩陣的一定的維度,依然很方便地實現&GPU加速
?2 knowledge distillation
????????在知識蒸餾中,我們的目標是train一個大的network(teacher network)和一個小的network(student network)。其中teacher network學習的label就是ground truth的label,而小的student network所需要學習的內容是teacher network的輸出
????????
? ? ? ? ?這樣的好處在哪里呢?相比于一個冷冰冰的ground label 1,teacher network可以學到這個label更豐富的信息(比如7和9這兩個數字跟1很像,同時7比9更像)
? ? ? ? ——>這樣就會導致,哪怕student沒有看到過7和9,他也有可能learn出一定的7&9的特征
? ? ? ? ——>teacher network 往往是一個很大的/集成了很多模型的大model,student network則可以用較少的參數實現近似的效果
2.1 label temperature
? ? ? ? 由于知識蒸餾希望teacher學習到更豐富的信息,不希望他僅僅學習到(接近)one-hot label的信息,所以我們希望各個label之間的差距稍微拉近一些,這時候就需要用到temperature的內容
2.2 TA network
如果teacher network 和student network 相差太大,那么student network可能沒法很好地學習teacher network
于是引入一個參數量介于teacher network和student network之間的TA networl 來幫助student network 學習
?
?3 parameter quantization
有兩種思路:
第一種是使用更少的比特數來表示一個參數值
第二種是進行weight clustering
????????比如我們根據某種clustering的方法把weight分成四個cluster,每個cluster的weight值都使用這個cluster的平均值來表示?
? ? ? ? 這樣的好處是省內存,我們只需要一個記錄每個cluster是什么數值的table,以及一個元素為屬于哪個cluster的矩陣就可以了(比如我們分成四個cluster,只需要2bit)
? ? ? ? 但是這種方法勢必會減少一定的精度
第三種方法是使用類似于哈夫曼編碼的方式進行編碼
使用比較頻繁weight用較少的比特表示,使用比較少的weight用較多的比特表示
4 模型架構設計
比如,我們本來想創建一個N維到M維的全連接層,我們需要M*N個參數
現在我們在中間插入一層維度為K的中間層,那么我們只需要M*K+N*K個參數?
?
包括mobilenet,就是一種很明顯的依靠模型架構設計的方法來進行?
NTU 課程 7454 (5) CNN進階_UQI-LIUWJ的博客-CSDN博客
5 動態計算
????????如果資源充足的時候,那么就做到最好;如果資源不足的時候,那么就在不怎么影響性能的情況下,先求有再求好【類似于省電模式】
? ? ? ? 一種解決方法是,在中間的hidden layer 就接一些輸出,如果計算資源不足的時候,那么從中間就把結果輸出出來了
?
6 多種network compression方法混合
?
總結
以上是生活随笔為你收集整理的机器学习笔记 network compression的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文笔记:Matrix Completi
- 下一篇: NLP 笔记: 序列标注与BIO标注