神經網路中權值和鏈接的修剪(一)
背景相關
神經網路的計算密集和緩存密集特性使其難以被應用到嵌入式系統上(主要是各種移動應用)來。究其原因,作者認為是傳統的神經網路在訓練之前就已經把整個框架結構固定下來了,而導致後續的各種訓練並不能提升改進整個結構。
本文主要是通過只保留神經網路中重要的鏈接來達到降低一個數量級的存儲和計算複雜度的目的。概括來說可以分為三步:
①通過訓練找到重要的鏈接;
②然後修剪掉不重要的鏈接;
③最後對網路進行再訓練來微調剩下的鏈接的權值。文中的實驗結果表示在不影響精度的前提下,能夠對參數進行9-13倍的壓縮。
下面主要是根據論文的行文順序進行具體說明,然後略作補充。
如下圖所示是一個45nm的CMOS工藝上的一些基本的數學和緩存操作的能耗,從這些數據我們可以看出每個鏈接的能耗主要是被內存操作所佔據。
其中片上的SRAM中的32位操作秩序5pJ, 而片外的DRAM上的32位操作卻高至640pJ. 並且由於大型的神經網路並不適應於片上SRAM尺寸而只能運行在片外的DRAM上,所以會帶來大量的能耗。以運行一個1 billion個鏈接的神經網路為例,在20Hz的情況下,將需要(20Hz)(1G) (640 pJ)=12.8W,這還是只考慮了DRAM的訪問,而這已經超出了移動設備的正常能力。所以本文的目標是修剪神經網路降低其能耗,使得其可以運行在移動設備上。
當然,背景中介紹了不少現有的一些修剪方案,但是大部分認為是跟本文正交的,也就是可以同時運用的,在此就不再過多贅述,有情緒的小夥伴可以自行查找。
方案設計
如上圖所示,主體設計參照前文的:訓練→修剪→再訓練。
先通過一個訓練找出那些不重要的鏈接,當然在此處,文章中主要是通過對正則式的運用來使得連接中的一部分權值趨近於0,然後就可以把這部分鏈接剪枝掉。這個地方如果運用L1正則式會造成更多的參數接近0,在訓練修剪之後能夠保持很高的精度,但是這樣的結果並不能適應再訓練時所用的L2正則式(文中有說明再訓練時使用L2正則式好些),所以本文通過一些實驗決定全局使用L2正則式,這樣能夠達到全局最優的效果。
Dropout概率的調整
Dropout主要是用來預防過擬合的,這裡用在了再訓練過程中。不過由於本文所用的修剪方案很大程度地減少了參數的規模,已經在一定程度上降低了過擬合,所以這裡使用的dropout概率需要相應地調低。這裡用了一個比較簡單的公式進行調節,大概來說就是根據修剪前後鏈接數目的變化來等比例的調整dropout的概率。
反覆的修剪
每次的剪枝操作後邊跟一個retrain(再訓練)視為一個原子操作,因為這樣比單純地重複剪枝操作很多次以後再通過再訓練就行調整效果好5到9倍。文中也進行了根據權值絕對值進行有概率修剪的方式,但是效果不太好。當然,為了避免梯度消失的問題,本文主要是採用固定卷積層來再訓練全連接層,然後反過來操作的方式。
本文中修剪的不止是鏈接,當不停地修剪鏈接而導致某個神經元的輸入或者輸出為0時,就會把該神經元也從整個網路結構中移除。
測試結果
文中在多種經典網路架構上進行了實驗,結果顯示壓縮比例在9到13之間。
然後針對Lenet-5來說,修剪能使得權值規模降低了12倍,變為修剪前的8%,而計算量則是降低了6倍,變為之前的16%。
同理下圖是AlexNet的修剪結果。對照下邊左右兩圖可以看出,卷積層的參數壓縮比相對較小,而計算量的壓縮比相對較大;全連接層與之相反。當然,其他一些論文中也有對此現象的描述,就是說計算量大的是卷積層,佔了整個網路計算量的90%左右,而參數規模大的是全連接層,佔了整個網路的90%左右的參數。
後邊還有不少測試圖,我就不再一一說明了。
該文章的後續延伸有一篇2016年的ICLR上的best paper:deep compression。如果大家感興趣的話請留言,小編好確認要不要繼續寫。
推薦閱讀:
※【信息匯總】國際「頂尖」計算機視覺、機器學習會議大搜羅--附排名&接收率
※《得意忘形》播客 #19:下圍棋的人工智慧與人類的永恆自戀
※知識圖譜從0級到10級簡化版
※營銷迎來下一個拐點,人工智慧可以找回浪費的那一半廣告費嗎?
※被圍棋AI橫掃後,職業棋手應該如何提高水平?|陳經