1. 程式人生 > >卷積神經網絡-解釋1

卷積神經網絡-解釋1

available -a -s unit connected 神經網絡 .cn pla 直觀

  • [翻譯] 神經網絡的直觀解釋 2017/07/27 17:36

    這篇文章原地址為An Intuitive Explanation of Convolutional Neural Networks,卷積神經網絡的講解非常通俗易懂。

    什麽是卷積神經網絡?為什麽它們很重要?

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

    技術分享圖片

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

    技術分享圖片

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

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

    LeNet 架構 (1990s)

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

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

    技術分享圖片

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

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

    1. 卷積
    2. 非線性處理(ReLU)
    3. 池化或者亞采樣
    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 的綠色矩陣僅為特例):

    技術分享圖片

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

    技術分享圖片

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

    技術分享圖片

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

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

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

    技術分享圖片

    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 是一個元素級別的操作(應用到各個像素),並將特征圖中的所有小於 0 的像素值設置為零。ReLU 的目的是在 ConvNet 中引入非線性,因為在大部分的我們希望 ConvNet 學習的實際數據是非線性的(卷積是一個線性操作——元素級別的矩陣相乘和相加,所以我們需要通過使用非線性函數 ReLU 來引入非線性。

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

    技術分享圖片

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

    池化操作

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

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

    下面的圖展示了使用 2x2 窗口在修正特征圖(在卷積 + 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) 2
    • 第四步:使用反向傳播算法,根據網絡的權重計算誤差的梯度,並使用梯度下降算法更新所有濾波器的值/權重以及參數的值,使輸出誤差最小化

      • 權重的更新與它們對總誤差的占比有關
      • 當同樣的圖像再次作為輸入,這時的輸出概率可能會是 [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 的各層在下圖中是如何可視化的。

    技術分享圖片

    卷積神經網絡的可視化

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

    技術分享圖片

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

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

    技術分享圖片

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

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

    技術分享圖片

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

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

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

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

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

    技術分享圖片

    同樣的 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 課程中的筆記,以及下面所列的參考文獻。如果你對上面的概念有什麽疑問,或者有問題和建議,歡迎在下面留言。

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

    參考文獻

    1. Clarifai Home Page
    2. Shaoqing Ren, et al, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015, arXiv:1506.01497
    3. Neural Network Architectures, Eugenio Culurciello’s blog
    4. CS231n Convolutional Neural Networks for Visual Recognition, Stanford
    5. Clarifai / Technology
    6. Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks
    7. Feature extraction using convolution, Stanford
    8. Wikipedia article on Kernel (image processing)
    9. Deep Learning Methods for Vision, CVPR 2012 Tutorial
    10. Neural Networks by Rob Fergus, Machine Learning Summer School 2015
    11. What do the fully connected layers do in CNNs?
    12. Convolutional Neural Networks, Andrew Gibiansky
    13. A. W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link)
    14. Understanding Convolutional Neural Networks for NLP
    15. Backpropagation in Convolutional Neural Networks
    16. A Beginner’s Guide To Understanding Convolutional Neural Networks Vincent Dumoulin, et al, “A guide to convolution arithmetic for deep learning”, 2015, arXiv:1603.07285
    17. What is the difference between deep learning and usual machine learning?
    18. How is a convolutional neural network able to learn invariant features?
    19. A Taxonomy of Deep Convolutional Neural Nets for Computer Vision

    Update At 2017年6月23日

    感謝 Annie 指出錯誤。

卷積神經網絡-解釋1