上一篇(1)中,整理了幾篇關於結構稀疏化的論文,那幾篇中的方法要麼是基於Dense Topology的稀疏化設計,要麼是基於某些參數指標的剪枝方法,實際上都沒有擺脫normal convolution操作,以及其他如ReLU等的element-wise的操作。

本文從改進卷積操作使其更高效的角度,整理了幾篇壓縮網路的論文。

相關工作 - 壓縮網路

這一類的方法,大多是針對傳統CNN中會產生大量參數的結構進行修改(卷積層等),採用特定的策略設計更加緊湊、參數利用率更高的結構。

1 - SqueezeNet

這篇論文是在2016年提出的,目標是在保證精度不損失的前提下,將原始的AlexNet壓縮多達510倍(模型大小小於0.5M)

作者在設計SqueezeNet時,通過對CNN的微架構(卷積層的結構;element-wise操作等)和宏架構(微架構塊的堆疊得到的完整網路結構)的分析,提出了壓縮結構設計的三點策略

  • 使用1*1卷積替代3*3卷積 - 這樣,可以使得參數數量減少為原來的1/9
  • 減少3*3卷積的輸入channel數 - 針對這一點,作者設計了squeeze layers結構來實現
  • 儘可能將降採樣層放到網路的後面層

前兩點是針對規模壓縮的策略,而最後一點,是為了提高圖像處理的質量。不論是從直觀上,還是實驗驗證,解析度更高的特徵圖,可以提供更多的圖像信息,而經過降採樣操作之後,會損失一定的位置敏感信息。

結合上述三點策略,作者提出了一個類似Inception結構的網路單元——fire module。一個fire module由一個squeeze層(1*1卷積)和一個expend(1*1卷積和3*3卷積)層組成。利用squeeze層進行輸入通道壓縮。除了使用fire module取代normal convolution之外,在設計上和訓練上還採用了以下策略

  • 保證expend層的1*1和3*3卷積的特徵圖大小一致,3*3卷積採用了zero-padding
  • 使用ReLU作為激活函數
  • fire-9之後採取50%的dropout
  • 去掉全連接層,使用global average pooling

最終,只使用fire module的網路結構把AlexNet從240M壓縮到了4.8M,繼續使用deep compression對參數壓縮,從32bit壓縮至6bit,最終得到的模型只有0.47M

SqueezeNet中的fire module實際上就是大量使用了現在常用的bottleneck壓縮結構,來實現壓縮的;對於卷積操作而言,SqueezeNet依然採用的是normal convolution,所以對速度的提升依然不盡人意,還有更大的壓縮空間。

2 - MobileNet

MobileNet是Google團隊針對移動端設備部署提出的一個輕量級網路架構

MobileNet使用了depthwise separable convolution(深度可分離卷積)取代normal convolution來實現更高效的網路結構。深度可分離卷積在計算上,本質上是冗餘更少的稀疏化表達

在操作上,深度可分離卷積首先針對每個輸入channel做一次3*3卷積(這裡的卷積輸入通道就相當於1),然後針對所有通道進行一次1*1卷積

這一塊提到的稀疏化表達,實際上並不僅僅在normal convolution的channel上。

Google的InceptionV3中,就有嘗試過使用1*n和n*1卷積,從實驗結果上看,效果與一個n*n的卷積核效果類似

同理對於常規卷積而言,除了卷積核的冗餘信息,通道上的冗餘信息也是可以想像到的

對於常規卷積(有zero-padding,輸入輸出特徵圖大小一致)來說

  • 特徵圖大小 H 	imes W
  • 輸入通道 M
  • 輸出通道 N
  • 卷積核大小 K

計算量為

M 	imes H 	imes W 	imes K^2 	imes N

而使用了深度可分離卷積之後,計算量變為了

M 	imes H 	imes W 	imes N + M 	imes H 	imes W 	imes K^2

經過這樣的結構改進之後,模型規模大大減少,而且主要的計算量就集中到了1*1卷積上,因此為了進一步壓縮,作者針對深度可分離卷積的通道進行了進一步壓縮,加入了寬度因子和解析度因子對特徵圖和通道數進行進一步縮放。

深度可分離卷積,可以看作是對常規卷積操作的分解

常規卷積在計算上,一次性實現了對通道信息和特徵圖局部信息的整合;而深度可分離卷積將這兩個過程分開,先對特徵圖局部的信息進行提取整合,再對通道信息進行整合

從規模上看,深度可分離卷積大大降低了卷積操作的參數量和規模,但是效果上並沒有相關的對比證明哪種更好。

3 - ShuffleNet

ShuffleNet是Face++團隊提出的面向移動端設備部署的網路結構。

在MobileNet中,採用分組的卷積方式證明在壓縮效果上十分有效,同時精度也可以維持在與常規卷積類似的精度上,但是深度可分離卷積雖然有1*1卷積進行通道信息整合,但是實際上相比於常規卷積,通道間信息流的傳遞,還是受到了阻礙,因此Face++團隊在分組卷積的基礎上加入了shuffle(打亂/重排序)的機制

在設計上,網路結構主要有以下幾個創新點

  • 結合skip connection
  • 將1*1的常規卷積改為group convolution
  • 加入channel shuffle操作,對通道進行打亂

小結

這幾篇算是壓縮網路結構的開山之作,而且後續也都推出了V2甚至更多的改進版本

個人認為其中最核心的思想,就是針對卷積操作的稀疏化,大多都是採用分組卷積的方式,深度可分離卷積可以看作是分組數最極端的情況;而同樣,分組卷積帶來的就是channel層面的信息流傳遞問題,再加入打亂通道的操作,一定程度上緩解了這個問題,這種shuffle的思想在MSRA提出的IGCV中也有體現。

之後會繼續整理相關的網路壓縮論文,包括其他方面的,還有這幾篇的後續改進。


未完待續

——2019年9月20日


推薦閱讀:
相關文章