什麼是卷積神經網路,它為何重要?
卷積神經網路(也稱作 ConvNets 或 CNN)是神經網路的一種,它在影象識別和分類等領域已被證明非常有效。 卷積神經網路除了為機器人和自動駕駛汽車的視覺助力之外,還可以成功識別人臉,物體和交通標誌。
圖1
如圖1所示,卷積神經網路能夠識別圖片的場景並且提供相關標題(“足球運動員正在踢足球”),圖2則是利用卷積神經網路識別日常物品、人類和動物的例子。最近,卷積神經網路在一些自然語言處理任務(如語句分類)中也發揮了很大作用。
圖2
因此,卷積神經網路是當今大多數機器學習實踐者的重要工具。但是,理解卷積神經網路並開始嘗試運用著實是一個痛苦的過程。本文的主要目的是瞭解卷積神經網路如何處理影象。
對於剛接觸神經網路的人,我建議大家先閱讀這篇關於多層感知機的簡短教程 ,瞭解其工作原理之後再繼續閱讀本文。多層感知機即本文中的“完全連線層”。
LeNet 框架(20世紀90年代)
LeNet 是最早推動深度學習領域發展的卷積神經網路之一。這項由 Yann LeCun 完成的開創性工作自1988年以來多次成功迭代之後被命名為 LeNet5。當時 LeNet 框架主要用於字元識別任務,例如閱讀郵政編碼,數字等。
接下來,我們將直觀地瞭解 LeNet 框架如何學習識別影象。 近年來有人提出了幾種基於 LeNet 改進的新框架,但是它們的基本思路與 LeNet 並無差別,如果您清楚地理解了 LeNet,那麼對這些新的框架理解起來就相對容易很多。
圖3中的卷積神經網路在結構上與原始的 LeNet 類似,並將輸入影象分為四類:狗,貓,船或鳥(原始的 LeNet 主要用於字元識別任務)。 從上圖可以看出,接收船隻影象作為輸入時,神經網路在四個類別中正確地給船隻分配了最高概率值(0.94)。輸出層中所有概率的總和應該是1(之後會做解釋)。
圖3 的卷積神經網路中有四個主要操作:
- 卷積
- 非線性變換(ReLU)
- 池化或子取樣
- 分類(完全連線層)
這些操作是所有卷積神經網路的基本組成部分,因此瞭解它們的工作原理是理解卷積神經網路的重要步驟。下面我們將嘗試直觀地理解每個操作。
一張圖片就是一個由畫素值組成的矩陣
實質上,每張圖片都可以表示為由畫素值組成的矩陣。
通道(channel)是一個傳統術語,指影象的一個特定成分。標準數碼相機拍攝的照片具有三個通道——紅,綠和藍——你可以將它們想象為三個堆疊在一起的二維矩陣(每種顏色一個),每個矩陣的畫素值都在0到255之間。
而灰度影象只有一個通道。 鑑於本文的科普目的,我們只考慮灰度影象,即一個代表影象的二維矩陣。矩陣中每個畫素值的範圍在0到255之間——0表示黑色,255表示白色。
卷積
卷積神經網路的名字來源於“卷積”運算。在卷積神經網路中,卷積的主要目的是從輸入影象中提取特徵。通過使用輸入資料中的小方塊來學習影象特徵,卷積保留了畫素間的空間關係。我們在這裡不會介紹卷積的數學推導,但會嘗試理解它是如何處理影象的。
正如前文所說,每個影象可以被看做畫素值矩陣。考慮一個畫素值僅為0和1的5 × 5大小的影象(注意,對於灰度影象,畫素值範圍從0到255,下面的綠色矩陣是畫素值僅為0和1的特殊情況):
另外,考慮另一個 3×3 矩陣,如下圖所示:
上述5 x 5影象和3 x 3矩陣的卷積計算過程如圖5中的動畫所示:
我們來花點時間理解一下上述計算是如何完成的。將橙色矩陣在原始影象(綠色)上以每次1個畫素的速率(也稱為“步幅”)移動,對於每個位置,計算兩個矩陣相對元素的乘積並相加,輸出一個整數並作為最終輸出矩陣(粉色)的一個元素。注意,3 × 3矩陣每個步幅僅能“看到”輸入影象的一部分。
在卷積神經網路的術語中,這個3 × 3矩陣被稱為“過濾器”或“核”或“特徵探測器”,通過在影象上移動過濾器並計算點積得到的矩陣被稱為“卷積特徵”或“啟用對映”或“特徵對映”。重要的是要注意,過濾器的作用就是原始輸入影象的特徵檢測器。
從上面的動畫可以明顯看出,對於同一張輸入影象,不同的過濾器矩陣將會產生不同的特徵對映。例如,考慮如下輸入影象:
在下表中,我們可以看到上圖在不同過濾器下卷積的效果。如圖所示,只需在卷積運算前改變過濾器矩陣的數值就可以執行邊緣檢測,銳化和模糊等不同操作 [8] —— 這意味著不同的過濾器可以檢測影象的不同特徵,例如邊緣, 曲線等。更多此類示例可在 這裡 8.2.4節中找到。
另一個理解卷積操作的好方法可以參考下面圖6中的動畫:
一個過濾器(紅色邊框)在輸入影象上移動(卷積操作)以生成特徵對映。在同一張影象上,另一個過濾器(綠色邊框)的卷積生成了不同的特徵圖,如圖所示。需要注意到,卷積操作捕獲原始影象中的區域性依賴關係很重要。還要注意這兩個不同的過濾器如何從同一張原始影象得到不同的特徵圖。請記住,以上影象和兩個過濾器只是數值矩陣。
實際上,卷積神經網路在訓練過程中會自己學習這些過濾器的值(儘管在訓練過程之前我們仍需要指定諸如過濾器數目、大小,網路框架等引數)。我們擁有的過濾器數目越多,提取的影象特徵就越多,我們的網路在識別新影象時效果就會越好。
特徵對映(卷積特徵)的大小由我們在執行卷積步驟之前需要決定的三個引數[4]控制:
- 深度:深度對應於我們用於卷積運算的過濾器數量。在圖7所示的網路中,我們使用三個不同的過濾器對初始的船影象進行卷積,從而生成三個不同的特徵圖。可以將這三個特徵地圖視為堆疊的二維矩陣,因此,特徵對映的“深度”為3。
- 步幅:步幅是我們在輸入矩陣上移動一次過濾器矩陣的畫素數量。當步幅為1時,我們一次將過濾器移動1個畫素。當步幅為2時,過濾器每次移動2個畫素。步幅越大,生成的特徵對映越小。
- 零填充:有時,將輸入矩陣邊界用零來填充會很方便,這樣我們可以將過濾器應用於輸入影象矩陣的邊界元素。零填充一個很好的特性是它允許我們控制特徵對映的大小。新增零填充也稱為寬卷積,而不使用零填充是為窄卷積。 這在[14]中有清楚的解釋。
非線性部分介紹(ReLU)
如上文圖3所示,每次卷積之後,都進行了另一項稱為 ReLU 的操作。ReLU 全稱為修正線性單元(Rectified Linear Units),是一種非線性操作。 其輸出如下圖所示:
ReLU 是一個針對元素的操作(應用於每個畫素),並將特徵對映中的所有負畫素值替換為零。ReLU 的目的是在卷積神經網路中引入非線性因素,因為在實際生活中我們想要用神經網路學習的資料大多數都是非線性的(卷積是一個線性運算 —— 按元素進行矩陣乘法和加法,所以我們希望通過引入 ReLU 這樣的非線性函式來解決非線性問題)。
從圖9可以很清楚地理解 ReLU 操作。它展示了將 ReLU 作用於圖6中某個特徵對映得到的結果。這裡的輸出特徵對映也被稱為“修正”特徵對映。
其他非線性函式諸如 tanh 或 sigmoid 也可以用來代替 ReLU,但是在大多數情況下,ReLU 的表現更好。
池化
空間池化(也稱為子取樣或下采樣)可降低每個特徵對映的維度,並保留最重要的資訊。空間池化有幾種不同的方式:最大值,平均值,求和等。
在最大池化的情況下,我們定義一個空間鄰域(例如,一個2 × 2視窗),並取修正特徵對映在該視窗內最大的元素。當然我們也可以取該視窗內所有元素的平均值(平均池化)或所有元素的總和。在實際運用中,最大池化的表現更好。
圖10展示了通過2 × 2視窗在修正特徵對映(卷積+ ReLU 操作後得到)上應用最大池化操作的示例。
我們將2 x 2視窗移動2個單元格(也稱為“步幅”),並取每個區域中的最大值。如圖10所示,這樣就降低了特徵對映的維度。
在圖11所示的網路中,池化操作分別應用於每個特徵對映(因此,我們從三個輸入對映中得到了三個輸出對映)。
圖12展示了我們對圖9中經過 ReLU 操作之後得到的修正特徵對映應用池化之後的效果。
池化的作用是逐步減少輸入的空間大小[4]。具體來說有以下四點:
- 使輸入(特徵維度)更小,更易於管理
- 減少網路中的引數和運算次數,因此可以控制過擬合 [4]
- 使網路對輸入影象微小的變換、失真和平移更加穩健(輸入圖片小幅度的失真不會改池化的輸出結果 —— 因為我們取了鄰域的最大值/平均值)。
- 可以得到尺度幾乎不變的影象(確切的術語是“等變”)。這是非常有用的,這樣無論圖片中的物體位於何處,我們都可以檢測到,(詳情參閱[18]和[19])。
至此…
目前為止,我們已經瞭解了卷積,ReLU 和池化的工作原理。這些是卷積神經網路的基本組成部分,理解這一點很重要。如圖13所示,我們有兩個由卷積,ReLU 和 Pooling 組成的中間層 —— 第二個卷積層使用六個過濾器對第一層的輸出執行卷積,生成六個特徵對映。然後將 ReLU 分別應用於這六個特徵對映。接著,我們對六個修正特徵對映分別執行最大池化操作。
這兩個中間層的作用都是從影象中提取有用的特徵,在網路中引入非線性因素,同時對特徵降維並使其在尺度和平移上等變[18]。
第二個池化層的輸出即完全連線層的輸入,我們將在下一節討論。
完全連線層
完全連線層是一個傳統的多層感知器,它在輸出層使用 softmax 啟用函式(也可以使用其他分類器,比如 SVM,但在本文只用到了 softmax)。“完全連線”這個術語意味著前一層中的每個神經元都連線到下一層的每個神經元。 如果對多層感知器不甚瞭解,我建議您閱讀這篇文章。
卷積層和池化層的輸出代表了輸入影象的高階特徵。完全連線層的目的是利用這些基於訓練資料集得到的特徵,將輸入影象分為不同的類。例如,我們要執行的影象分類任務有四個可能的輸出,如圖14所示(請注意,圖14沒有展示出完全連線層中節點之間的連線)
除分類之外,新增完全連線層也是一個(通常來說)比較簡單的學習這些特徵非線性組合的方式。卷積層和池化層得到的大部分特徵對分類的效果可能也不錯,但這些特徵的組合可能會更好[11]。
完全連線層的輸出概率之和為1。這是因為我們在完全連線層的輸出層使用了 softmax 啟用函式。Softmax 函式取任意實數向量作為輸入,並將其壓縮到數值在0到1之間,總和為1的向量。
正式開始——使用反向傳播進行訓練
如上所述,卷積+池化層用來從輸入影象提取特徵,完全連線層用來做分類器。
注意,在圖15中,由於輸入影象是船,對於船類目標概率為1,其他三個類為0
- 輸入影象 = 船
- 目標向量 = [0, 0, 1, 0]
卷積網路的整體訓練過程概括如下:
- 步驟1:用隨機值初始化所有過濾器和引數/權重
- 步驟2:神經網路將訓練影象作為輸入,經過前向傳播步驟(卷積,ReLU 和池化操作以在完全連線層中的前向傳播),得到每個類的輸出概率。
- 假設上面船隻影象的輸出概率是 [0.2,0.4,0.1,0.3]
- 由於權重是隨機分配給第一個訓練樣本,因此輸出概率也是隨機的。
- 步驟3:計算輸出層的總誤差(對所有4個類進行求和)
- 總誤差=∑ ½(目標概率 – 輸出概率)²
- 步驟4:使用反向傳播計算網路中所有權重的誤差梯度,並使用梯度下降更新所有過濾器值/權重和引數值,以最小化輸出誤差。
- 根據權重對總誤差的貢獻對其進行調整。
- 當再次輸入相同的影象時,輸出概率可能就變成了 [0.1,0.1,0.7,0.1],這更接近目標向量 [0,0,1,0]。
- 這意味著網路已經學會了如何通過調整其權重/過濾器並減少輸出誤差的方式對特定影象進行正確分類。
- 過濾器數量、大小,網路結構等引數在步驟1之前都已經固定,並且在訓練過程中不會改變 —— 只會更新濾器矩陣和連線權值。
- 步驟5:對訓練集中的所有影象重複步驟2-4。
通過以上步驟就可以訓練出卷積神經網路 —— 這實際上意味著卷積神經網路中的所有權重和引數都已經過優化,可以對訓練集中的影象進行正確分類。
當我們給卷積神經網路中輸入一個新的(未見過的)影象時,網路會執行前向傳播步驟並輸出每個類的概率(對於新影象,計算輸出概率所用的權重是之前優化過,並能夠對訓練集完全正確分類的)。如果我們的訓練集足夠大,神經網路會有很好的泛化能力(但願如此)並將新圖片分到正確的類裡。
注1:為了給大家提供一個直觀的訓練過程,上述步驟已經簡化了很多,並且忽略了數學推導過程。如果想要數學推導以及對卷積神經網路透徹的理解,請參閱 [4] 和 [12]。
注2:上面的例子中,我們使用了兩組交替的卷積和池化層。但請注意,這些操作可以在一個卷積神經網路中重複執行多次。實際上,現在效果最好的一些卷積神經網路都包含幾十個卷積和池化層! 另外,每個卷積層之後的池化層不是必需的。從下面的圖16中可以看出,在進行池化操作之前,我們可以連續進行多個卷積 + ReLU 操作。另外請注意圖16卷積神經網路的每一層是如何展示的。
卷積神經網路的視覺化
一般來說,卷積步驟越多,神經網路能夠學習識別的特徵就更復雜。例如,在影象分類中,卷積神經網路在第一層可能會學習檢測原始畫素的邊緣,然後在第二層利用這些邊緣檢測簡單形狀,然後在更高階的層用這些形狀來檢測高階特徵,例如面部形狀 [14]。圖17演示了這個過程 —— 這些特徵是使用卷積深度信念網路學習的,這張圖片只是為了演示思路(這只是一個例子:實際上卷積過濾器識別出來的物件可能對人來說並沒有什麼意義)。
Adam Harley 建立了一個基於 MNIST 手寫數字資料集 [13]訓練卷積神經網路的視覺化。我強烈推薦大家 使用它來了解卷積神經網路的工作細節。
我們在下圖中可以看到神經網路對於輸入數字“8”的具體操作細節。請注意,圖18中並未單獨顯示ReLU操作。
輸入影象包含 1024 個畫素點(32 × 32 影象),第一個卷積層(卷積層1)由六個不同的5 × 5(步幅為1)過濾器與輸入影象卷積而成。如圖所示,使用六個不同的過濾器得到深度為六的特徵對映。
卷積層1之後是池化層1,它在卷積層1中的六個特徵對映上分別進行2 × 2最大池化(步幅為2)。將滑鼠指標移動到池化層的任意畫素上,可以觀察到它來自於2 x 2網格在前一個卷積層中的作用(如圖19所示)。注意到2 x 2網格中具有最大值(最亮的那個)的畫素點會被對映到池化層。
池化層1之後是十六個執行卷積操作的5 × 5(步幅為1)卷積過濾器。然後是執行2 × 2最大池化(步幅為2)的池化層2。 這兩層的作用與上述相同。
然後有三個完全連線(FC)層:
- 第一個FC層中有120個神經元
- 第二個FC層中有100個神經元
- 第三個FC層中的10個神經元對應於10個數字 —— 也稱為輸出層
注意,在圖20中,輸出層的10個節點每一個都連線到第二個完全連線層中的全部100個節點(因此稱為完全連線)。
另外,注意為什麼輸出層中唯一明亮的節點是’8’ —— 這意味著神經網路對我們的手寫數字進行了正確分類(節點亮度越高表示它的輸出更高,即8在所有數字中具有最高的概率)。
該視覺化系統的 3D 版本在此。
其他卷積神經網路框架
卷積神經網路始於20世紀90年代初。我們已經討論了LeNet,它是最早的卷積神經網路之一。下面列出了其他一些有影響力的神經網路框架 [3] [4]。
- LeNet (20世紀90年代):本文已詳述。
- 20世紀90年代到2012年:從20世紀90年代後期到2010年初,卷積神經網路正處於孵化期。隨著越來越多的資料和計算能力的提升,卷積神經網路可以解決的任務變得越來越有趣。
- AlexNet(2012) – 2012年,Alex Krizhevsky(和其他人)釋出了 AlexNet,它是提升了深度和廣度版本的 LeNet,並在2012年以巨大優勢贏得了 ImageNet 大規模視覺識別挑戰賽(ILSVRC)。這是基於之前方法的重大突破,目前 CNN 的廣泛應用都要歸功於 AlexNet。
- ZF Net(2013) – 2013年 ILSVRC 獲獎者來自 Matthew Zeiler 和 Rob Fergus 的卷積網路。它被稱為 ZFNet(Zeiler 和 Fergus Net 的簡稱)。它在 AlexNet 的基礎上通過調整網路框架超引數對其進行了改進。
- GoogLeNet(2014) – 2014年 ILSVRC 獲獎者是 Google 的 Szegedy 等人的卷積網路。其主要貢獻是開發了一個初始模組,該模組大大減少了網路中的引數數量(4M,而 AlexNet 有60M)。
- VGGNet(2014) – 2014年 ILSVRC 亞軍是名為 VGGNet 的網路。其主要貢獻在於證明了網路深度(層數)是影響效能的關鍵因素。
- ResNets(2015) – 何凱明(和其他人)開發的殘差網路是2015年 ILSVRC 的冠軍。ResNets 是迄今為止最先進的卷積神經網路模型,並且是大家在實踐中使用卷積神經網路的預設選擇(截至2016年5月)。
- DenseNet(2016年8月) – 最近由黃高等人發表,密集連線卷積網路的每一層都以前饋方式直接連線到其他層。 DenseNet 已經在五項競爭激烈的物件識別基準測試任務中證明自己比之前最先進的框架有了顯著的改進。具體實現請參考這個網址。
結論
本文中,我嘗試著用一些簡單的術語解釋卷積神經網路背後的主要概念,同時簡化/略過了幾個細節部分,但我希望這篇文章能夠讓你直觀地理解其工作原理。
本文最初是受 Denny Britz 《理解卷積神經網路在自然語言處理上的運用》這篇文章的啟發(推薦閱讀),文中的許多解釋是基於這篇文章的。為了更深入地理解其中一些概念,我鼓勵您閱讀史丹佛大學卷積神經網路課程的筆記以及一下參考資料中提到的其他很棒的資源。如果您對上述概念的理解遇到任何問題/建議,請隨時在下面留言。
文中所使用的所有影象和動畫均屬於其各自的作者,陳列如下。
參考
- karpathy/neuraltalk2: Efficient Image Captioning code in Torch, Examples
- Shaoqing Ren, et al, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015, arXiv:1506.01497
- Neural Network Architectures, Eugenio Culurciello’s blog
- CS231n Convolutional Neural Networks for Visual Recognition, Stanford
- Clarifai/Technology
- Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks
- Feature extraction using convolution, Stanford
- Wikipedia article on Kernel (image processing)
- Deep Learning Methods for Vision, CVPR 2012 Tutorial
- Neural Networks by Rob Fergus, Machine Learning Summer School 2015
- What do the fully connected layers do in CNNs?
- Convolutional Neural Networks, Andrew Gibiansky
- W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link). Demo
- Understanding Convolutional Neural Networks for NLP
- Backpropagation in Convolutional Neural Networks
- 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
- What is the difference between deep learning and usual machine learning?
- How is a convolutional neural network able to learn invariant features?
- A Taxonomy of Deep Convolutional Neural Nets for Computer Vision
- Honglak Lee, et al, “Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations” (link)