【神經網絡與深度學習】卷積與反捲積

這裏寫圖片描述 

1. 卷積與反捲積

如上圖演示了卷積核反捲積的過程,定義輸入矩陣爲 ),卷積核爲 ),輸出矩陣爲 ):

  • 卷積的過程爲:
  • 反捲積的過稱爲:(需要對此時的  的邊緣進行延拓 padding

2. 步長與重疊

卷積核移動的步長(stride)小於卷積核的邊長(一般爲正方行)時,變會出現卷積核與原始輸入矩陣作用範圍在區域上的重疊(overlap),卷積核移動的步長(stride)與卷積核的邊長相一致時,不會出現重疊現象。

 的輸入矩陣 和  的卷積核

  • 在步長(stride)爲 1 時,輸出的大小爲 

現考慮其逆問題,原始輸入矩陣爲多大時,其與  的卷積核 相卷積得到的輸出矩陣的大小爲 

  • 步長(stride)爲 1 時, 

搞明白了卷積網絡中所謂deconv到底是個什麼東西后,不寫下來怕又忘記,根據參考資料,加上我自己的理解,記錄在這篇博客裏。

先來規範表達

  • 爲了方便理解,本文出現的舉例情況都是2D矩陣卷積,卷積輸入和核形狀都爲正方形,x和y軸方向的padding相同,stride也相同。
  • 記號: 
     分別表示:卷積/反捲積的輸入大小,卷積/反捲積輸出大小,卷積/反捲積核大小 。
  • 舉例(如下左圖): 
    輸入矩陣,卷積核的情況下,卷積的輸出,就記爲 。

推翻錯誤的理解

第一次看到deconv這個詞,以爲deconv的結果就是卷積的逆,覺得神奇,不禁產生了「哦?轉置的卷積就可以求逆了嗎?」這樣的想法,然後在matlab裏面實驗求證,我還記得當時以爲反捲積能夠求逆,考慮到圖片進行常規卷積操作輸出大小又不可能變大(same/valid),於是我還假設反捲積輸出大小不變,用了same padding和原核的轉置作爲反捲積配置,結果發現根本不是那麼一回事好嗎。 
其實DL中的deconv,是一種上採樣過程,舉個比方:輸入矩陣,卷積核的情況下(如下左圖),卷積的輸出。對進行deconv,它只能做到把還原輸出大小到和一樣大,輸出值和有那麼一點聯繫。 
所以啊deconv這個名字相當誤導人吶!這在cs231n課程裏也被吐槽過,大家現在更喜歡用transposed conv來表述反捲積。爲了方便起見,後文就用反捲積這個詞了。

第二個容易confused的地方,就是很多文章都說卷積核的轉置就可以求反捲積,又陷入迷茫「就算把卷積核轉置(或者左右翻轉上下翻轉),卷積後輸出還是越來越小(或不變,至少不會增大)啊」……直到看到文獻和相應的這個動畫(其他動畫在github-convolution arithmetic1

卷積 $\ padding=0,stride=1$ 反捲積$\ padding=0,stride=1$
卷積  反捲積

注意圖中藍色(下面)是輸入,綠色(上面)是輸出,卷積和反捲積在等參數一樣時,是相當於 和 調了個位。 
這裏說明了反捲積的時候,是有補0的,即使人家管這叫no padding),這是因爲卷積的時候從藍色 縮小爲綠色,所以對應的 反捲積應該從藍色 擴展成綠色。而且轉置並不是指這個 的核 變爲,但如果將卷積計算寫成矩陣乘法(在程序中,爲了提高卷積操作的效率,就可以這麼幹,比如tensorflow中就是這種實現),(其中 表示將 拉成一維向量, 同理),那麼反捲積確實可以表示爲,而這樣的矩陣乘法,恰恰等於 左右翻轉再上下翻轉後與補0的 卷積的情況。

然後就產生了第三個confuse:「補0了會不會有影響,還能通過反捲積近似輸入 嗎?」其實反捲積也不一定能達到近似的效果,圖像裏的卷積,相當於一種相關操作,而反捲積維持了這種相關操作時的 與、與 之間的聯繫維持了。至於補0後操作是否還等價,上一段已經說明了是等價的,讀者可以在閱讀完後面的文章後自己嘗試一下。


反捲積以及反向傳播的過程

卷積和反捲積的過程在arXiv-A guide to convolution arithmetic for deep learning2寫的非常詳細,還有很多例子便於理解,在這裏我就截圖出重點來(ps.文中的figure2.1就是上圖的左邊)。剩下的例子請大家多看看原文,最好自己動手算一下,我也貼個我算的過程( 表示矩陣 的第 行),供參考。 
關於反向傳播, 知乎-如何理解深度學習中的deconvolution networks3有詳細的推導過程。 
這裏寫圖片描述 
這裏寫圖片描述
這裏寫圖片描述 
這裏寫圖片描述 
這裏寫圖片描述


參考資料

Transposed Convolution, Fractionally Strided Convolution or Deconvolution






反捲積(Deconvolution)的概念第一次出現是Zeiler在2010年發表的論文 Deconvolutional networks中,但是並沒有指定反捲積這個名字,反捲積這個術語正式的使用是在其之後的工作中( Adaptive deconvolutional networks for mid and high level feature learning)。隨着反捲積在神經網絡可視化上的成功應用,其被越來越多的工作所採納比如:場景分割、生成模型等。其中反捲積(Deconvolution)也有很多其他的叫法,比如:Transposed Convolution,Fractional Strided Convolution等等。

這篇文章的目的主要有兩方面:
1. 解釋卷積層和反捲積層之間的關係;
2. 弄清楚反捲積層輸入特徵大小和輸出特徵大小之間的關係。

## 卷積層

卷積層大家應該都很熟悉了,爲了方便說明,定義如下:
- 二維的離散卷積()
- 方形的特徵輸入()
- 方形的卷積核尺寸()
- 每個維度相同的步長()
- 每個維度相同的padding ()

下圖表示參數爲  的卷積計算過程,從計算結果可以看出輸出特徵的尺寸爲 。


下圖表示參數爲  的卷積計算過程,從計算結果可以看出輸出特徵的尺寸爲 。



從上述兩個例子我們可以總結出卷積層輸入特徵與輸出特徵尺寸和卷積核參數的關係爲:


其中  表示對  向下取整。

反捲積層

在介紹反捲積之前,我們先來看看卷積運算和矩陣運算之間的關係。

卷積和矩陣相乘

考慮如下一個簡單的卷積層運算,其參數爲 ,輸出 。



對於上述卷積運算,我們把上圖所示的3×3卷積核展成一個如下所示的[4,16]的稀疏矩陣 , 其中非0元素  表示卷積核的第  行和第  列。

我們再把4×4的輸入特徵展成[16,1]的矩陣 ,那麼  則是一個[4,1]的輸出特徵矩陣,把它重新排列2×2的輸出特徵就得到最終的結果,從上述分析可以看出卷積層的計算其實是可以轉化成矩陣相乘的。值得注意的是,在一些深度學習網絡的開源框架中並不是通過這種這個轉換方法來計算卷積的,因爲這個轉換會存在很多無用的0乘操作,Caffe中具體實現卷積計算的方法可參考Implementing convolution as a matrix multiplication

通過上述的分析,我們已經知道卷積層的前向操作可以表示爲和矩陣相乘,那麼 我們很容易得到卷積層的反向傳播就是和的轉置相乘

反捲積和卷積的關係

全面我們已經說過反捲積又被稱爲Transposed(轉置) Convolution,我們可以看出其實卷積層的前向傳播過程就是反捲積層的反向傳播過程,卷積層的反向傳播過程就是反捲積層的前向傳播過程。因爲卷積層的前向反向計算分別爲乘  和 ,而反捲積層的前向反向計算分別爲乘  和  ,所以它們的前向傳播和反向傳播剛好交換過來。

下圖表示一個和上圖卷積計算對應的反捲積操作,其中他們的輸入輸出關係正好相反。如果不考慮通道以卷積運算的反向運算來計算反捲積運算的話,我們還可以通過離散卷積的方法來求反捲積(這裏只是爲了說明,實際工作中不會這麼做)。

同樣爲了說明,定義反捲積操作參數如下:

  • 二維的離散卷積()
  • 方形的特徵輸入()
  • 方形的卷積核尺寸()
  • 每個維度相同的步長()
  • 每個維度相同的padding ()

下圖表示的是參數爲( )的反捲積操作,其對應的卷積操作參數爲 。我們可以發現對應的卷積和非卷積操作其 ,但是反捲積卻多了。通過對比我們可以發現卷積層中左上角的輸入只對左上角的輸出有貢獻,所以反捲積層會出現 。通過示意圖,我們可以發現,反捲積層的輸入輸出在  的情況下關係爲:



Fractionally Strided Convolution

上面也提到過反捲積有時候也被叫做Fractionally Strided Convolution,翻譯過來大概意思就是小數步長的卷積。對於步長 的卷積,我們可能會想到其對應的反捲積步長 。 如下圖所示爲一個參數爲 的卷積操作(就是第一張圖所演示的)所對應的反捲積操作。對於反捲積操作的小數步長我們可以理解爲:在其輸入特徵單元之間插入  個0,插入0後把其看出是新的特徵輸入,然後此時步長  不再是小數而是爲1。因此,結合上面所得到的結論,我們可以得出Fractionally Strided Convolution的輸入輸出關係爲:



參考

conv_arithmetic

Is the deconvolution layer the same as a convolutional layer?