1. 程式人生 > >【AI數學】反捲積(deconvolution)

【AI數學】反捲積(deconvolution)

前言

卷積操作是影象處理中最常見的計算之一了,我們知道卷積可以除了可以提取影象特徵之外,最大的作用之一就是降維(這裡的維度是指資料的維度,不是指影象的維度)。比如,我們把卷積的步長設定為(2,2),那麼卷積操作會使得輸出特徵圖尺寸變為輸入特徵圖尺寸的四分之一。

反捲積和卷積相反,可以進行升維操作。目前,分割演算法,生成演算法等都要用到升維操作,這便導致了反捲積的使用越來越多。

這裡最直觀的例子就是自動編碼器,編碼過程就是一個降維過程,這一過程可以由卷積實現。解碼過程相當於升維過程,這一過程可以用反捲積實現。


卷積與反捲積

                                                                                      圖1 卷積操作 

上圖是用一個3x3的kernel來卷積4x4的feature,最後的輸出是2x2。這就是卷積最基本的操作,我們知道卷積還有其他引數需要說明,比如:步長多大,padding為幾等等。我們先就以最簡單的步長為1,padding為valid(即0)來討論。對於這麼一個卷積過程的反捲積操作如下:

                                                                        圖2 反捲積操作 

成功的通過反捲積的操作將2x2的feature還原成了4x4的feature。從直觀上來看,卷積和反捲積可以看作尺寸上的反變換。 我們可以看到,反捲積也是一種特殊的卷積。

我們常見的卷積模式有三種:valid, same, full.詳情可見文章《卷積的三種模式》。

其實這裡會有一個明顯的誤導資訊,很容易將反捲積理解成full模式的卷積。事實上是有差別的,反捲積並非等價於full模式的卷積。意思是,卷積核引數的位置並非相同。

反捲積有叫做transposed convolution,即轉置卷積。我們從數學的角度來看,這個轉置體現在哪裡。

現在開始說明:A為原圖,即4x4大小。C為卷積核,即3x3大小。B為輸出feature,即2x2大小。對應上圖。

第一步,將4x4的A拉直,變成16x1的向量A`。

第二步,把3x3的C拉直,放到16x1的全零向量裡面,對應位置改成權值。那麼C變成了,含有9個權值和7個0構成的16x1向量。

那麼每次卷積操作都對應兩個16x1的向量的點乘。我們看C的轉置:

C變成了一個4x16的矩陣,每個長度為16的列和A`進行點乘就是一次卷積,輸出一個值。對於卷積的公式:

                                                                        C\cdot A = B

用矩陣乘法的知識可以知道,(4, 16)乘以(16, 1)的輸出為(4,1)。

我們如果進行反捲積,可以看公式:

                                                                          C^{T}\cdot B = A

C的轉置是16x4,B是4x1,相乘得到的結果就是16x1。

所以,反捲積的轉置體現在了這裡。


步長大於1的情況 

步長大於1的情況在反捲積的用法裡佔大多數情況。因為卷積的步長可以對特徵圖進行尺寸變換,尺寸變換就相當於壓縮解壓操作。對於卷積,

對於反捲積:

反捲積其實還有另外一個名字,叫做 Fractionally Strided Convolution, 碎步卷積。小碎步跺起來。

把輸入稀疏化以後,相當於原來的卷積步長小於1。就相當於一個碎步。


總結 

嚴格來講,反捲積和卷積之間有引數對應關係。不過現在對反捲積的廣義用法,其實早已脫離了反捲積的定義限制了。現在的反捲積,尤其是出現在自編碼器等的反捲積,就是對卷積的高階用法而已,無須考慮和卷積引數位置有對應。

參考:https://github.com/vdumoulin/conv_arithmetic

參考:https://buptldy.github.io/2016/10/29/2016-10-29-deconv/

參考:https://blog.csdn.net/panglinzhuo/article/details/75207855