深度學習三:卷積神經網路

卷積神經網路

卷積神經網路(Convolutional Neural Network,CNN)又叫卷積網路(Convolutional Network),是一種專門用來處理具有類似網格結構的數據的神經網路。卷積神經網路一詞中的卷積是一種特殊的線性運算。卷積網路是指那些至少在網路的一層中使用卷積運算來代替一般的矩陣乘法的神經網路。

卷積神經網路的出現,極大的緩解了全連接神經網路中存在的一個典型的問題:數據的波形被忽視了!眾所周知,全連接神經網路在進行數據輸入的時候,需要將一個二維或者三維的數據展平為一維的數據。而我們知道在電腦中圖形是一個三維的數據,因為需要存儲一些類似 RGB 各個通道之間關聯性的空間資訊,所以三維形狀中可能隱藏有值得提取的本質模式。而全連接展平會導致形狀的忽視。因此需要利用卷積神經網路來保持形狀的不變。

典型應用場景:影像識別、語音識別等。

典型結構如下圖所示:

神經網路中的各層

  • 輸入層(Input Layer):主要是對原始的影像數據進行預處理
  • 卷積層(Convolution Layers):從前一層提取移位不變特徵。即當輸入數據是影像的時候,卷積層會以3維數據的形式接收輸入數據,並同樣以3維數據的形式輸出至下一層。因此,在CNN中,可以(有可能)正確理解影像等具有形狀的數據。註:卷積層的輸入和輸出數據通常又被稱為特徵圖(Feature Map)。卷積層的輸入數據稱為輸入特徵圖(Input Feature Map),輸出數據稱為輸出特徵圖(Output Feature Map)。
  • 池化層(Pooling Layers):將前一層的多個單元的激活組合為一個單元。池化是縮小高、長方向上的空間的運算,通常減小一半。
  • 全連接層(Fully Connected Layers):收集空間擴散資訊
  • 輸出層(Output Layer):選擇類

卷積操作

卷積運算相當於影像處理中的「濾波器運算」。卷積運算會對輸入數據應用濾波器(Filter)

假設,一個初始的影像大小為 \(J*K\), 同時有 \(L\) 個管道,如下圖所示:

我們應用一個 \(M*N\) 大小的濾波器。圖中綠色的格子就是一個 3*3 的濾波器。卷積運算的整個操作為:將各個位置上濾波器的元素和輸入的對應元素相乘,然後再求和(整個操作也被稱為乘積累加運算),然後,將這個結果保存到輸出的對應位置。

將計算過程公式化,公式如下:

\[Z_{j,k} = b + \sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K_{m,n}V_{j+m,k+n}
\]

其中 \(K_{m,n}\) 表示濾波器的 \(m,n\) 位置的數據,\(V_{j+m,k+n}\) 表示影像的 \(j+m,k+n\) 位置的數據,\(b\) 是偏置項。

將計算過程影像化,如下圖所示:

其中,濾波器的參數就是權重(Weights),同時還有有個偏置項(Bias),這個偏置項會被加到濾波器最後的輸出上。

權重共享

我們可以根據上圖看到,對一層中的每一個 \(M×N\) 塊輸入應用相同的權值,計算卷積層中的下一個隱藏單元,這就是個權重共享(Weight Sharing)的概念。

填充

填充(Padding):在進行卷積操作之前,有時候要向周圍填入固定的數據,比如用數值 0 進行填充,也叫零填充(Zero Padding)

應用填充之後,卷積層的輸出大小將會和卷積之前的層一樣,如圖所示,其中粉色的 6 * 7 的格子是原始的影像尺寸,我們在周圍加上一圈數值為 0 的格子,用白色表示:

以步幅 1 進行卷積,如下圖所示:

最終我們得到了一個大小為 6 * 7 的藍色的卷積層,和原始影像的尺寸相同,如下圖所示:

這主要也是為了避免卷積過程中過一個典型的問題:如果每次驚醒卷積運算都會縮小空間,那麼在某個時刻輸出大小就有可能變成 1,導致無法再應用卷積運算。為了避免這個情況的出現,就需要使用填充。

步幅

步幅(Stribe):應用濾波器間隔的位置稱為步幅。在上面的例子中,採用的步幅為 1。

我們可以將步幅改為 2,那麼卷積過程就會變成下圖所示的:

可以看到應用濾波器的窗口的間隔變成了 2 個元素,如下圖所示:

最終,新的一層的尺寸變為一個 3 * 4 的層。用公式表示為(設步長為\(s\)):

\[(1+\frac{(J-M)}{s}), (1+\frac{(K-N)}{s})
\]

3 維數據的卷積運算

在一開始,雖然我們假設了一個初始的影像大小為 \(J*K\), 同時有 \(L\) 個管道。但是我們討論的卷積操作一直只在單層上進行的,下面我們就討論一下在 3 維情況下的卷積運算。

當在通道方向上有多個特徵圖的時候,會按照通道進行輸入數據濾波器的卷積運算,並將結果相加,從而得到輸出。計算步驟如下圖所示:

至此,我們的公式可以總結為:

\[Z^i_{j,k} = b^i + \sum_l\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K^i_{m,n}V^l_{j+m,k+n}
\]

其中 \(K^i_{m,n}\) 表示第 \(i\) 個濾波器的 \(m,n\) 位置的數據,\(V^l_{j+m,k+n}\) 表示影像第 \(l\) 層通道的 \(j+m,k+n\) 位置的數據,\(b^i\) 是第 \(i\) 個偏置項。根據之前的權重共享的概念,我們可以知道,每一層通道是共用一個濾波器的相同權重的,同樣也共用相同的偏置。

池化

池化(Pooling)是縮小高、長方向上的空間的運算。

最典型的池化過程叫做最大池化(Max Pooling),如下圖所示,這是一個單層的池化:

圖中所示的步驟是,我們劃定一個 \(2 * 2\) 的窗口,找出這個窗口中最大的那個值,作為下一層的數據,這個窗口以步幅 2 進行移動。一般來說,池化的窗口大小會和步幅設定成相同的值。

除了 Max Pooling 之外,還有 Average Pooling/Mean Pooling,即平均池化,是計算目標區域的平均值。在影像識別領域中,主要使用 Max Pooling。

重疊池化

重疊池化(Overlapping Pooling)是 AlexNet 中的一個概念。Overlapping Pooling 的概念和 No-Overlapping Pooling的概念相對。

  • Overlapping Pooling:當步幅大於窗口寬度,會使池化窗口產生重疊區域。可以提升預測精度、緩解過擬合。
  • No-Overlapping Pooling:步幅和窗口寬度相同,池化窗口沒有重疊區域。如上圖的展示。又叫一般池化,General Pooling

池化層的特徵

  • 沒有要學習的參數:池化層和卷積層不同,沒有要學習的參數。池化層只是從目標區域中取最大值或平均值。
  • 通道數不發生變化:經過池化運算,輸入數據和輸出數據的通道數不會發生變化。即計算是按照通道獨立進行的。
  • 對微小的位置變化具有魯棒性(健壯):輸入數據發生微小偏差時,池化仍會返回相同的結果。

典型的CNN

LeNet

LeNet 是在 1998 年提出的進行手寫數字識別的網路。具有連續的卷積層和池化層(準確的講是只抽取元素的子取樣層),最後經全連接層輸出結果。基本結構如下:

  • C1:第一個卷積層的 5×5 的窗口從原始的 32×32 的影像中提取出 28×28 的特徵數組。
  • S2:然後再進行子抽樣,將其大小減半為14×14。
  • C3:第二個卷積層使用另一個 5×5 的窗口提取一個 10×10 的特徵數組。
  • S4:第二個子取樣層將其簡化為 5×5。
  • C5、F6:這些激活然後通過兩個全連接層進入對應數字 『0』 到 『9』 的10個輸出單元。

和現在的 CNN 相比,LeNet 有幾個不同點

  • 激活函數:LeNet中使用 Sigmoid 函數,而現在的 CNN 中主要使用 ReLU 函數。
  • 池化/子取樣:LeNet 中使用子取樣縮小中間數據的大小,而現在的 CNN 中 Max Pooling 是主流。

AlexNet

AlexNet 是一個引發深度學習熱潮的導火索。基本結構如下:

AlexNet 疊有多個卷積層和池化層,最後經由全連接層輸出:

  • 5 個卷積層和 3 個全連接層
  • 利用重疊步幅的最大池化層
  • 1000 個類的 Softmax
  • 兩個只在特定層進行交互的 GPU。上圖中就是利用了兩個 GPU,在第二個 Max Pooling 層進行交互,一直到最後進行輸出兩個 GPU 一直是在並行運算。

AlexNet 雖然在結構上和 LeNet 沒有很大的不同,但是也有一些細節上的差異

  • AlexNet 的激活函數使用的是 ReLU
  • 使用進行局部正規化的 LRN(Local Response Normalization)層
  • 使用 Dropout

面試常見問題

  • 神經網路中的權重共享是什麼?

  • \(1 * 1\) 卷積的作用

  • 卷積層和池化層有什麼區別

  • LeNet-5 結構

  • AlexNet 結構