1. 程式人生 > >見過最好的神經網路CNN解釋

見過最好的神經網路CNN解釋

什麼是卷積神經網路?為什麼它們很重要?

卷積神經網路(ConvNets 或者 CNNs)屬於神經網路的範疇,已經在諸如影象識別和分類的領域證明了其高效的能力。卷積神經網路可以成功識別人臉、物體和交通訊號,從而為機器人和自動駕駛汽車提供視力。

圖 1

在上圖中,卷積神經網路可以識別場景,也可以提供相關的標籤,比如“橋樑”、“火車”和“網球”;而下圖展示了卷積神經網路可以用來識別日常物體、人和動物。最近,卷積神經網路也在一些自然語言處理任務(比如語句分類)上面展示了良好的效果。

圖 2

因此,卷積神經網路對於今天大多數的機器學習使用者來說都是一個重要的工具。然而,理解卷積神經網路以及首次學習使用它們有時會很痛苦。那本篇部落格的主要目的就是讓我們對卷積神經網路如何處理影象有一個基本的瞭解。

如果你是神經網路的新手,我建議你閱讀下這篇短小的多層感知器的教程,在進一步閱讀前對神經網路有一定的理解。在本篇部落格中,多層感知器叫做“全連線層”。

LeNet 架構 (1990s)

LeNet 是推進深度學習領域發展的最早的卷積神經網路之一。經過多次成功迭代,到 1988 年,Yann LeCun 把這一先驅工作命名為 LeNet5。當時,LeNet 架構主要用於字元識別任務,比如讀取郵政編碼、數字等等。

接下來,我們將會了解 LeNet 架構是如何學會識別影象的。近年來有許多在 LeNet 上面改進的新架構被提出來,但它們都使用了 LeNet 中的主要概念,如果你對 LeNet 有一個清晰的認識,就相對比較容易理解。

圖 3

上圖中的卷積神經網路和原始的 LeNet 的結構比較相似,可以把輸入的影象分為四類:狗、貓、船或者鳥(原始的 LeNet 主要用於字元識別任務)。正如上圖說示,當輸入為一張船的圖片時,網路可以正確的從四個類別中把最高的概率分配給船(0.94)。在輸出層所有概率的和應該為一(本文稍後會解釋)。

There are four main operations in the ConvNet shown in Figure 3 above: 在上圖中的 ConvNet 有四個主要操作:

  1. 卷積
  2. 非線性處理(ReLU)
  3. 池化或者亞取樣
  4. 分類(全連線層)

這些操作對於各個卷積神經網路來說都是基本元件,因此理解它們的工作原理有助於充分了解卷積神經網路。下面我們將會嘗試理解各步操作背後的原理。

影象是畫素值的矩陣

本質上來說,每張影象都可以表示為畫素值的矩陣:

圖4

通道 常用於表示影象的某種組成。一個標準數字相機拍攝的影象會有三通道 - 紅、綠和藍;你可以把它們看作是互相堆疊在一起的二維矩陣(每一個通道代表一個顏色),每個通道的畫素值在 0 到 255 的範圍內。

灰度影象,僅僅只有一個通道。在本篇文章中,我們僅考慮灰度影象,這樣我們就只有一個二維的矩陣來表示影象。矩陣中各個畫素的值在 0 到 255 的範圍內——零表示黑色,255 表示白色。

卷積

卷積神經網路的名字就來自於其中的卷積操作。卷積的主要目的是為了從輸入影象中提取特徵。卷積可以通過從輸入的一小塊資料中學到影象的特徵,並可以保留畫素間的空間關係。我們在這裡並不會詳細講解卷積的數學細節,但我們會試著理解卷積是如何處理影象的。

As we discussed above, every image can be considered as a matrix of pixel values. Consider a 5 x 5 image whose pixel values are only 0 and 1 (note that for a grayscale image, pixel values range from 0 to 255, the green matrix below is a special case where pixel values are only 0 and 1): 正如我們上面所說,每張影象都可以看作是畫素值的矩陣。考慮一下一個 5 x 5 的影象,它的畫素值僅為 0 或者 1(注意對於灰度影象而言,畫素值的範圍是 0 到 255,下面畫素值為 0 和 1 的綠色矩陣僅為特例):

圖 5

同時,考慮下另一個 3 x 3 的矩陣,如下所示:

圖 6

接下來,5 x 5 的影象和 3 x 3 的矩陣的卷積可以按下圖所示的動畫一樣計算:

圖 7

現在停下來好好理解下上面的計算是怎麼完成的。我們用橙色的矩陣在原始影象(綠色)上滑動,每次滑動一個畫素(也叫做“步長”),在每個位置上,我們計算對應元素的乘積(兩個矩陣間),並把乘積的和作為最後的結果,得到輸出矩陣(粉色)中的每一個元素的值。注意,3 x 3 的矩陣每次步長中僅可以“看到”輸入影象的一部分。

在 CNN 的術語中,3x3 的矩陣叫做“濾波器(filter)”或者“核(kernel)”或者“特徵檢測器(feature detector)”,通過在影象上滑動濾波器並計算點乘得到矩陣叫做“卷積特徵(Convolved Feature)”或者“啟用圖(Activation Map)”或者“特徵圖(Feature Map)”。記住濾波器在原始輸入影象上的作用是特徵檢測器。

從上面圖中的動畫可以看出,對於同樣的輸入影象,不同值的濾波器將會生成不同的特徵圖。比如,對於下面這張輸入影象:

xiaolu

In the table below, we can see the effects of convolution of the above image with different filters. As shown, we can perform operations such as Edge Detection, Sharpen and Blur just by changing the numeric values of our filter matrix before the convolution operation 8 – this means that different filters can detect different features from an image, for example edges, curves etc. More such examples are available in Section 8.2.4 here.

在下表中,我們可以看到不同濾波器對上圖卷積的效果。正如表中所示,通過在卷積操作前修改濾波矩陣的數值,我們可以進行諸如邊緣檢測、銳化和模糊等操作 —— 這表明不同的濾波器可以從圖中檢測到不同的特徵,比如邊緣、曲線等。在這裡的 8.2.4 部分中可以看到更多的例子。

卷積

另一個理解卷積操作的好方法是看下面這張圖的動畫:

卷積

濾波器(紅色框)在輸入影象滑過(卷積操作),生成一個特徵圖。另一個濾波器(綠色框)在同一張影象上卷積可以得到一個不同的特徵圖。注意卷積操作可以從原圖上獲取區域性依賴資訊。同時注意這兩個不同的濾波器是如何從同一張影象上生成不同的特徵圖。記住上面的影象和兩個濾波器僅僅是我們上面討論的數值矩陣。

在實踐中,CNN 會在訓練過程中學習到這些濾波器的值(儘管我們依然需要在訓練前指定諸如濾波器的個數、濾波器的大小、網路架構等引數)。我們使用的濾波器越多,提取到的影象特徵就越多,網路所能在未知影象上識別的模式也就越好。

特徵圖的大小(卷積特徵)由下面三個引數控制,我們需要在卷積前確定它們:

  • 深度(Depth):深度對應的是卷積操作所需的濾波器個數。在下圖的網路中,我們使用三個不同的濾波器對原始影象進行卷積操作,這樣就可以生成三個不同的特徵圖。你可以把這三個特徵圖看作是堆疊的 2d 矩陣,那麼,特徵圖的“深度”就是三。

深度

  • 步長(Stride):步長是我們在輸入矩陣上滑動濾波矩陣的畫素數。當步長為 1 時,我們每次移動濾波器一個畫素的位置。當步長為 2 時,我們每次移動濾波器會跳過 2 個畫素。步長越大,將會得到更小的特徵圖。

  • 零填充(Zero-padding):有時,在輸入矩陣的邊緣使用零值進行填充,這樣我們就可以對輸入影象矩陣的邊緣進行濾波。零填充的一大好處是可以讓我們控制特徵圖的大小。使用零填充的也叫做泛卷積,不適用零填充的叫做嚴格卷積。這個概念在下面的參考文獻 14 中介紹的非常詳細。

非線性簡介(ReLU)

An additional operation called ReLU has been used after every Convolution operation in Figure 3 above. ReLU stands for Rectified Linear Unit and is a non-linear operation. Its output is given by:

在上面圖中,在每次的卷積操作後都使用了一個叫做 ReLU 的操作。ReLU 表示修正線性單元(Rectified Linear Unit),是一個非線性操作。它的輸入如下所示:

ReLU

ReLU 是一個元素級別的操作(應用到各個畫素),並將特徵圖中的所有小於 0 的畫素值設定為零。ReLU 的目的是在 ConvNet 中引入非線性,因為在大部分的我們希望 ConvNet 學習的實際資料是非線性的(卷積是一個線性操作——元素級別的矩陣相乘和相加,所以我們需要通過使用非線性函式 ReLU 來引入非線性。

ReLU 操作可以從下面的圖中理解。它展示的 ReLU 操作是應用到上面圖 6 得到的特徵圖之一。這裡的輸出特徵圖也可以看作是“修正”過的特徵圖。

ReLU

其他非線性函式,比如 tanh 或者 sigmoid 也可以用來替代 ReLU,但 ReLU 在大部分情況下表現是更好的。

池化操作

空間池化(Spatial Pooling)(也叫做亞採用或者下采樣)降低了各個特徵圖的維度,但可以保持大部分重要的資訊。空間池化有下面幾種方式:最大化、平均化、加和等等。

對於最大池化(Max Pooling),我們定義一個空間鄰域(比如,2x2 的視窗),並從視窗內的修正特徵圖中取出最大的元素。除了取最大元素,我們也可以取平均(Average Pooling)或者對視窗內的元素求和。在實際中,最大池化被證明效果更好一些。

下面的圖展示了使用 2x2 視窗在修正特徵圖(在卷積 + ReLU 操作後得到)使用最大池化的例子。

ReLU

我們以 2 個元素(也叫做“步長”)滑動我們 2x2 的視窗,並在每個區域內取最大值。如上圖所示,這樣操作可以降低我們特徵圖的維度。

在下圖展示的網路中,池化操作是分開應用到各個特徵圖的(注意,因為這樣的操作,我們可以從三個輸入圖中得到三個輸出圖)。

網路

下圖展示了在圖 9 中我們在 ReLU 操作後得到的修正特徵圖的池化操作的效果。

池化

池化函式可以逐漸降低輸入表示的空間尺度。特別地,池化:

  • 使輸入表示(特徵維度)變得更小,並且網路中的引數和計算的數量更加可控的減小,因此,可以控制過擬合
  • 使網路對於輸入影象中更小的變化、冗餘和變換變得不變性(輸入的微小冗餘將不會改變池化的輸出——因為我們在區域性鄰域中使用了最大化/平均值的操作。
  • 幫助我們獲取影象最大程度上的尺度不變性(準確的詞是“不變性”)。它非常的強大,因為我們可以檢測影象中的物體,無論它們位置在哪裡(參考 18 19 獲取詳細資訊)。

目前為止的故事

網路

到目前為止我們瞭解了卷積、ReLU 和池化是如何操作的。理解這些層是構建任意 CNN 的基礎是很重要的。正如上圖所示,我們有兩組卷積、ReLU & 池化層 —— 第二組卷積層使用六個濾波器對第一組的池化層的輸出繼續卷積,得到一共六個特徵圖。接下來對所有六個特徵圖應用 ReLU。接著我們對六個修正特徵圖分別進行最大池化操作。

這些層一起就可以從影象中提取有用的特徵,並在網路中引入非線性,減少特徵維度,同時保持這些特徵具有某種程度上的尺度變化不變性。

第二組池化層的輸出作為全連線層的輸入,我們會在下一部分介紹全連線層。

全連線層

全連線層是傳統的多層感知器,在輸出層使用的是 softmax 啟用函式(也可以使用其他像 SVM 的分類器,但在本文中只使用 softmax)。“全連線(Fully Connected)”這個詞表明前面層的所有神經元都與下一層的所有神經元連線。如果你對多層感知器不熟悉的話,我推薦你閱讀這篇文章

卷積和池化層的輸出表示了輸入影象的高階特徵。全連線層的目的是為了使用這些特徵把輸入影象基於訓練資料集進行分類。比如,在下面圖中我們進行的影象分類有四個可能的輸出結果(注意下圖並沒有顯示全連線層的節點連線)。

全連線

除了分類,新增一個全連線層也(一般)是學習這些特徵的非線性組合的簡單方法。從卷積和池化層得到的大多數特徵可能對分類任務有效,但這些特徵的組合可能會更好。

從全連線層得到的輸出概率和為 1。這個可以在輸出層使用 softmax 作為啟用函式進行保證。softmax 函式輸入一個任意大於 0 值的向量,並把它們轉換為零一之間的數值向量,其和為一。

把它們組合起來——使用反向傳播進行訓練

正如上面討論的,卷積 + 池化層的作用是從輸入影象中提取特徵,而全連線層的作用是分類器。

注意在下面的圖中,因為輸入的影象是船,對於船這一類的目標概率是 1,而其他三類的目標概率是 0,即

  • 輸入影象 = 船
  • 目標向量 = [0, 0, 1, 0]

網路

完整的卷積網路的訓練過程可以總結如下:

  • 第一步:我們初始化所有的濾波器,使用隨機值設定引數/權重

  • 第二步:網路接收一張訓練影象作為輸入,通過前向傳播過程(卷積、ReLU 和池化操作,以及全連線層的前向傳播),找到各個類的輸出概率

    • 我們假設船這張影象的輸出概率是 [0.2, 0.4, 0.1, 0.3]
    • 因為對於第一張訓練樣本的權重是隨機分配的,輸出的概率也是隨機的
  • 第三步:在輸出層計算總誤差(計算 4 類的和)

    • Total Error = ∑  ½ (target probability – output probability) ²
  • 第四步:使用反向傳播演算法,根據網路的權重計算誤差的梯度,並使用梯度下降演算法更新所有濾波器的值/權重以及引數的值,使輸出誤差最小化

    • 權重的更新與它們對總誤差的佔比有關
    • 當同樣的影象再次作為輸入,這時的輸出概率可能會是 [0.1, 0.1, 0.7, 0.1],這就與目標向量 [0, 0, 1, 0] 更接近了
    • 這表明網路已經通過調節權重/濾波器,可以正確對這張特定影象的分類,這樣輸出的誤差就減小了
    • 像濾波器數量、濾波器大小、網路結構等這樣的引數,在第一步前都是固定的,在訓練過程中保持不變——僅僅是濾波器矩陣的值和連線權重在更新
  • 第五步:對訓練資料中所有的影象重複步驟 1 ~ 4

上面的這些步驟可以訓練 ConvNet —— 這本質上意味著對於訓練資料集中的影象,ConvNet 在更新了所有權重和引數後,已經優化為可以對這些影象進行正確分類。

當一張新的(未見過的)影象作為 ConvNet 的輸入,網路將會再次進行前向傳播過程,並輸出各個類別的概率(對於新的影象,輸出概率是使用已經在前面訓練樣本上優化分類的引數進行計算的)。如果我們的訓練資料集非常的大,網路將會(有希望)對新的影象有很好的泛化,並把它們分到正確的類別中去。

注 1: 上面的步驟已經簡化,也避免了數學詳情,只為提供訓練過程的直觀內容。可以參考文獻 4 12 瞭解數學公式和完整過程。

注 2:在上面的例子中我們使用了兩組卷積和池化層。然而請記住,這些操作可以在一個 ConvNet 中重複多次。實際上,現在有些表現最好的 ConvNet 擁有多達十幾層的卷積和池化層!同時,每次卷積層後面不一定要有池化層。如下圖所示,我們可以在池化操作前連續使用多個卷積 + ReLU 操作。還有,請注意 ConvNet 的各層在下圖中是如何視覺化的。

car

卷積神經網路的視覺化

一般而言,越多的卷積步驟,網路可以學到的識別特徵就越複雜。比如,ConvNet 的影象分類可能在第一層從原始畫素中檢測出邊緣,然後在第二層使用邊緣檢測簡單的形狀,接著使用這些形狀檢測更高階的特徵,比如更高層的人臉。下面的圖中展示了這些內容——我們使用卷積深度置信網路學習到的特徵,這張圖僅僅是用來證明上面的內容(這僅僅是一個例子:真正的卷積濾波器可能會檢測到對我們毫無意義的物體)。

demo

Adam Harley 建立了一個卷積神經網路的視覺化結果,使用的是 MNIST 手寫數字的訓練集13。我強烈建議使用它來理解 CNN 的工作原理。

我們可以在下圖中看到網路是如何識別輸入 “8” 的。注意下圖中的視覺化並沒有單獨展示 ReLU 操作。

Conv_all

輸入影象包含 1024 個畫素(32 x 32 大小),第一個卷積層(卷積層 1)由六個獨特的 5x5 (步長為 1)的濾波器組成。如圖可見,使用六個不同的濾波器得到一個深度為六的特徵圖。

卷積層 1 後面是池化層 1,在卷積層 1 得到的六個特徵圖上分別進行 2x2 的最大池化(步長為 2)的操作。你可以在池化層上把滑鼠移動到任意的畫素上,觀察在前面卷積層(如上圖所示)得到的 4x4 的小格。你會發現 4x4 小格中的最大值(最亮)的畫素將會進入到池化層。

pooling

池化層 1 後面的是十六個 5x5 (步長為 1)的卷積濾波器,進行卷積操作。後面就是池化層 2,進行 2x2 的最大池化(步長為 2)的操作。這兩層的概念和前面描述的一樣。

接下來我們就到了三個全連線層。它們是:

  • 第一個全連線層有 120 個神經元
  • 第二層全連線層有 100 個神經元
  • 第三個全連線層有 10 個神經元,對應 10 個數字——也就做輸出層

注意在下圖中,輸出層中的 10 個節點的各個都與第二個全連線層的所有 100 個節點相連(因此叫做全連線)。

同時,注意在輸出層那個唯一的亮的節點是如何對應於數字 “8” 的——這表明網路把我們的手寫數字正確分類(越亮的節點表明從它得到的輸出值越高,即,8 是所有數字中概率最高的)。

final

同樣的 3D 視覺化可以在這裡看到。

其他的 ConvNet 架構

卷積神經網路從上世紀 90 年代初期開始出現。我們上面提到的 LeNet 是早期卷積神經網路之一。其他有一定影響力的架構如下所示3

  • LeNet (1990s): 本文已介紹。
  • 1990s to 2012:在上世紀 90 年代後期至 2010 年初期,卷積神經網路進入孵化期。隨著資料量和計算能力的逐漸發展,卷積神經網路可以處理的問題變得越來越有趣。
  • AlexNet (2012) – 在 2012,Alex Krizhevsky (與其他人)釋出了 AlexNet,它是比 LeNet 更深更寬的版本,並在 2012 年的 ImageNet 大規模視覺識別大賽(ImageNet Large Scale Visual Recognition Challenge,ILSVRC)中以巨大優勢獲勝。這對於以前的方法具有巨大的突破,當前 CNN 大範圍的應用也是基於這個工作。
  • ZF Net (2013) – ILSVRC 2013 的獲勝者是來自 Matthew Zeiler 和 Rob Fergus 的卷積神經網路。它以 ZFNet (Zeiler & Fergus Net 的縮寫)出名。它是在 AlexNet 架構超引數上進行調整得到的效果提升。
  • GoogLeNet (2014) – ILSVRC 2014 的獲勝者是來自於 Google 的 Szegedy等人的卷積神經網路。它的主要貢獻在於使用了一個 Inception 模組,可以大量減少網路的引數個數(4M,AlexNet 有 60M 的引數)。
  • VGGNet (2014) – 在 ILSVRC 2014 的領先者中有一個 VGGNet 的網路。它的主要貢獻是展示了網路的深度(層數)對於效能具有很大的影響。
  • ResNets (2015) – 殘差網路是何凱明(和其他人)開發的,並贏得 ILSVRC 2015 的冠軍。ResNets 是當前卷積神經網路中最好的模型,也是實踐中使用 ConvNet 的預設選擇(截至到 2016 年五月)。
  • DenseNet (2016 八月) – 近來由 Gao Huang (和其他人)發表的,the Densely Connected Convolutional Network 的各層都直接於其他層以前向的方式連線。DenseNet 在五種競爭積累的目標識別基準任務中,比以前最好的架構有顯著的提升。可以在這裡看 Torch 實現。

總結

在本篇文章中,我嘗試使用簡單的方式來解釋卷積神經網路背後的主要概念。我簡化/跳過了一些細節,但希望本篇文章可以讓你對它們有一定的瞭解。

本文最開始是受 Denny Britz 的理解用於自然語言處理的卷積神經網路(我強烈建議閱讀)啟發,大量的解釋也是基於那篇文章。如果你想要對這些概念有更深的理解,我建議你瀏覽一下 Stanford 的 ConvNet 課程中的筆記,以及下面所列的參考文獻。如果你對上面的概念有什麼疑問,或者有問題和建議,歡迎在下面留言。

本文中使用的所有影象和動畫的版權都歸下面參考文獻中對應作者所有。

參考文獻

轉自http://www.hackcv.com/index.php/archives/104/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

--------------------- 本文來自 ruiyiin 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/ruiyiin/article/details/77113973?utm_source=copy