一、卷積神經網絡的基本概念
卷積神經網絡與普通神經網絡的區別在於,卷積神經網絡包含了一個由卷積層和子采樣層(池化層)構成的特征抽取器。在卷積神經網絡的卷積層中,一個神經元只與部分鄰層神經元連接。在CNN的一個卷積層中,通常包含若干個特征圖(featureMap),每個特征圖由一些矩形排列的的神經元組成,同一特征圖的神經元共享權值,這里共享的權值就是卷積核。卷積核一般以隨機小數矩陣的形式初始化,在網絡的訓練過程中卷積核將學習得到合理的權值。共享權值(卷積核)帶來的直接好處是減少網絡各層之間的連接,同時又降低了過擬合的風險。子采樣也叫做池化(pooling),通常有均值子采樣(mean pooling)和最大值子采樣(max pooling)兩種形式。子采樣可以看作一種特殊的卷積過程。卷積和子采樣大大簡化了模型復雜度,減少了模型的參數。
二、卷積神經網絡的基本原理
2.1 神經網絡
首先介紹神經網絡,神經網絡的每個單元如下:
其對應的公式如下:
其中,該單元也可以被稱作是Logistic回歸模型。當將多個單元組合起來並具有分層結構時,就形成了神經網絡模型。下圖展示了一個具有一個隱含層的神經網絡。
其對應的公式如下:
比較類似的,可以拓展到有2,3,4,5,…個隱含層。
神經網絡的訓練方法也同Logistic類似,不過由於其多層性,還需要利用鏈式求導法則對隱含層的節點進行求導,即梯度下降+鏈式求導法則,專業名稱為反向傳播。關於訓練算法的相關原理及操作過程,可參見之前寫的關於BP算法https://blog.csdn.net/qq_42570457/article/details/81454008。
2.2 卷積神經網絡
首先,我們先獲取一個感性認識,下圖是一個卷積神經網絡的實例:
卷積神經網絡通常包含以下幾種層:
- 卷積層(Convolutional layer),卷積神經網路中每層卷積層由若干卷積單元組成,每個卷積單元的參數都是通過反向傳播算法優化得到的。卷積運算的目的是提取輸入的不同特征,第一層卷積層可能只能提取一些低級的特征如邊緣、線條和角等層級,更多層的網絡能從低級特征中迭代提取更復雜的特征。
- 線性整流層(Rectified Linear Units layer, ReLU layer),這一層神經的活性化函數(Activation function)使用線性整流(Rectified Linear Units, ReLU)f(x)=max(0,x)f(x)=max(0,x)。
- 池化層(Pooling layer),通常在卷積層之后會得到維度很大的特征,將特征切成幾個區域,取其最大值或平均值,得到新的、維度較小的特征。
- 全連接層( Fully-Connected layer), 把所有局部特征結合變成全局特征,用來計算最后每一類的得分。
2.2.1 卷積層(Convolutional layer)
卷積層是卷積神經網絡的核心基石。在圖像識別里我們提到的卷積是二維卷積,即離散二維濾波器(也稱作卷積核)與二維圖像做卷積操作,簡單的講是二維濾波器滑動到二維圖像上所有位置,並在每個位置上與該像素點及其領域像素點做內積。卷積操作被廣泛應用與圖像處理領域,不同卷積核可以提取不同的特征,例如邊沿、線性、角等特征。在深層卷積神經網絡中,通過卷積操作可以提取出圖像低級到復雜的特征。
上圖給出一個卷積計算過程的示例圖,輸入圖像大小為H=5,W=5,D=3,即5×5大小的3通道(RGB,也稱作深度)彩色圖像。這個示例圖中包含兩(用K表示)組卷積核,即圖中濾波器W0和W1。在卷積計算中,通常對不同的輸入通道采用不同的卷積核,如圖示例中每組卷積核包含(D=3)個3×3(用F×F表示)大小的卷積核。另外,這個示例中卷積核在圖像的水平方向(W方向)和垂直方向(H方向)的滑動步長為2(用S表示);對輸入圖像周圍各填充1(用P表示)個0,即圖中輸入層原始數據為藍色部分,灰色部分是進行了大小為1的擴展,用0來進行擴展。經過卷積操作得到輸出為3×3×2(用Ho×Wo×K表示)大小的特征圖,即3×3大小的2通道特征圖,其中Ho計算公式為:Ho=(H−F+2×P)/S+1,Wo同理。 而輸出特征圖中的每個像素,是每組濾波器與輸入圖像每個特征圖的內積再求和,再加上偏置bo,偏置通常對於每個輸出特征圖是共享的。輸出特征圖o[:,:,0]中的最后一個−2計算如上圖右下角公式所示。
記住這幾個符號:
- H:圖片高度;
- W:圖片寬度;
- D:原始圖片通道數,也是卷積核個數;
- F:卷積核高寬大小;
- P:圖像邊擴充大小;
- S:滑動步長。
- K: 深度,輸出單元的深度
在卷積操作中卷積核是可學習的參數,經過上面示例介紹,每層卷積的參數大小為D×F×F×K。卷積層的參數較少,這也是由卷積層的主要特性即局部連接和共享權重所決定。
- 局部連接:每個神經元僅與輸入神經元的一塊區域連接,這塊局部區域稱作感受野(receptive field)。在圖像卷積操作中,即神經元在空間維度(spatial dimension,即上圖示例H和W所在的平面)是局部連接,但在深度上是全部連接。對於二維圖像本身而言,也是局部像素關聯較強。這種局部連接保證了學習后的過濾器能夠對於局部的輸入特征有最強的響應。局部連接的思想,也是受啟發於生物學里面的視覺系統結構,視覺皮層的神經元就是局部接受信息的。
- 權重共享:計算同一個深度切片的神經元時采用的濾波器是共享的。例上圖中計算o[:,:,0]的每個每個神經元的濾波器均相同,都為W0,這樣可以很大程度上減少參數。共享權重在一定程度上講是有意義的,例如圖片的底層邊緣特征與特征在圖中的具體位置無關。但是在一些場景中是無意的,比如輸入的圖片是人臉,眼睛和頭發位於不同的位置,希望在不同的位置學到不同的特征 。請注意權重只是對於同一深度切片的神經元是共享的,在卷積層,通常采用多組卷積核提取不同特征,即對應不同深度切片的特征,不同深度切片的神經元權重是不共享。另外,偏重對同一深度切片的所有神經元都是共享的。
通過介紹卷積計算過程及其特性,可以看出卷積是線性操作,並具有平移不變性(shift-invariant),平移不變性即在圖像每個位置執行相同的操作。卷積層的局部連接和權重共享使得需要學習的參數大大減小,這樣也有利於訓練較大卷積神經網絡。
整體計算過程如下(與上圖中的數據不同,但是計算過程相同):
2.2.2 線性整流層(Rectified Linear Units layer, ReLU layer)--激勵層
把卷積層輸出結果做非線性映射。
CNN采用的激勵函數一般為ReLU(The Rectified Linear Unit/修正線性單元),它的特點是收斂快,求梯度簡單,但較脆弱,圖像如下。
激勵層的實踐經驗:
①不要用sigmoid!不要用sigmoid!不要用sigmoid!
② 首先試RELU,因為快,但要小心點
③ 如果2失效,請用Leaky ReLU或者Maxout
④ 某些情況下tanh倒是有不錯的結果,但是很少
2.2.3 池化層(Pooling layer)
池化(pool)即下采樣(downsamples),目的是為了減少特征圖,主要作用是通過減少網絡的參數來減小計算量,並且能夠在一定程度上控制過擬合。通常在卷積層的后面會加上一個池化層。池化操作對每個深度切片獨立,規模一般為 2*2,相對於卷積層進行卷積運算,池化層進行的運算一般有以下幾種:
* 最大池化(Max Pooling)。取4個點的最大值。這是最常用的池化方法。
* 均值池化(Mean Pooling)。取4個點的均值。
* 高斯池化。借鑒高斯模糊的方法。不常用。
* 可訓練池化。訓練函數 ff ,接受4個點為輸入,出入1個點。不常用。
最常見的池化層是規模為2*2, 步幅為2,對輸入的每個深度切片進行下采樣。每個MAX操作對四個數進行,如下圖所示:
池化操作將保存深度大小不變。如果池化層的輸入單元大小不是二的整數倍,一般采取邊緣補零(zero-padding)的方式補成2的倍數,然后再池化。
2.2.4 全連接層( Fully-Connected layer)
全連接層和卷積層可以相互轉換:
* 對於任意一個卷積層,要把它變成全連接層只需要把權重變成一個巨大的矩陣,其中大部分都是0 除了一些特定區塊(因為局部感知),而且好多區塊的權值還相同(由於權重共享)。
* 相反地,對於任何一個全連接層也可以變為卷積層。
2.2.5 反向傳播
下面講解卷積層的反向傳播過程:
(由於公式格式不太好整理,所以用截圖代替)
其他關於反向傳播的介紹:
http://www.cnblogs.com/pinard/p/6494810.html
三、其他
一般CNN結構依次為
1. INPUT
2. [[CONV -> RELU]*N -> POOLING]*M
3. [FC -> RELU]*K
4. FC
卷積神經網絡之訓練算法
1. 同一般機器學習算法,先定義Loss function,衡量和實際結果之間差距。
2. 找到最小化損失函數的W和b, CNN中用的算法是SGD(隨機梯度下降)。
卷積神經網絡之優缺點
優點
• 共享卷積核,對高維數據處理無壓力
• 無需手動選取特征,訓練好權重,即得特征分類效果好
缺點
• 需要調參,需要大樣本量,訓練最好要GPU
• 物理含義不明確(也就說,我們並不知道沒個卷積層到底提取到的是什么特征,而且神經網絡本身就是一種難以解釋的“黑箱模型”)
卷積神經網絡之典型CNN
• LeNet,這是最早用於數字識別的CNN
• AlexNet, 2012 ILSVRC比賽遠超第2名的CNN,比
• LeNet更深,用多層小卷積層疊加替換單大卷積層。
• ZF Net, 2013 ILSVRC比賽冠軍
• GoogLeNet, 2014 ILSVRC比賽冠軍
• VGGNet, 2014 ILSVRC比賽中的模型,圖像識別略差於GoogLeNet,但是在很多圖像轉化學習問題(比如object detection)上效果奇好