模型壓縮

一、算法概述

1.1 svd分解

1.1.1 問題引出:對仿射變換進行降維線性近似

對一個卷積層來說,卷積的輸出響應可表示為y=Wx,其中W擴展成(d \times (k \times k \times c+1))x擴展成(k \times k \times c+1)c為輸入通道個數,k為卷積核大小,d為輸出通道個數。

在假設輸出響應y是一個低秩空間下,存在低秩的矩陣M_{d \times d} ( rank(M) < d ),使得y=M(y-\overline y)+y,其中\overline yy的均值,因此,輸出響應可重寫為:

y=\mathbf{M}\mathbf{W}x+b

其中,b=y-\mathbf{M}\overline y。低秩的M可分解成兩個矩陣的乘積,即M=PQ^T,其中P,Q \in R^{d \times d'}, d'<d,于是可得,

y=PQ^TWx+b=PW'x+b

其中,W'=Q^TW。因此,可使用兩個卷積層(卷積核分別為W' \in R^{k \times k \times c}P \in R^{1 \times 1 \times d'})來近似原來的卷積層W,該近似的完成還存在兩個問題:

  1. M矩陣如何求解?
  2. 如何分解M
  1. M使用優化問題來求解:

obj = \min \limits_{M} \sum_{i = 1}^{N} \| (y_i-\overline{y}) - M(y_i-\overline{y}) \|^2

該優化問題可用svd求解:
Y為減去均值后的N個響應,協方差矩陣M=YY^T(根據協方差矩陣定義推導)。

2.上述矩陣M的分解可用svd:M=U_{d'}S_{d'}V_{d'}^T,因此P=U_{d'}S_{d'}^{1/2}, Q=V_{d'}S_{d'}^{1/2}

1.1.2 推廣: 對加入非線性(relu)層的卷積層進行降維近似

上述輸出響應近似推廣到非線性輸出響應的近似,則優化問題可變為:

obj = \min \limits_{M,b} \sum_{i} \| r(y_i)-r(My_i+b) \|^2_2
解上述優化問題具有挑戰性,因此可用通過求解近似優化問題來求解:

obj = \min \limits_{M} \sum_{i } \| r(y_i)-r(z_i)) \|^2_2+ \lambda \| z_i- (My_i+b) \|^2_2

這里當\lambda \rightarrow \infty時,等價于原優化問題。使用迭代的方法分別優化M,bz_i

  1. 固定z_i,求解M,b
    z_i固定時,最小化目標函數可得b=\overline{z}-M \overline{y},則優化問題變為:

obj = \min \limits_{M} \sum_{i } \| (z_i-\overline{z})-M(y_i - \overline y) \|^2_2

該優化問題與線性時的優化問題相似,但是這里有兩個響應集,重寫優化問題可得:

obj = \min \limits_{M} \| Z-MY \|^2_F
此處的響應集均是減均值之后的結果,該問題可用GSVD求解。

  1. 固定M,b,求解z_i; 當M,b固定后,可逐元素的優化z_i

obj = \min \limits_{z_{ij}} (r(y_{ij})-r(z_{ij}))^2+\lambda (z_{ij} - y_{ij}^{'}) \|^2_2

1.1.3 減小逐層誤差累積: 非對稱分解思路

為了防止底層近似誤差累積都深層,采用非對稱方法來解決該問題,優化問題變成:

obj = \min \limits_{M,b} \sum_{i} \| r(Wx_i)-r(MW\hat{x}_i+b) \|^2_2

其中\hat{x}_i是該層的近似輸入,因此r(MW\hat{x}_i+b)是近似輸出。解該優化問題如非線性情況。

1.1.4 選擇最優的衰減通道數

上述優化問題中d'是決定近似層復雜度的唯一參數,每一層的冗余不同,因此不同層應合理的選擇適當的參數值。

經驗上PCA能量與分類準確率有關,定義目標函數:

\varepsilon = \prod _{l} \sum_{a=1}^{d'} \sigma_{l,a}
s.t. \sum_{l} \frac{d_l^{'}}{d_l}C_l <=C

其中,\sigma_{l,a}表示l層第a大的特征值,C_l是近似之前的復雜度,C是期望的近似之后的總復雜度。該優化可用貪心算法求解。

1.2 卷積核分解

1.2.1 scheme2

基于事實:不同的卷積核與通道之間存在冗余。

基于思想:每個卷積層可分解成一系列的兩個子空間矩形卷積層,第一個卷積層有Kk \times 1卷積核,第二層有N1 \times k卷積核。

因此原始的卷積核W_n * z = \sum _{c=1}^{C} W_n^c * z^c可近似為:

W_n * z \approx h_n * V=\sum_{k=1}^{K}h_n^k *(v_{k}*z)=\sum_{k=1}^{K}h_n^k *\sum_{c=1}^{C}(v_{k}^c*z^c) = \sum_{c=1}^{C}[\sum_{k=1}^{K}h_n^k *v_{k}^c]*z^c
因此能得到優化問題:

obj = \min \limits_{\{h_n^k \},\{v_k^c\}} \sum_{n = 1}^{N} \sum_{c = 1}^{C} \| W_n^c - \sum_{k=1}^{K}h_n^k*v_k^c\|^2

使用共軛梯度法解該優化問題。

1.3 組合使用svd分解與卷積核分解

思路:先使用核分解將卷積層分解成k \times 11 \times k的卷積核,再使用通道近似的方法,將1 \times k的卷積核近似成1 \times k1 \times 1的卷積核。

二、實現步驟

2.1 腳本說明

  1. compute_d.py 通道數d'的選擇

  2. solve_linear_PWb_space.py 通道線性分解

  3. solve_nonlinear_PWb.py 通道非線性分解

  4. asymmetric.py 通道非對稱分解

  5. cgd_sch2.py 核分解

2.2 svd分解步驟

1、導出需要分解層的feature map和權重:

1.1 導出要分解層的feature map存成.h5文件(3000-6000幅圖),每幅圖feature map 為三維(feature_size, feature_size, output_channel)

    feature map文件:feature_map/conv1_1/imgname.h5

    注意:feature map為三維(feature high,feature width,outputchannel),一般每層feature map取3000-6000幅為宜

1.2 將權重文件轉成.pkl文件,以convname_w.pkl和convname_b.pkle命名

    權重文件:Wbs/conv1_1_w.pkl   Wbs/conv1_1_b.pkl

2、通道分解:

2.1 選擇每層減少通道數de_ch:
    
    計算每層yyt的值,腳本solve_linear_PWb_space.py中已有相關計算,結果存于solution/solution_linear/conv1_1/accelerating_linear_Mb.pkl
    
    修改相應的卷積層名稱layers,和原始復雜度計算Complexity
    
    修改輸入文件名:init_dir 為accelerating_linear_Mb.pkl的地址
    
    設置期望近似后的復雜度 Complexity_predict=Complexity_total*0.4 
    
    $ python compute_d.py   打印出每層減少通道后的通道數

2.2 分別修改solve_linear_PWb_space.py、solve_nonlinear_PWb.py、asymmetric.py中每個feature map隨機采樣點數randsize=4,和輸入文件地址:

    indir --- feature_map 地址
    wdir --- conv1_1_w.pkl地址
    bdir --- conv1_1_b.pkl 地址

2.3 線性、非線性和非對稱分別執行:

    $ python solve_linear_PWb_space.py --layer=conv1_1 --de_ch=16 --batch_size=6000
    
    $ python solve_nonlinear_PWb.py --layer=conv1_1 --de_ch=16 --batch_size=6000
    
    $ python  asymmetric.py --layer=conv1_1 --de_ch=16 --batch_size=6000
    
    其中,layer為要分解卷積層,de_ch為減少通道數,batch_size為feature map的個數。
    
    注意:非對稱分解需要輸入上一層近似之后的feature map,因此分解一層都要導出前面都近似之后的feature map,且該feature map要和原始的feature map相對應。

2.4 分解好的權重文件存放在solution目錄下:

    線性:solution_linear/conv1_1/accelerating_linear_PWb.pkl

    非線性:solution_nonlinear/conv1_1/accelerating_nonlinear_PWb.pkl
    
    非對稱:solution_asy/conv1_1/acceleratin_asy_PWb.pkl

2.5 修改網絡,測試精度:

    將分解層網絡(3 * 3,outchannel)改成(3 * 3,de_ch)+ (1 * 1,outchannel),并導入相應層分解后的權重,測試精度

2.3 卷積核分解步驟

1 修改cgd_sch2.py中輸入文件地址:

wdir =  'Wbs/' + FLAGS.layer + '_w.pkl' 權重文件

bdir =  'Wbs/' + FLAGS.layer + '_b.pkl' bias文件

2 $ Python cgd_sch2.py –layer=conv1_1 –de_ch=16

其中,layer為要分解卷積層,de_ch為減少通道數

3 分解好的權重文件solution/cgd/conv1_1/sch2_HV_cgd_step10.pkl

4 修改網絡,測試精度:

將(3 * 3, outchannel)改成(3 * 1, de_ch) + (1 * 3, outchannel),并導入相應層分解后的權重文件,測試精度

三、注意

  1. 由于svd分解是基于對feature map冗余信息的降維近似,當生成feature map所用的數據集與原來訓練網絡模型時所用的數據集有差別時,分解的精度會受很大影響。但是卷積核分解不存在此問題。

  2. 利用svd的非線性方法進行分解時需要求解GSVD,當feature map的協方差矩陣低秩時可能有復數解,此時應該使用線性求解的方法

  3. 利用cgd求解雙凸問題時,初始值的選擇可能會影響目標函數的結果。

參考文獻

[1] Zhang X, Zou J, He K, et al. Accelerating Very Deep Convolutional Networks for Classification and Detection[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2016, 38(10):1943.

[2] Jaderberg M, Vedaldi A, Zisserman A. Speeding up Convolutional Neural Networks with Low Rank Expansions[J]. Computer Science, 2014, 4(4):XIII.

[3] Takane Y, Hwang H. Regularized linear and kernel redundancy analysis[J]. Computational Statistics & Data Analysis, 2007, 52(1):394-405.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374