如何理解空洞卷積(dilated convolution)

論文:Multi-scale context aggregation with dilated convolutions

簡單討論下dilated conv,中文可以叫做空洞卷積或者擴張卷積。首先介紹一下dilated conv誕生背景[4],再解釋dilated conv操作本身,以及應用。

首先是誕生背景,在圖像分割領域,圖像輸入到CNN(典型的網絡比如FCN[3])中,FCN先像傳統的CNN那樣對圖像做卷積再pooling,降低圖像尺寸的同時增大感受野,但是由於圖像分割預測是pixel-wise的輸出,所以要將pooling後較小的圖像尺寸upsampling到原始的圖像尺寸進行預測(upsampling一般採用deconv反捲積操作,deconv可參見知乎答案如何理解深度學習中的deconvolution networks?),之前的pooling操作使得每個pixel預測都能看到較大感受野信息。因此圖像分割FCN中有兩個關鍵,一個是pooling減小圖像尺寸增大感受野,另一個是upsampling擴大圖像尺寸。在先減小再增大尺寸的過程中,肯定有一些信息損失掉了,那麼能不能設計一種新的操作,不通過pooling也能有較大的感受野看到更多的信息呢?答案就是dilated conv。

下面看一下dilated conv原始論文[4]中的示意圖:

<img src="https://pic2.zhimg.com/50/v2-b448e1e8b5bbf7ace5f14c6c4d44c44e_hd.jpg" data-rawwidth="1269" data-rawheight="453" class="origin_image zh-lightbox-thumb" width="1269" data-original="https://pic2.zhimg.com/v2-b448e1e8b5bbf7ace5f14c6c4d44c44e_r.jpg">

(a)圖對應3x3的1-dilated conv,和普通的卷積操作一樣,(b)圖對應3x3的2-dilated conv,實際的卷積kernel size還是3x3,但是空洞爲1,也就是對於一個7x7的圖像patch,只有9個紅色的點和3x3的kernel發生卷積操作,其餘的點略過。也可以理解爲kernel的size爲7x7,但是隻有圖中的9個點的權重不爲0,其餘都爲0。 可以看到雖然kernel size只有3x3,但是這個卷積的感受野已經增大到了7x7(如果考慮到這個2-dilated conv的前一層是一個1-dilated conv的話,那麼每個紅點就是1-dilated的卷積輸出,所以感受野爲3x3,所以1-dilated和2-dilated合起來就能達到7x7的conv),(c)圖是4-dilated conv操作,同理跟在兩個1-dilated和2-dilated conv的後面,能達到15x15的感受野。對比傳統的conv操作,3層3x3的卷積加起來,stride爲1的話,只能達到(kernel-1)*layer+1=7的感受野,也就是和層數layer成線性關係,而dilated conv的感受野是指數級的增長。

dilated的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大範圍的信息。在圖像需要全局信息或者語音文本需要較長的sequence信息依賴的問題中,都能很好的應用dilated conv,比如圖像分割[3]、語音合成WaveNet[2]、機器翻譯ByteNet[1]中。簡單貼下ByteNet和WaveNet用到的dilated conv結構,可以更形象的瞭解dilated conv本身。

ByteNet

<img src="https://pic3.zhimg.com/50/v2-036913d7176af92daffcd60698751397_hd.jpg" data-rawwidth="869" data-rawheight="720" class="origin_image zh-lightbox-thumb" width="869" data-original="https://pic3.zhimg.com/v2-036913d7176af92daffcd60698751397_r.jpg">

WaveNet

<img src="https://pic3.zhimg.com/50/v2-e366fd287082211f1ac4a0fbbf35e3a1_hd.jpg" data-rawwidth="1065" data-rawheight="359" class="origin_image zh-lightbox-thumb" width="1065" data-original="https://pic3.zhimg.com/v2-e366fd287082211f1ac4a0fbbf35e3a1_r.jpg">

下面再闡述下deconv和dilated conv的區別:

deconv的具體解釋可參見如何理解深度學習中的deconvolution networks?,deconv的其中一個用途是做upsampling,即增大圖像尺寸。而dilated conv並不是做upsampling,而是增大感受野。

可以形象的做個解釋:

對於標準的k*k卷積操作,stride爲s,分三種情況:

(1) s>1,即卷積的同時做了downsampling,卷積後圖像尺寸減小;

(2) s=1,普通的步長爲1的卷積,比如在tensorflow中設置padding=SAME的話,卷積的圖像輸入和輸出有相同的尺寸大小;

(3) 0<s<1,fractionally strided convolution,相當於對圖像做upsampling。比如s=0.5時,意味着在圖像每個像素之間padding一個空白的像素後,stride改爲1做卷積,得到的feature map尺寸增大一倍。

而dilated conv不是在像素之間padding空白的像素,而是在已有的像素上,skip掉一些像素,或者輸入不變,對conv的kernel參數中插一些0的weight,達到一次卷積看到的空間範圍變大的目的。

當然將普通的卷積stride步長設爲大於1,也會達到增加感受野的效果,但是stride大於1就會導致downsampling,圖像尺寸變小。大家可以從以上理解到deconv,dilated conv,pooling/downsampling,upsampling之間的聯繫與區別,歡迎留言溝通交流。


[1] Kalchbrenner, Nal, et al. "Neural machine translation in linear time." arXiv preprint arXiv:1610.10099 (2016).

[2] Oord, Aaron van den, et al. "Wavenet: A generative model for raw audio." arXiv preprint arXiv:1609.03499 (2016).

[3] Long J, Shelhamer E, Darrell T, et al. Fully convolutional networks for semantic segmentation[C]. Computer Vision and Pattern Recognition, 2015.

[4] Yu, Fisher, and Vladlen Koltun. "Multi-scale context aggregation by dilated convolutions." arXiv preprint arXiv:1511.07122 (2015).

作者:譚旭

鏈接:https://www.zhihu.com/question/54149221/answer/192025860


####################################################################################

Dilated/Atrous Convolution 或者是 Convolution with holes 從字面上就很好理解,是在標準的 convolution map 裏注入空洞,以此來增加 reception field。相比原來的正常convolution,dilated convolution 多了一個 hyper-parameter 稱之爲 dilation rate 指的是kernel的間隔數量(e.g. 正常的 convolution 是 dilatation rate 1)。

一個簡單的例子:

&amp;lt;img data-rawheight=&quot;381&quot; src=&quot;https://pic3.zhimg.com/50/v2-d552433faa8363df84c53b905443a556_hd.gif&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;395&quot; data-thumbnail=&quot;https://pic3.zhimg.com/50/v2-d552433faa8363df84c53b905443a556_hd.jpg&quot; class=&quot;content_image&quot; width=&quot;395&quot;&amp;gt;
Standard Convolution with a 3 x 3 kernel (and padding)
&amp;lt;img data-rawheight=&quot;381&quot; src=&quot;https://pic1.zhimg.com/50/v2-4959201e816888c6648f2e78cccfd253_hd.gif&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;395&quot; data-thumbnail=&quot;https://pic1.zhimg.com/50/v2-4959201e816888c6648f2e78cccfd253_hd.jpg&quot; class=&quot;content_image&quot; width=&quot;395&quot;&amp;gt;
Dilated Convolution with a 3 x 3 kernel and dilation rate 2

不過光理解他的工作原理還是遠遠不夠的,要充分理解這個概念我們得重新審視卷積本身,並去了解他背後的設計直覺。以下主要討論 dilated convolution 在語義分割 (semantic segmentation) 的應用。

重新思考卷積: Rethinking Convolution

在贏得其中一屆ImageNet比賽裏VGG網絡的文章中,他最大的貢獻並不是VGG網絡本身,而是他對於卷積疊加的一個巧妙觀察。

This (stack of three 3 × 3 conv layers) can be seen as imposing a regularisation on the 7 × 7 conv. filters, forcing them to have a decomposition through the 3 × 3 filters (with non-linearity injected in between).

這裏意思是 7 x 7 的卷積層可以看做 3 個 3 x 3 的卷積層的疊加後的正則。而這樣的設計不僅可以大幅度的減少參數,其本身帶有正則性質的 convolution map 能夠更容易學一個 generlisable, expressive feature space。這也是現在絕大部分基於卷積的深層網絡都在用小卷積核的原因。

&amp;lt;img data-rawheight=&quot;618&quot; src=&quot;https://pic1.zhimg.com/50/v2-ee6f0084ca22aa8dc3138462ee4c24df_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1422&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1422&quot; data-original=&quot;https://pic1.zhimg.com/v2-ee6f0084ca22aa8dc3138462ee4c24df_r.jpg&quot;&amp;gt;

然而 Deep CNN 對於其他任務還有一些致命性的缺陷。較爲著名的是 up-sampling 和 pooling layer 的設計。這個在 Hinton 的演講裏也一直提到過。

主要問題有:

  1. Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. not learnable)
  2. 內部數據結構丟失;空間層級化信息丟失。
  3. 小物體信息無法重建 (假設有四個pooling layer 則 任何小於 2^4 = 16 pixel 的物體信息將理論上無法重建。)

在這樣問題的存在下,語義分割問題一直處在瓶頸期無法再明顯提高精度, 而 dilated convolution 的設計就良好的避免了這些問題。

空洞卷積的拯救之路:Dilated Convolution to the Rescue

題主提到的這篇文章 MULTI-SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS 可能(?) 是第一篇嘗試用 dilated convolution 做語義分割的文章。後續圖森組和 Google Brain 都對於 dilated convolution 有着更細節的討論,推薦閱讀:Understanding Convolution for Semantic Segmentation Rethinking Atrous Convolution for Semantic Image Segmentation

對於 dilated convolution, 我們已經可以發現他的優點,即內部數據結構的保留和避免使用 down-sampling 這樣的特性。但是完全基於 dilated convolution 的結構如何設計則是一個新的問題。

潛在問題 1:The Gridding Effect

假設我們僅僅多次疊加 dilation rate 2 的 3 x 3 kernel 的話,則會出現這個問題:

&amp;lt;img data-rawheight=&quot;370&quot; src=&quot;https://pic1.zhimg.com/50/v2-478a6b82e1508a147712af63d6472d9a_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1154&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1154&quot; data-original=&quot;https://pic1.zhimg.com/v2-478a6b82e1508a147712af63d6472d9a_r.jpg&quot;&amp;gt;

我們發現我們的 kernel 並不連續,也就是並不是所有的 pixel 都用來計算了,因此這裏將信息看做 checker-board 的方式會損失信息的連續性。這對 pixel-level dense prediction 的任務來說是致命的。

潛在問題 2:Long-ranged information might be not relevant.

我們從 dilated convolution 的設計背景來看就能推測出這樣的設計是用來獲取 long-ranged information。然而光采用大 dilation rate 的信息或許只對一些大物體分割有效果,而對小物體來說可能則有弊無利了。如何同時處理不同大小的物體的關係,則是設計好 dilated convolution 網絡的關鍵。

通向標準化設計:Hybrid Dilated Convolution (HDC)

對於上個 section 裏提到的幾個問題,圖森組的文章對其提出了較好的解決的方法。他們設計了一個稱之爲 HDC 的設計結構。

第一個特性是,疊加捲積的 dilation rate 不能有大於1的公約數。比如 [2, 4, 6] 則不是一個好的三層卷積,依然會出現 gridding effect。

第二個特性是,我們將 dilation rate 設計成 鋸齒狀結構,例如 [1, 2, 5, 1, 2, 5] 循環結構。

第三個特性是,我們需要滿足一下這個式子: M_i=\max[M_{i+1}-2r_i,M_{i+1}-2(M_{i+1}-r_i),r_i]

其中 r_i 是 i 層的 dilation rate 而 M_i 是指在 i 層的最大dilation rate,那麼假設總共有n層的話,默認 M_n=r_n 。假設我們應用於 kernel 爲 k x k 的話,我們的目標則是 M_2 \leq k ,這樣我們至少可以用 dilation rate 1 即 standard convolution 的方式來覆蓋掉所有洞。

一個簡單的例子: dilation rate [1, 2, 5] with 3 x 3 kernel (可行的方案)

&amp;lt;img data-rawheight=&quot;612&quot; src=&quot;https://pic1.zhimg.com/50/v2-3e1055241ad089fd5da18463903616cc_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1766&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1766&quot; data-original=&quot;https://pic1.zhimg.com/v2-3e1055241ad089fd5da18463903616cc_r.jpg&quot;&amp;gt;

而這樣的鋸齒狀本身的性質就比較好的來同時滿足小物體大物體的分割要求(小 dilation rate 來關心近距離信息,大 dilation rate 來關心遠距離信息)。

這樣我們的卷積依然是連續的也就依然能滿足VGG組觀察的結論,大卷積是由小卷積的 regularisation 的 疊加。

以下的對比實驗可以明顯看出,一個良好設計的 dilated convolution 網絡能夠有效避免 gridding effect.

&amp;lt;img data-rawheight=&quot;688&quot; src=&quot;https://pic4.zhimg.com/50/v2-b2b6f12a4c3d244c4bc7eb33814a1f0d_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1448&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1448&quot; data-original=&quot;https://pic4.zhimg.com/v2-b2b6f12a4c3d244c4bc7eb33814a1f0d_r.jpg&quot;&amp;gt;

多尺度分割的另類解:Atrous Spatial Pyramid Pooling (ASPP)

在處理多尺度物體分割時,我們通常會有以下幾種方式來操作:

&amp;lt;img data-rawheight=&quot;440&quot; src=&quot;https://pic4.zhimg.com/50/v2-0510889deee92f6290b5a43b6058346d_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1664&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1664&quot; data-original=&quot;https://pic4.zhimg.com/v2-0510889deee92f6290b5a43b6058346d_r.jpg&quot;&amp;gt;

然僅僅(在一個卷積分支網絡下)使用 dilated convolution 去抓取多尺度物體是一個不正統的方法。比方說,我們用一個 HDC 的方法來獲取一個大(近)車輛的信息,然而對於一個小(遠)車輛的信息都不再受用。假設我們再去用小 dilated convolution 的方法重新獲取小車輛的信息,則這麼做非常的冗餘。

基於港中文和商湯組的 PSPNet 裏的 Pooling module (其網絡同樣獲得當年的SOTA結果),ASPP 則在網絡 decoder 上對於不同尺度上用不同大小的 dilation rate 來抓去多尺度信息,每個尺度則爲一個獨立的分支,在網絡最後把他合併起來再接一個卷積層輸出預測 label。這樣的設計則有效避免了在 encoder 上冗餘的信息的獲取,直接關注與物體之間之內的相關性。

總結

Dilated Convolution 個人認爲想法簡單,直接且優雅,並取得了相當不錯的效果提升。他起源於語義分割,大部分文章也用於語義分割,具體能否對其他應用有價值姑且還不知道,但確實是一個不錯的探究方向。有另外的答主提到WaveNet, ByteNet 也用到了 dilated convolution 確實是一個很有趣的發現,因爲本身 sequence-to-sequence learning 也是一個需要關注多尺度關係的問題。則在 sequence-to-sequence learning 如何實現,如何設計,跟分割或其他應用的關聯是我們可以重新需要考慮的問題。

作者:劉詩昆

鏈接:https://www.zhihu.com/question/54149221/answer/323880412


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章