一、算法概述
1.1 svd分解
1.1.1 問題引出:對仿射變換進行降維線性近似
對一個卷積層來說,卷積的輸出響應可表示為,其中
擴展成
,
擴展成
,
為輸入通道個數,
為卷積核大小,
為輸出通道個數。
在假設輸出響應是一個低秩空間下,存在低秩的矩陣
,使得
,其中
為
的均值,因此,輸出響應可重寫為:
其中,。低秩的
可分解成兩個矩陣的乘積,即
,其中
,于是可得,
其中,。因此,可使用兩個卷積層(卷積核分別為
和
)來近似原來的卷積層
,該近似的完成還存在兩個問題:
-
矩陣如何求解?
- 如何分解
?
-
使用優化問題來求解:
該優化問題可用svd求解:
令為減去均值后的N個響應,協方差矩陣
(根據協方差矩陣定義推導)。
2.上述矩陣的分解可用svd:
,因此
1.1.2 推廣: 對加入非線性(relu)層的卷積層進行降維近似
上述輸出響應近似推廣到非線性輸出響應的近似,則優化問題可變為:
解上述優化問題具有挑戰性,因此可用通過求解近似優化問題來求解:
這里當時,等價于原優化問題。使用迭代的方法分別優化
和
- 固定
,求解
;
當固定時,最小化目標函數可得
,則優化問題變為:
該優化問題與線性時的優化問題相似,但是這里有兩個響應集,重寫優化問題可得:
此處的響應集均是減均值之后的結果,該問題可用GSVD求解。
- 固定
,求解
; 當
固定后,可逐元素的優化
:
1.1.3 減小逐層誤差累積: 非對稱分解思路
為了防止底層近似誤差累積都深層,采用非對稱方法來解決該問題,優化問題變成:
其中是該層的近似輸入,因此
是近似輸出。解該優化問題如非線性情況。
1.1.4 選擇最優的衰減通道數
上述優化問題中是決定近似層復雜度的唯一參數,每一層的冗余不同,因此不同層應合理的選擇適當的參數值。
經驗上PCA能量與分類準確率有關,定義目標函數:
其中,表示
層第
大的特征值,
是近似之前的復雜度,
是期望的近似之后的總復雜度。該優化可用貪心算法求解。
1.2 卷積核分解
1.2.1 scheme2
基于事實:不同的卷積核與通道之間存在冗余。
基于思想:每個卷積層可分解成一系列的兩個子空間矩形卷積層,第一個卷積層有個
卷積核,第二層有
個
卷積核。
因此原始的卷積核可近似為:
因此能得到優化問題:
使用共軛梯度法解該優化問題。
1.3 組合使用svd分解與卷積核分解
思路:先使用核分解將卷積層分解成和
的卷積核,再使用通道近似的方法,將
的卷積核近似成
和
的卷積核。
二、實現步驟
2.1 腳本說明
compute_d.py 通道數
的選擇
solve_linear_PWb_space.py 通道線性分解
solve_nonlinear_PWb.py 通道非線性分解
asymmetric.py 通道非對稱分解
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),并導入相應層分解后的權重文件,測試精度
三、注意
由于svd分解是基于對feature map冗余信息的降維近似,當生成feature map所用的數據集與原來訓練網絡模型時所用的數據集有差別時,分解的精度會受很大影響。但是卷積核分解不存在此問題。
利用svd的非線性方法進行分解時需要求解GSVD,當feature map的協方差矩陣低秩時可能有復數解,此時應該使用線性求解的方法
利用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.