[NIPS’16]論文連結:https://arxiv.org/pdf/1608.04493.pdf
代碼連結:https://github.com/yiwenguo/Dynamic-Network-Surgery
這篇文章也是關于參數的修剪,但是多了一個拼接的步驟,可以大幅度恢複修剪造成的精度損失,并且能有效的提升壓縮率。
效果:
可以将LeNet-5和AlexNet中的參數數量分别壓縮108倍和17.7倍,而且不損失精度。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVP9EVT3RzVhNXNXlFcwdFZwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zMxIjM1MTM4ETNxYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(a)代表的是文章提出的動态網絡手術,(b)代表的是Song Han等人提出的網絡壓縮的方法。以AlexNet為例,(b)需要4800K以上的疊代才能獲得一個合理的壓縮率(9×),而(a)隻需要700K次疊代就可以得到一個明顯更好的結果(17.7×)。
主要思想:
文章中提出了一種新的網絡壓縮方法,稱為動态網絡手術,通過動态連接配接修剪降低網絡複雜度。 與以前貪心修剪的方法不同,該方法将連接配接拼接整合到整個過程中,以避免不正确的修剪并對網絡進行維護。
涉及兩個關鍵操作:修剪和拼接。
修剪操作是為了壓縮網絡模型,但是修剪或修剪不正确應該是造成精度損失的原因。為了彌補操作不當造成的損失,将拼接操作納入網絡手術中,并且一旦發現被修剪的連接配接在任何時候都很重要,就實作連接配接恢複。
這種方法不僅有利于更好地接近壓縮極限,而且有利于提高學習效率。
我們的目标是網絡修剪,關鍵是放棄不重要的參數并保留重要的參數。然而,由于互相連接配接的神經元之間的互相影響和互相激活,某個網絡中的參數重要性(即連接配接重要性)是非常難以測量的。也就是說,由于其他一些網絡的存在,網絡連接配接可能是多餘的,但一旦其他網絡被删除,它很快就會變得至關重要。是以,在進行學習過程中不斷進行網絡結構的維護應該會更合适。
文章提出以下優化問題:
以第k層為例,其中L()是網絡損失函數。hk()是參數w在目前層的判别函數,重要為1,否則為0。簡言之:Wk是原始矩陣,Tk就是這一層的掩碼矩陣,兩者相乘得到修剪後的參數矩陣。
Wk更新方案:
這種方法不僅更新了重要的參數,而且還更新了與Tk中0相對應的參數(0,1之間變換代表着修剪的參數位置也一直在變換),這樣就可以拼接回修剪不正确的連接配接。
算法步驟:
修剪和拼接不斷循環進而重複更新Wk和Tk。
參數重要性判斷:
hk()函數:
參數重要性還是以權值絕對值為基礎,設定了ak和bk2個門檻值,bk=ak+t。
訓練收斂速度優化:
為了加快訓練速度,文章中提供了兩個政策:
1)降低修剪和拼接頻率,因為這些操作會導緻網絡結構的變化。通過随機地觸發Tk的更新來完成,其機率為p,一段之間過後,機率p甚至可以設定為零,即不再進行修剪或拼接。
2)将卷積層和全連接配接層分開裁剪連接配接。由于很大比例的連接配接被修剪掉,是以網絡結構應該變得更簡單并且可能甚至更“薄”。是以,損失函數的導數可能非常小,特别是當參考模型非常深時。