A Main/Subsidiary Network Framework for Simplifying Binary Neural Networks_CVPR19

URL: http://openaccess.thecvf.com/content_CVPR_2019/html/Xu_A_MainSubsidiary_Network_Framework_for_Simplifying_Binary_Neural_Networks_CVPR_2019_paper.html

TL;DR

這篇論文提出了一種對二值化網絡進行修剪的剪枝方法,將量化和剪枝這兩個模型壓縮方法結合了起來。由於是首次嘗試,作者在文中進行了很多必要的定義。

Algorithm

作者實驗發現,儘管量化已經大大地減少了每個權重/神經元表達能力的冗餘,二值化網絡在網絡拓撲方面也存在着較大的冗餘。
作者的設計思路如下圖所示。

從圖中可以看出,作者的設計主要包括兩部分:主網絡和輔助組件。主網絡是待修剪網絡,輔助模塊是爲了得到各個卷積核的mask。

核心算法主要包含兩個部分:

第一部分:主網絡的特徵學習

對於第i層,輔助模塊的權重Mi通過隨機分佈進行初始化。爲了實現filter修剪的目的,M這個四維tensor中,第一維索引相同的所有元素共享相同的權值(即同一個卷積核的mask共享同一個權重)

卷積核的mask 是輔助模塊的輸出tensor。

接下來,

1)利用對象轉換函數Iden()來得到Oi,然後利用filter mask Oi來對主網絡的權重Wi做掩膜,即進行對應像素點相乘。接下來將掩膜後的權重tensor與輸入特徵圖做卷積操作。

2)固定輔助模塊的權重tensor,將主網絡的權重設置成可學習的。因爲輔助模塊是固定的且被初始化爲接近零的數,因此它不會在特徵學習階段產生作用(此結論如何得出的沒想太明白~~全部和0做點乘,不是把權重都變成零了嘛)。整個的二值網絡將會從頭開始訓練。

第二部分:輔助組件的特徵選擇(即filter篩選)
在單獨一個層中訓練輔助組件:從頭開始訓練完主網絡以後,我們利用一個二值操作來逐層篩選二值網絡的特徵(同時也是篩選filter)。與訓練主網絡不同,此時主網絡的權重以及輔助組件除該層以外的其它層保持固定,輔助單元的當前層權重設置爲可訓練。產生卷積核mask的轉換函數由Iden()變爲Bin()。
55
通過這樣一個函數,我們將浮點數Mi投影到0到1的二值化數。Oi中的元素值爲0表明相應的filter被移除,爲1則表明保留該filter。
由於Bin()函數是不可微的,本文在反向傳播的過程中應用下面的f(x)函數來代替符號函數sign()。
37
除了上述轉換之外,我們同時需要我們需要添加約束來防止Oi全部退化到1。於是在輔助組件中i層的訓練loss函數定義爲:
14
其中L_corss_entropy是data的loss,L_distill是公式7定義的蒸餾損失。44

最後,我們固定輔助組件的j層權重和主網絡第i層之前的所有層權重,重新訓練第i層以後的其他主網絡層(感覺這種訓練方式過去複雜,不適合較深的網絡。)

自下而上的逐層訓練機制:

爲了解決梯度不匹配以及在特徵選擇過程中的非整數解,接下來我們針對輔助模塊提出一種以層爲單位、自底向上的訓練方法:越靠近輸入的先訓練。當第i層正在訓練時,所有前面已經訓練過的層參數保持固定,輔助組件被初始化爲幾乎爲零的數(使之不影響網絡訓練)。這樣做有以下三個優點:

1)正如公示1,本文利用STE來估計符號函數的梯度。根據鏈式法則,對於在i層的每一個激活節點,我們想要計算Loss函數關於該節點參數的偏導數來衡量該節點對最終誤差的貢獻度大小。二值化網絡的誤差貢獻度計算如下:
48
其中,(3)和(5)是基於鏈式法則得到,(4)(6)是基於STE估計得到的,這些估計將會在反向傳播過程中帶來梯度誤差,且越靠近輸入的層,梯度誤差越大。作者的這種訓練機制使得具有最嚴重梯度不匹配問題的層是傳播次數最少的,一定程度上減少了誤差的傳播。

2)幫助主網絡更好地適應由前面的層修剪導致的特徵偏移。
本文所提出的修剪方法和基於規則的修剪方法的主要不同在於,可以通過聚焦網絡的最後輸出來學習更加可學習的參數來適應數據。
3)逐層修剪可以獲得更高的修剪率

總的來說,這篇文章的pipline如下:
1)用服從隨機分佈的接近於0的數來初始化輔助組件的權重;
2)設置輔助組件中的權重固定,從頭訓練整個網絡
3)從第一層開始逐層訓練。對每一層重複以下步驟進行訓練。i)將輔助單元所訓練的mask Mi的激活函數由Iden() 改爲Bin()。除了Mi之外的其他參數保持固定。根據公式2中的loss訓練輔助組件;ii)然後固定輔助組件網絡的參數權重以及主網絡i層之前的網絡層權重,重新訓練主網絡第i層。

蒸餾loss
作者認爲,儘管剪枝不是一個明確的遷移學習任務,但是它的目標也是引導修剪後的網絡學習與原始網絡具有相似分佈的輸出,這也有點類似於蒸餾。因此爲了更好地訓練輔助組件,作者在loss中加入了蒸餾loss。

最後作者還討論了所提出方法和基於L1-norm和LASSO迴歸的修剪方法的關係,證明了上述兩種方法在二值化網絡修剪方面是不起作用的。

Experiments

由於這篇文章是第一個對二值化網絡進行剪枝的,沒有文章對比,所以作者自己設計了基於規則修剪的方法作爲baseline,然後與所提出的方法進行對比。
作者分別在cifar10和imagenet上對VGGNet和ResNet進行了壓縮實驗。實驗結果如下:

Thoughts

這篇文章作爲第一個將量化和修剪結合起來的文章,有一定的借鑑意義。不過本文所提出的算法schedule過於繁瑣且耗時,不適合壓縮較深的網絡模型,在這方面還有可優化的空間。

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