卷積神經網路 CNN 的直覺觀念

參考:

https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53

解讀:

以下圖片中的 Hidden Layer 1 是遮罩,但是要還原成區塊圖形,必須看下一層的輸出值,而非單看遮罩。

舉例而言,下圖的遮罩是 X 狀,如果捲完後 3*3 的的第 (1,1) 那格是 4 ,那代表前一層 5*5 中的 [1..3, 1..3] 那一塊和 X 形狀的符合程度只有 4 (最強會是 7)。

假如捲完之後 (1,1) 那格是 7,那麼就代表前一層 5*5 中的 [1..3, 1..3] 那一塊和 X 形狀完全相符。

所以再看一次下列的圖片,假如輸入是 128*128 的圖片,而且遮罩是 9*9 的樣式,那麼其中的第一層 edge 是該遮罩形狀在某位置,例如 (1..9,1..9) 是否有輸出。

所以如果遮完後是 120*120,那麼其中 (1,1) 那格很強的話,就代表最左上角具有該形狀的圖樣。

所以上面的特徵 edges, combination of edges, object models 等都是遮罩的樣式沒錯,如果某一層的某個點輸出為《最強》 (這裡指的不是節點,而是輸出),我們可以還原回去原圖,會得到該原圖的對應位置出現一個該特徵的樣式。

以下是 ConvNetJs MNIST 的例子,可以看看他的遮罩是如何設計的:

其中第一個捲積層 Conv 為 5x5x1有八組遮罩 ( 所以參數 parameter 有8x5x5x1+8 = 208 個),第二個捲積層 Conv 5x5x8 有 16 組遮罩 (所以參數 parameter 有 16x5x5x8+16 = 3216 個)。

所以第一個捲積層代表的是某遮罩 (輸出代表某位置有該樣式),第二個捲積層就會變成這些這些樣式的組合 (其輸出就代表高層樣式),愈後面愈高層。

其中某個輸出很強,就代表該區域有發現該樣式 (或該區域與該樣式的符合程度很高)!

必須注意的是,CNN 神經網路的中間節點和遮罩大小與數量有關,但是和輸出的中間影像大小無關,但是輸出的中間影像中每一點,都代表著對應的區域是否有發現該遮罩 (或更高層遮罩) 的形狀。

所以只用 Hidden Layer 來看其實不太對,因為 Hidden Layer 是各種遮罩,但是其輸出卻是一種中間影像,所以下圖應該修改一下。

改成這樣

區分神經網路的節點 (遮罩) 與中間輸出所代表的意義,是理解 CNN 捲積神經網路的關鍵!

簡而言之,可以歸納為下列兩點:

  1. 遮罩 =樣式
  2. 中間影像的某個點 — 該位置有沒有那個樣式 (符合程度多高)

但這樣的解釋還有一個問題,就是第二層以後的遮罩 (combinations of edges, object models) 應該也只有小小的 5*5, 不應該會那麼大啊!

我認為要畫出第二層以後某節點的圖形,必須使用反傳遞演算法,將該節點的梯度先設為 -1,其他同層節點的梯度都設為 0,然後《啟動反傳遞計算》,反傳遞到輸入層時得到的值記下來,就會是上面所浮現的那些《鼻子、眼睛、人頭》等圖像了!

這樣那些特徵圖,就可能是更大區域的,例如第二層可能是 25*25 的範圍,第三層可能是 125*125 的範圍。

當然、以上是只考慮卷積層 CONV的狀況,通常還會有 RELU 與 Pool 層,所以反傳遞後的圖像大小,是一層一層回推放大的結果。

所以那些特徵圖,我認為是透過反傳遞回算到輸入層所得到的影像!

有人把這種特定節點反傳遞的結果畫成圖片展示,請參考以下文章:

補充:關於影像處理的遮罩效果,可以參考以下這篇:
https://www.html5rocks.com/en/tutorials/canvas/imagefilters/
您可以從中看到像是《銳化、模糊化、二值化、浮雕》等等遮罩效果。