2019/1/1

Convolutional Neural Network (CNN) 原理

23 Convolutional Neural Network (CNN) 原理

🔶 Convolution operation (摺積操作)
Convolutional Neural Network (摺積神經網路 ) 指的是在神經網路中至少有一層的神經元使用摺積 (Convolution)操作。Convolution 的中文翻譯除摺積外,還有迴旋、卷積等,但我認為還是用摺積好。在電機領域裡的「訊號與系統」中,摺積是指將一個訊號輸入到一個系統的操作,假設訊號是$s(t)$,系統的脈衝響應是$h(t)$,所得的輸出訊號$y(t)$就是$s(t)$ 和 $h(t)$的摺積,數學表示是
$$ y(t)=\int_{\tau=- \infty }^{\infty }s(\tau -t)h(\tau)d\tau$$ $$\: \: \: \: \: =\int_{\tau=-\infty }^{\infty }s(\tau )h(\tau-t)d\tau$$ 其中可見摺積的操作主要是先將兩函數之任一個反摺,之後再求積分,也因而叫摺積。

在深度學習的領域對摺積的操作稍有不同,因處理的樣本並非連續的時間函數,而是離散的空間函數,所以就將相乘積分用相乘連加(summation)取代,而離散訊號的相乘連加就是求訊號的 cross-correlation (互相關性)。另一個不同是時間訊號需將兩函數之任一反摺,這反摺對圖片就是 flip (翻轉),但因在深度學習中反摺後再求相關性和不反摺直接求相關性意義上是等效的,因我們可以想像套用求互相關性的圖片已先經過反摺了,所以在影像處理或是深度學習的領域裡,摺積就是簡單的求互相關性。

以影像處理的應用為例,樣本的圖像是個較大的圖,求摺積時是以一稱為核 (kernel) 的較小圖去和樣本圖求互相關性,以核在樣本圖的空間中先由左到右,再由上至下滑動 (slide) 求相關性,核每滑動一次就產生一個輸出,而輸出的總數可以和原樣本圖一樣,也可以是較小的圖,取決於摺積的操作參數,如核尺度的大小、是不是有在原樣本圖的周圍添加 0 (zero-padding)以及每次滑動的步長 (stride) 大小等。

🔶 CNN 的特性
CNN在深度學習裡常用於影像辨識和自然語言處理(Natural language processing),我們先來討影像辨識的問題。先來看看CNN有那些特性使其能成功地應用於影像辨識?

►階層式特徵攫取
一個 CNN 一般由多個神經元層組成,每一層通常含有很多並列的神經元,神經元的數目就是該層的尺度,由最接近輸入層的底層開始,每一層職司某一特定的學習功能,如最底層負責學習攫取基本的特徵,如邊緣、直線、轉角等,再上一層再由底層的輸出中攫取較高階的特徵,如形狀等區塊(blob) ,更上一層再由下層輸出的不同區塊組成更高階的物件,如臉、桌子、車子等,如此便可用於物體的辨識。

► Local invariance and compositionality
Local invariance (位置無關) 是指關注的特徵不管出現在圖像的任何位置均可被偵測出來,亦即將圖片旋轉某角度後對偵測的結果還是不變,此特性在物體辨識的應用中相當重要,因我們事先並不知某特徵會出現在圖片的那一位置。在每一層中均有很多並列的kernels,可以想像每kernel 負責偵測一種特徵,所以不管特徵出現在任何位置均會被某一kernel 偵測出來,也因要實現此一特性,CNN中每一摺積層才會有很多 kernels 並列。 Compositionality 是指複合性,也就是先前函數的輸出是下一級函數的輸入,數學上可表示成如$f(g(h(x)))$的函數操作,也因有此一特性才能實現階層式特徵攫取。

► 權重係數共用和濾波器學習
摺積操作的核有時又稱filter (濾波器),而每個 filter 有很多係數,在一般的影像處理中,如 blurring (模糊化) 、smoothing (平滑化)等都是用事先設定的係數加作用 (apply) 到圖像中以得到特定的效果,但在深度學習中作法的觀念是相反的,也就是先有結果,再求濾波器的係數。我們先有想要輸出,這輸出就是放於輸出層用於 loss function 中求loss 的目標值,再透過學習求出每個filter 的係數,這也就是濾波器學習。每個filter的係數是用於和輸入圖像求互相關性,這些係數值在滑動的過程中是共用的,這種方式就稱為權重係數共用。

► Local receptive field (區域接受場)
因 kernel的尺度小於樣本圖的尺度,所以kernel每次僅作用於大圖像裡的一個小的區域,此區域就稱區域接受場。一般的彩色影像會是寬、高、深度的三維空間,區域接受場指的是在寬和高的2D平面上的區域,但對深度(有時又稱channel 或volume)則採取全連接的方式。例如有 kernel 的尺度是$3\times 3$,當作用到一個$32\times 32 \times 3$的影像時,所需的weights 是$3\times 3 \times 3 +1$,最後的$+1$是偏置的權重。另一個在CNN中需特別注意的是深度(depth)在輸入層是指輸入圖層的色彩空間,如RGB就是3,但在前一級非輸入層時是指上層的kernel的數目 ,就是有多少kernel並列於一層中。

► 作動圖 (activation map)
作動圖是指經過將輸入和kernel 摺積操作後的輸出圖像,一般每一層會有很多核,所以也會有很多作動圖輸出,而前一級輸出的作動圖再加到下一級做為輸入,直至輸出層取出最終的輸出。

🔶 CNN 各層和實例
► Convolutional layer (摺積層)
摺積層是CNN最重的層,有所謂的conv-1D, conv-2D 和conv-3D,當然最常用的就2D摺積。

► Pooling Layer (池化層)
池化層可用於降低維度,是利用框框像摺積一樣在樣本圖上移動,每次框住某幾個位置上的pixel,並將之濃縮成一個放進「池」內,池裡的pixel就是輸出,一般濃縮是取框內的最大值或是平均值。
池化的例子
圖中框框的大小是$2\times 2$,而每次水平及垂直移動的步階 (stride)是2,濃縮的操作是max,經池化後會得右圖。

► Dropout Layer (捨棄層) 
Dropout layer 是用於隨機捨棄輸入tensor 的某些元素,最主要的功能是用來防範過適應。

► Fully-connected (FC) (全連接層)
此層有時又稱dense 層,是指此層的神經元和輸入圖像的每一像素均有權重係數相連接。

► flat layer (展平層)
意思是將多維的tensor展平成一維後用全連接的方式接至下一級,下一級一般會是輸出層。

► CNN 實例
下圖是一個極為簡單的CNN的實例,而真正實用的網路比此圖所示的架構複雜多了。
CNN的實例
圖中可見原始樣本經一摺積層後再經一個最大化的池化層,之後再經一摺積層和大池化池,之後兩個全連接層至輸出,輸出層一般依網路要辨識的圖片多寡就會有多少個神經元。

🔶 摺積操作輸出的 feature map 尺度與數目 
考慮常見的圖片的色彩空間有所謂的黑白、灰階和彩色。所以一張圖像除寬與高兩維外還有另一維是彩色有關的維度,之前提到這維稱channel(通道) 或是volume (容積),所以一張圖像原則上都是用三維空間定義,但一般文獻在探討摺積時都以二維操作為例子,如下圖是一二維摺積的例
二維摺積
圖中左表是原圖像二維的表示,而右表是摺積核,摺積的操作有很多參數,我們留待下一單元在詳述,於此先討論最簡單的情況。最簡單的操作是每次的步長為1且沒有0充填,亦即先由兩圖的左 (0,0)對齊,求出重疊的元素相乘並將結果相加(互相關),如(0,0)對齊我們可求得是4,之後kernel向右移一個位置,對齊後再求互相關,可得3,之後kernel 再向右移一位置,,求互相關可得4,這時兩圖的右側邊緣已對齊重疊了,無法再向右位 移,所以改kernel 的(0,0)對齊圖像的(1,0)開始,亦即kernel 的第0列對到圖像的第一列,也就是向下移的步長是1。依此重覆操作至右邊緣對齊,一樣可得3個像素輸出,之後再度拉回最左以kernel的第0列對齊圖像的第二列,此列一樣可得3個輸出,完成後kernel的下緣已對到圖像的下緣,以無法再下移,則最終此兩圖的摺積就得一張$3\times 3$的特徵圖。

至於若原樣本圖是張有3 channels的彩色圖如何處理呢?這種情形,左圖的kernel  也會有三個並列的kernels,每一核對應到樣本的每一channel,所以共會有$3\times 3\times 3 +1$個係數,在摺積操作時可以想像3個 channel 連動,亦即每次求互相關時是三個色彩通道的像素和對應的 kernel個別相乘並求和,但最後一個動作要將此三個通道的每一個位置的像素相加,也就是和單色的情況一樣,最終也只是得到一張$3\times 3$的特徵圖。也有人建議對3  channel的圖像可在處理前先化成單色的灰階,這樣輸出也是僅有一張$3\times 3$的特徵圖。另有人誤解把上述 3 channel 的摺積操作說成是3-D 摺積,這是不對的,因為我們只對兩維做摺積,channel 維是連動,並沒有單獨設步長去移動,真正3-D摺積是要3維都設有步長,並考慮每一維依步長移位後相乘的結果,所以輸出是3-D的特徵圖。所以CNN一個重要的重點是第一層(輸入層)的 channel維的大小是樣本圖像色彩空間的數目, 但第二層開始已沒有色彩空間了,而原來channel的維度的大小變成是該層並列輸出的feature maps 數目 ,這觀念對寫程式設計CNN 很重要,下一單元會再討論此一特點。

依以上說明我們來看看幾個摺積操作輸出數目的例子。
單一kernel 對RGB 三色樣本
上圖是一個$5\times 5$的kernel,作用到一張$32\times 32\times 3$的彩色樣本圖的情形,在此情況 kernel共有76個權重係數 ,輸出是一張feature map,其尺度取決於摺積的參數。
兩個kernel 作用到彩色樣本圖
上圖是兩個kernel 作用到彩色樣本圖,因步長設為1所以得兩張$28\times 28$的特徵圖。

沒有留言:

張貼留言