反捲積(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的輸入輸出關係爲:
參考
Is the deconvolution layer the same as a convolutional layer?