耿 旭,張永輝,張 健
(海南大學 信息與通信工程學院,海南 ???570228)
近幾年,隨著數(shù)值計算設(shè)備性能的提升,卷積神經(jīng)網(wǎng)絡(luò)(convolution neural network)得以快速發(fā)展,并在圖像分類[1-3]、目標檢測[4-6]等領(lǐng)域中取得了優(yōu)異的成績。但是,卷積神經(jīng)網(wǎng)絡(luò)的計算量較大,模型參數(shù)非常多,對一些資源有限的設(shè)備很不友好。神經(jīng)網(wǎng)絡(luò)壓縮的目的是在不影響神經(jīng)網(wǎng)絡(luò)性能的情況下,降低網(wǎng)絡(luò)計算量和減少存儲空間,本文的研究重點是減少存儲空間。目前,國內(nèi)外學者在神經(jīng)網(wǎng)絡(luò)模型壓縮方面已經(jīng)取得不少的研究成果:Han等[7]通過參數(shù)裁剪、K-means聚類量化以及哈夫曼編碼實現(xiàn)神經(jīng)網(wǎng)絡(luò)模型壓縮。Denton等[8]提出低秩近似的方法來減少模型參數(shù)。Srinivas等[9]通過比較同層內(nèi)不同神經(jīng)元的權(quán)重向量的相似度,將相似的向量合并,達到網(wǎng)絡(luò)壓縮的目的。Novikov等[10]提出張量分解的方法實現(xiàn)網(wǎng)絡(luò)模型壓縮。
基于對參數(shù)進行K-means聚類的思想,提出了對卷積核進行聚類的方法,實驗結(jié)果表明,將卷積核聚為k類之后,若k比較小,相應的壓縮率也小,但是神經(jīng)網(wǎng)絡(luò)的準確率明顯下降,若k比較大,準確率波動小,但是壓縮率高。為了保持準確率的同時,降低壓縮率,進一步提出使用K-SVD字典學習算法對卷積神經(jīng)網(wǎng)絡(luò)進行壓縮,實驗結(jié)果表明,該方法能將卷積核參數(shù)占用的存儲空間降低至原先的12%左右,并且卷積神經(jīng)網(wǎng)絡(luò)的準確率波動不足0.1%。
K-SVD字典算法是Aharon等提出的,用于更新過完備字典中原子的算法。給定訓練數(shù)據(jù)Y=[y1,y2,…,yt]∈Rn×t, K-SVD的優(yōu)化函數(shù)如式(1)所示
(1)
其中,D=[d1,d2,…,dk]∈Rn×k為字典矩陣,X=[x1,x2,…,xt]∈Rk×t為稀疏系數(shù)矩陣,T為列向量的稀疏度。求解此優(yōu)化問題,分為兩個階段:稀疏編碼階段和字典更新階段。在稀疏編碼階段,首先固定字典D,通過追蹤算法(本文使用的是OMP(orthogonal matching pursuit)算法),對稀疏系數(shù)矩陣X逐列求解,如式(2)所示
(2)
(3)
此時優(yōu)化問題可描述為式(4)
(4)
E′j=U∑VT
(5)
本文提出的壓縮方法分為3個階段,第一個階段是卷積核參數(shù)預處理,將所有卷積層的參數(shù)提取出來,并將其整理成一個參數(shù)矩陣,以便后續(xù)處理。第二個階段是卷積層參數(shù)的稀疏表示,使用K-SVD字典學習算法對參數(shù)矩陣進行學習,得到字典和稀疏系數(shù)矩陣。第三個階段是卷積核參數(shù)壓縮,對稀疏系數(shù)矩陣進行量化編碼,減少其占用的存儲空間。
卷積神經(jīng)網(wǎng)絡(luò)主要由卷積層和全連接層組成,本文提出的方法是針對卷積層進行的壓縮。卷積層的參數(shù)主要為四階張量,4個維度分別是輸入通道數(shù)i,輸出通道數(shù)o,卷積核的長度h和寬度w。卷積層的卷積核數(shù)目m=o×i, 單個卷積核參數(shù)量n=h×w, 本文壓縮方法是針對尺寸為 3×3 的卷積核,此時n=9, 將卷積層的參數(shù)整理為參數(shù)矩陣Yl∈R9×m。 如果遇到尺寸較大(例如7×7或5×5)的卷積核,則需要改變網(wǎng)絡(luò)結(jié)構(gòu),將此卷積層用多個卷積核尺寸為3×3的卷積層進行堆疊,然后重新訓練網(wǎng)絡(luò)。按照此方法將所有卷積層參數(shù)都整理為二維參數(shù)矩陣,然后對所有的參數(shù)矩陣在行方向上進行拼接,形成新的參數(shù)矩陣Y=[y1,y2,…,yt]∈R9×t, 其中yi,i∈{1,2,…,t} 表示單個卷積核的參數(shù),t是所有卷積層卷積核的總數(shù)目,Y是此卷積神經(jīng)網(wǎng)絡(luò)所有卷積層參數(shù)組成的矩陣。
將卷積層參數(shù)表示為Y=[y1,y2,…,yt]∈R9×t, 使用K-SVD字典學習算法對參數(shù)矩陣Y進行學習,從而得到字典矩陣D=[d1,d2,…,dk]∈R9×k和稀疏系數(shù)矩陣X=[x1,x2,…,xt]∈Rk×t。 此時yi(單個卷積核參數(shù))可以用字典D中T(T?k) 個原子的線性組合來近似表示,即yi≈Dxi。
經(jīng)過K-SVD算法稀疏表示之后,得到稀疏系數(shù)矩陣X,由于xi中最多含有T個非零項,將xi中的非零項提取出來,并記錄其索引,得到x′i和索引si。若向量x′i和si的長度小于T,則補零,直至長度等于T,由稀疏的系數(shù)矩陣X得到稠密的系數(shù)矩陣X′=[x′1,x′2,…,x′t]∈RT×t和索引矩陣S=[s1,s2,…,st]∈NT×t。X′中的數(shù)值都是浮點數(shù),占用的存儲空間較大,通過觀察發(fā)現(xiàn)其數(shù)值集中在一定范圍內(nèi),因此可以將X′中的數(shù)值線性映射至0到1的范圍內(nèi),然后乘以256并取整,得到整數(shù)矩陣Xz∈NT×t。 這一過程將浮點數(shù)轉(zhuǎn)化為0至256之間的整數(shù),X′中的每一個數(shù)值都可以用一個字節(jié)存儲。
存儲卷積層參數(shù)需要存儲字典矩陣D、索引矩陣S和整數(shù)矩陣Xz,所以本文方法的壓縮效果和字典原子數(shù)目k、卷積核總數(shù)t以及稀疏系數(shù)矩陣列向量的稀疏度T相關(guān)。假設(shè)卷積核參數(shù)都是4字節(jié)的浮點數(shù),壓縮率Q的計算方式如式(6)所示
(6)
其中,ω表示存儲一個字典索引所占的比特數(shù),ceil表示向上取整。從公式中可以發(fā)現(xiàn),對壓縮率影響最大的是T,通常情況下,由于字典原子數(shù)k遠小于卷積核的總數(shù)目t,所以字典原子數(shù)k對壓縮率的影響較小。
為了檢驗本文方法的壓縮效果,分別在MNIST手寫數(shù)字數(shù)據(jù)集和CIFAR-10圖像分類數(shù)據(jù)集上使用了不同的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)進行壓縮實驗。實驗平臺為ubuntu 16.04操作系統(tǒng)和開源深度學習框架caffe。
MNIST數(shù)據(jù)集是美國國家標準與技術(shù)研究所對250個不同人的手寫數(shù)字整理而成的數(shù)據(jù)集,其包含訓練樣本 60 000 個、測試樣本10 000個,每個樣本都由一張分辨率為28×28的灰度圖和其相對應的標簽數(shù)字(0~9)組成。
LeNet-C5是本文設(shè)計的一種無全連接層的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),由5個卷積核尺寸為3×3的卷積層組成,所有的卷積層均無偏置項,所以整個卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)均為卷積核參數(shù),LeNet-C5網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
圖1 LeNet-C5網(wǎng)絡(luò)結(jié)構(gòu)
其中“32@3×3 CONV”表示該卷積層有32個尺寸為3×3的卷積核,卷積步長為1,“ReLU”表示激活函數(shù)為ReLU(rectified linear unit),“2×2 MP”表示該池化層的池化步長為2,池化尺寸為2×2,池化方式為最大池化。最后,使用Softmax分類器進行分類。該網(wǎng)絡(luò)的權(quán)值正則化方式為L2正則化,正則化系數(shù)為0.0005,初始學習率為0.01,每5000次迭代,學習率除以10。網(wǎng)絡(luò)經(jīng)過20 000次迭代后,準確率為99.16%,存儲網(wǎng)絡(luò)參數(shù)占用的存儲空間為530 KB。
網(wǎng)絡(luò)訓練完成之后,選取原子數(shù)目k為16、32、64、128等7個值,X的列向量稀疏度T選取1、2、3這3個數(shù)值,使用本文壓縮方法對卷積神經(jīng)網(wǎng)絡(luò)參數(shù)總共進行了21組壓縮實驗。字典學習的迭代次數(shù)為30次(已收斂),壓縮后LeNet-C5網(wǎng)絡(luò)的準確率如圖2所示,壓縮率如圖3所示。
圖2 壓縮后LeNet-C5準確率
圖3 LeNet-C5的壓縮率
實驗結(jié)果表明,當T=1時,準確率隨原子數(shù)目k增長很快,但是最高的準確率為98.94%,準確率有所損失。當T=2,只需要擁有較少原子的字典D就能表達整個網(wǎng)絡(luò)的卷積層參數(shù),當k=16時,準確率為97.32%,壓縮率為8.44%;k=256時,準確率為99.11%,壓縮率為12.85%。當T=3時,準確率和T=2時相差無幾,但壓縮率過高,相對于T=2無任何優(yōu)勢。
CIFAR-10數(shù)據(jù)集是一個小巧且常用的標準圖像分類數(shù)據(jù)集,由60 000張分辨率為32×32的彩色圖像組成,分為10類,每類6000張,每類隨機抽取5000圖像作為訓練集,剩余的1000張作為測試集。
本次實驗使用DenseNet網(wǎng)絡(luò)結(jié)構(gòu)[11]在CIFAR-10數(shù)據(jù)集上進行測試,DenseNet是一種各個層之間具有密集連接的卷積神經(jīng)網(wǎng)絡(luò),其每個卷積層的輸入都由前面所有卷積層的輸出進行通道上的拼接而成,而該層的輸出也會直接用于后面所有卷積層的輸入。本次實驗所使用的DenseNet具有39個卷積層,其中37個卷積層的卷積核大小為3×3,邊緣填充為1,步長為1,另兩個卷積層的卷積核大小為 1×1,邊緣填充為0,步長為1,所有卷積層均無偏置項。該網(wǎng)絡(luò)僅有一個全連接層置于用于分類的Softmax層之前,其輸出數(shù)目為10。該網(wǎng)絡(luò)參數(shù)正則化方式為L2正則化,正則化系數(shù)為0.0001,初始學習率為0.1,迭代到115 000次時,學習率為0.01,迭代到172 500次時,學習率為0.001,經(jīng)過230 000次的迭代,準確率為99.99%。存儲網(wǎng)絡(luò)參數(shù)所占用的存儲空間為4.2 MB。
DenseNet網(wǎng)絡(luò)訓練完成之后,進行和LeNet-C5一樣的壓縮實驗,準確率如圖4所示,壓縮率如圖5所示。
圖4 壓縮后DenseNet的準確率
圖5 DenseNet的壓縮率
由于DenseNet網(wǎng)絡(luò)的層數(shù)比較多,網(wǎng)絡(luò)比較深,所以整個網(wǎng)絡(luò)的卷積核數(shù)目極多。當T=1,k=256時,準確率為96.51%,和原始網(wǎng)絡(luò)的準確率還有所差距,k=1024時,準確率為99.82%,才基本恢復網(wǎng)絡(luò)的準確率,此時壓縮率為7.29%。當T=2時,k=128時,準確率為99.44%,已基本恢復網(wǎng)絡(luò)的準確率,此時壓縮率為10.54%,k=256時,網(wǎng)絡(luò)準確率為99.99%,完全恢復了網(wǎng)絡(luò)的準確率,此時壓縮率為11.37%。當T=3時,在原子數(shù)k較小時,網(wǎng)絡(luò)的準確率高于T=2,當k≧128時,網(wǎng)絡(luò)的準確率和T=2時無明顯差別,但壓縮性能較差。
為了與常見的網(wǎng)絡(luò)參數(shù)裁剪、聚類、編碼混合的壓縮方法進行對比,本次對比實驗,用這種混合的壓縮方法對LeNet-C5和DenseNet進行了壓縮實驗,首先進行網(wǎng)絡(luò)參數(shù)裁剪,采用逐步裁剪的策略(每次裁剪10%的參數(shù)),每次裁剪之后再進行重新訓練,更新未裁剪的權(quán)值來恢復精度,最終LeNet-C5裁剪了80%的參數(shù)、DenseNet裁剪了70%的參數(shù)。裁剪之后,對權(quán)值進行K-means聚類,將每個簇的權(quán)值,替換為聚類中心的數(shù)值,之后再進行重新訓練,更新聚類中心來恢復精度。最后,對其進行哈夫曼編碼,實現(xiàn)網(wǎng)絡(luò)壓縮。實驗結(jié)果見表1。
由于本文方法并未使用哈夫曼編碼(本文方法與哈夫曼編碼或其它編碼方法并無沖突,可同時使用),壓縮率高于參數(shù)裁剪、K-means聚類、哈夫曼編碼的方法,但是,本文方法沒有進行參數(shù)裁剪,而是參數(shù)近似,所以在準確率方面優(yōu)于對比的方法。另外,本文方法不需要重新訓練網(wǎng)絡(luò),而對比的方法需要多次重新訓練微調(diào)網(wǎng)絡(luò),節(jié)省了大量的時間。
表1 對比實驗結(jié)果/%
這兩組實驗的結(jié)果表明,當字典的原子數(shù)目k較小時,T=2的準確率和壓縮率的綜合性能最優(yōu)。當原子數(shù)目k較大時,T=1的綜合性能最好,此時,相似于單純的對卷積核進行聚類,但是多了一個系數(shù),表達能力更強。對比實驗結(jié)果表明,本文方法在準確率方面占有優(yōu)勢,由于本文方法未使用哈夫曼編碼或其它編碼方法,壓縮率略差,在壓縮網(wǎng)絡(luò)的用時方面,本文方法使用很短的時間就能完成壓縮,而參數(shù)裁剪、K-means聚類的方法,需要進行多次的重新訓練,微調(diào)網(wǎng)絡(luò)參數(shù),完成壓縮需要大量的時間。
本文提出的深度卷積神經(jīng)網(wǎng)絡(luò)參數(shù)壓縮算法,使用K-SVD字典學習算法得到的字典矩陣和稀疏系數(shù)矩陣對卷積核參數(shù)進行近似表示,在MNIST和CIFAR-10數(shù)據(jù)集上的實驗結(jié)果表明,本文算法可以在網(wǎng)絡(luò)準確率變化微小的情況下,實現(xiàn)對卷積神經(jīng)網(wǎng)絡(luò)模型的快速有效壓縮。本文所提出的方法只實現(xiàn)了網(wǎng)絡(luò)模型的壓縮,并未實現(xiàn)加速,下一步的工作方向是研究卷積神經(jīng)網(wǎng)絡(luò)的加速。