轉自:極市平臺
來源:https://zhuanlan.zhihu.com/p/94477174
作者:akkaze-鄭安坤
本文來自知乎專欄,僅供學習參考使用,著作權歸作者所有。如有侵權,請私信刪除。
背景介紹
在常見的卷積神經網絡中,採樣幾乎無處不在,以前是max_pooling,現在是strided卷積。
以vgg網絡爲例,裏面使用到了相當多的max_pooling
同樣,在做語義分割或者目標檢測的時候,我們用到了相當多的上採樣,或者轉置卷積
以前,我們在分類網絡的最後幾層使用fc,後來fc被證明參數量太大泛化性能不好,被global average pooling替代掉了,最早出現在network in network中,
從此,分類網絡的範式變爲(Relu已經被隱式帶在了onv和deconv裏面),
Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->GAP-->Conv1x1-->Softmax-->Output
而分割網絡的範式變爲(最近的一些文章也在考慮用upsample+conv_1x1代替deconv),
Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Deconv_x_2-->Deconv_x_2-->Deconv_x_2-->Softmax-->Output
這裏暫時不考慮任何shortcut。
可是,我們不得不去想,下采樣,上採樣真的是必須的嗎?可不可能去掉呢?
空洞卷積和大卷積核的嘗試
一個很自然的想法,下采樣只是爲了減小計算量和增大感受野,如果沒有下采樣,要成倍增大感受野,只有兩個選擇,空洞卷積和大卷積核。所以,第一步,在cifar10的分類上,我嘗試去掉了下采樣,將卷積改爲空洞卷積,並且膨脹率分別遞增,模型結構如下所示,
這是一個典型的四層的VGG結構,每層卷積的dilation_rate分別爲1,2,4,8。在訓練了80個epoch後,測試集準確率曲線如下所示 ,
最終的準確率達到了76%,相同參數的vgg結構的卷積網絡能夠達到的準確率基本就在這附近。
從另一種思路出發,爲了擴大卷積的感受野,也可以直接增加捲積的kernel_size,與上面對比,保持dilationrate爲1不變,同時逐層增大卷積的kernel_size,分別爲3,5,7,9,訓練80個epoch後得到如下準確率曲線,
和之前改變dilation_rate的方式比較,收斂過程很一致,略微震盪一點,但是最終的結果很一致,都在76%上下,這說明影響最終精度的因素只有感受野和每層的通道數。
爲了說明下采樣在性能方面沒有提升,用有下采樣的網絡對對比。即在不修改其他任何參數的情況下,對原本使用dilation的卷積層使用下采樣,stride都設置爲2,同樣訓練80個epoch,收斂結果如下,
最終收斂到了73%上下,比上面兩個實驗低了大約3個點,這說明下采樣的信息損失確實不利於CNN的學習。
把三種參數的結果放在一起對比,更能夠說明問題,
爲了驗證這種想法的通用性,使用resnet18結構的網絡,並在原本需要下采樣的卷積層使用dilation_rate不斷增大的空洞卷積替代。訓練80個epoch後,最終得到的準確率曲線如下所示,
在沒有其他任何調參的情況下,最後收斂到了87%的準確率。
小卷積核的嘗試
我們知道,大卷積核的感受野通常可以通過疊加多個小卷積核得到,vggnet首先發現5x5卷積可以用兩個3x3卷積代替,極大減少了參數量。
同樣的7x7卷積可以用三個3x3卷積級聯,9x9可以用四個3x3卷積級聯。
爲了獲得和上面四層卷積網絡相同的感受野,我設計了一個十層的只有3x3卷積的網絡,每層之間依然有非線性。因爲層數多了很多,爲了確定中間層的通道數,我做了幾組實驗。同時,爲了不極大增加參數量,我又在卷積中間插入depthwise卷積,這樣保持對應感受野上的通道數不變,而參數量不至於增加很多。訓練結果,
可以看到,只有三個網絡結構在精度上優於之前的設計,而這三個網絡的參數量都是之前的數倍。使用depthwise卷積的網絡參數量並沒有增加太多,但是精度還是略低於之前的設計。
爲了說明問題,增加每層的通道數,比如之前16-32-48-64的設計,改爲64-128-256-512的設計,基本上對於這個深度的網絡來說,容量已經接近上界了,結果如下,
可以看到,空洞卷積網絡依然以較小的參數領先於depthwise卷積和3x3卷積混合網絡,並以數倍更少的參數優勢,在精度上略低於3x3級聯網絡。
這個實驗表明,對於CNN而言,深度之外,感受野以及該感受野上的通道數,真正決定了網絡的性能。
這和語音中的wavenet是相似的,
wavenet使用空洞因果卷積來降低計算量,原始wavenet的性能並沒有問題,但是計算量和參數量指數增長。
稀疏化方面的思考
小卷積核疊加和大卷積核的方法爲了獲得和空洞卷積相同的性能,付出了參數上的巨大代價,而空洞卷積本身是稀疏的(大多數元素都是0),這促使我們思考,是否可以用稀疏化解決參數巨大的問題。
CNN的稀疏化最近研究很多,一般的卷積稀疏化見下圖,並注意到每層卷積的卷積參數都是四維的,即輸入通道數,輸出通道數,x方向的卷積尺寸,y方向的卷積尺寸。
我們常見的其實是通道維度的稀疏化,這相當於減少通道數,也最容易加速,但是更有意義的稀疏化,我認爲是卷積核內部的稀疏化,如下圖所示,
這種稀疏化能減少參數量(因爲零值是沒有意義的),但是因爲不利於工程實現,所以目前沒有明顯的加速效果。
近期的研究表明,CNN裏大多數卷積核都是稀疏的,大約有50%以上都是稀疏的,也就是說有50%以上參數都是冗餘的。如果能去掉冗餘參數,那麼大卷積核和多層小卷積核也能證明在感受野和特定感受野上的通道數對CNN性能的決定性影響,在不增加額外模型參數的前提下。
儘管很容易預測,但是接下來,我們還會證明這兩種方法的參數冗餘。
10層3x3級聯網絡的可訓練參數量是86404,4層空洞卷積網絡參數量是25474,4層大卷積核網絡參數量是172930。使用tensorfllow內置的稀疏化功能,其官方github地址爲model_optimization,原理即在訓練過程中,按一定的準則將卷積核的一些元素置爲零,然後finetune。對於10層3x3級聯網絡,選擇稀疏率爲25%,這樣稀疏化後的參數量爲21601,對於大卷積核網絡,選擇常數稀疏率爲15%,稀疏化的參數量爲25940,這樣稀疏化後它們的參數都比空洞卷積網絡更少。爲保證網絡不會繼續收斂了,訓練1000個epoch,稀疏化從第200個epoch開始,稀疏化後的訓練結果如下所示,
可以明顯的看到稀疏化後的3x3級聯網絡的性能是最好的,同時它的參數也是最少的,同時大卷積核的性能次之,這個時候空洞卷積的性能反而略低。
保持同樣的參數和稀疏度,在cifar100上訓練的結果如下所示,
這個時候級聯3x3網絡的性能已經遠超其他兩個網絡了(對於cifar100上的baseline取多少合適,大家可以參閱一些文章或博客)。
稀疏化極限的思考
我們上面的討論基本就是,只要能保住某個感受野,稀疏化也是可行的,但是又不禁想知道稀疏化的極限在哪裏,對於3x3的卷積核,在保住感受野的情況下,最少必須有兩個非零元素,但是這樣一來卷積核就退化了,從各向同性退化爲各向異性,
學過線性代數的同學都知道,在二維線性空間至少有兩個基底向量,才能合成各種方向的梯度。如果卷積核退化成前面兩個的情況下,卷積核的二維性質也許就損失掉了,但是同一層中只要有多個卷積核具有不同的方向性,那麼這一層依然可能是各向同性的,方向性也許也是感受野的一個重要描述。關於感受野的方向性,一個來自視覺皮層實驗的啓示如下:
感受野的意義。只有大感受野才能感受到尺寸比較大的物體。感受野,深度和通道數,共同決定了cnn某一層的性能,一個衡量cnn性能的正確表述應該是網絡在某一層有多大的深度和感受野,同時有多少通道。深度決定了網絡的抽象能力或者說學習能力,感受野和通道決定了網絡學到了多少東西
maxpooling的額外討論
這促使我們思考,採樣真的是必要的嗎?當然,從工程的角度看,採樣能極大減小feature map的尺寸,從而大大降低計算量,但這個實驗表明,採樣對提高cnn的性能並沒有幫助,max pooling有抑制噪聲的作用,所以有用,但max pooling可以用不下采樣的方式實現,這和經典的中值濾波類似。
這也說明,cnn的每一層卷積都在編碼空間相關性,淺層特徵編碼短距離相關性,更深的卷積層編碼更遠距離的空間相關性,而到了某一層,再也沒有統計意義上的空間相關性了(這取決於有意義的物體在圖像中的尺寸),到這一層就可以用GAP聚合空間特徵了。
分割網絡的設計
在之前分類網絡的基礎上,去掉最後面的global average pooling和fully connected,換成conv1x1(相信很多人都知道,fc層形式上可以轉換成conv1x1,本以爲只是工程上的trick,沒想到有本質聯繫),直接變成分割網絡,在我製作的數據集m2nist上,訓練結果如下所示,
使用訓練好的模型進行預測,可視化後的結果如下:
後續討論,對網絡設計的可能影響
如果沒有了採樣層,分類網絡的範式將如下所示
Input-->Conv(dilate_rate=1)-->Conv(dilate_rate=2)-->Conv(dilate_rate=4)-->Conv(dilate_rate=8)-->GAP-->Conv1x1-->Softmax-->Output
分割網絡的範式將如下所示,
Input-->Conv(dilate_rate=1)-->Conv(dilate_rate=2)-->Conv(dilate_rate=4)-->Conv(dilate_rate=8)-->Conv(dilate_rate=16)-->Conv(dilate_rate=32)-->Softmax-->Output
不再有decoder階段,因爲到了decoder,上採樣只是爲了恢復分辨率,在無採樣的網絡結構裏,在最大感受野處,即之前加入global average pooling的地方可以直接接softmax進行pixel level的分類,這還需要更多實驗。
除此之外,在其他網絡中,在網絡的任何部分中,都可以使用沒有采樣的子網絡,比如hrnet的旁支網絡。
對跨層連接的思考
如果沒有了採樣,那麼所有feature map的分辨率都是一樣的,跨層連接也不會再區分bottom-up和up-bottom,所有的跨層連接本質上都是在融合不同感受野的特徵(這裏待議,bottom-up應該是在融合分辨率,常用在輸出側,up-bottom應該是在融合來自不同感受野的特徵,常用在特徵提取側,當沒有了分辨率的變換,bottom-up就不再被需要了)。
對目標檢測的可能影響
如果沒有了分辨率的變化,那麼檢測完全可以在網絡深層的某個感受野處叉開成爲三支,分別檢測大中小物體,這個思想和tridentnet有類似之處
據我所知,我是第一個提出能夠完全用dilated convolution結合global avergage pooling來實現圖像分類或者分割的,並注意到這種方法能夠帶來性能提升。 但是請意識到dilated convolution也不是必須,一個更大kernel size的卷積就可以替換它,但這勢必會引入更多參數,可能導致過擬合,當然這可以用稀疏化的辦法解決,但是稀疏卷積目前不適合工程化,因爲效率並不高。
類似的想法最早出現在deeplab的相關論文Rethinking Atrous Convolution for Semantic Image Segmentation中,這篇文章中,空洞卷積主要是通過移除網絡最後幾層的降採樣操作以及對應的濾波器核的上採樣操作,來提取更緊湊的特徵,並且不增加新的額外學習參數。
總結
雖然不利於加速,但是卷積核天生就應該是稀疏的,下采樣損失了分辨率,一定會損失精度。深度之外,只有感受野和與之對應的通道數最重要。
下圖即高斯核函數 在不同的 下的圖像
一句話說來,CNN一種利用卷積實現二維泛函空間到二維泛函空間映射的神經網絡。
以一維爲例,這就相當於把(-1,1)上的有界函數f映射到有界函數g的一個泛函:
爲什麼用卷積呢?衆所周知,卷積是最簡單的這樣一個泛函
並且它有着諸多良好的性質,最重要的是,卷積有平移不變性,
它也有縮放不變性,
它有結合率和交換率
所以對於任意一個算子φ ,cnn 的目的就是找到這樣一個 ,
但是直接尋找並不容易,那麼就用一系列卷積去逼近它,其中 在這裏是非線性激活函數,
那麼,cnn 的策略就很明顯了,通過擬合的方式,用一組卷積去逼近任意泛函(注意,這個時候縮放不變性被非線性激活破壞了)。
爲什麼使用小卷積核之狄拉克函數與高斯函數
我們知道狄拉克函數
它是一個廣義函數,也就是說不是普通意義上的函數,當高斯核函數的有效半徑無限趨近於 0 的時候,便得到了狄拉克函數。
它的卷積有如下性質:
這可以看成是 1x1 卷積,
它的 n 階導數有如下性質:
也就是說和它的 n 階導數做卷積便得到了自己的 n 階導數。
這個函數在應用中必定是實現不了的,但是讓我們來看看高斯函數,它的導數是什麼樣子,
可以看出來這些函數的有效半徑驚人的一致。如果使用這些函數,理論上可以使用卷積近似任意微分算子,而微分算子是性質非常好的線性算子。
所以,爲什麼使用小卷積核,因爲只有高斯函數的有效半徑趨近於 0 的時候,它才能近似狄拉克函數,它的導數才能近似於狄拉克函數的導數。
(小卷積核的意義待議,這裏提供另一個思考方式,因爲圖像不是普通函數,卷積在頻率空間變成乘法,小卷積核更容易產生高頻(類比高斯核函數),所以卷積後更容意放大高頻信息,(其實,這和上面的解釋並不完全衝突)使得高頻信息不容易被非線性的激活函數抹去,而高頻信息對於圖像來說,有非常重要的作用,比如說邊緣,比如說角點)。
稍大卷積核的意義
其實高斯核還有一個性質,與被高斯核作用後(相當於高斯平均)後求 n 階導數,相當於與高斯核的 n 階導數作卷積,也就是說,
同時,高斯核還有以下性質:
所以,我們有高斯核作爲基底向量,有
這樣求相當與求解一系列線性係數 ,請自行將 對應到卷積核大小上
那麼這樣稍大卷積核的意義就是變換在高斯平均後的空間裏的微分算子,而且卷積核越大,這個平滑效應越強。
而在圖像領域,因爲計算機和信息論離散化的表現形式,我們使用採樣和量化來處理它,並以此減少計算量
請持續關注本文的源代碼 github 倉庫,鏈接:https://github.com/akkaze/cnn-without-any-downsampling
ⓝ
MaiweiE-com|WeChat ID:Yida_Zhang2
推薦閱讀(點擊標題可跳轉閱讀)
[2] 一文弄懂神經網絡中的反向傳播法——Back Propagation
[3] 卷積神經網絡中十大拍案叫絕的操作
[4] 武漢的櫻花開了!出不了門別擔心,線上帶你開櫻花![Python畫櫻花]
關注公衆號邁微電子研發社,文章首發與公衆號。
知識星球:社羣旨在分享AI算法崗的秋招/春招準備攻略(含刷題)、面經和內推機會、學習路線、知識題庫等。