前面, 我們介紹了DNN及其參數求解的方法(BP算法),我們知道了DNN仍然存在很多的問題,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸的問題.那麼,人們又是怎麼解決這個問題的呢?本節的卷積神經網絡(Convolutional Neural Networks, CNN)就是一種解決方法.
我們知道神經網絡主要有三個部分組成, 分別爲:
① 網絡結構--- 描述神經元的層次與連接神經元的結構.
② 激活函數(激勵函數)--- 用於加入非線性的因素, 解決線性模型所不能解決的問題.
③ 參數學習方法的選擇(一般爲權重值W和偏置項b)---如BP算法等.
我們將主要從這幾個方面進行講述.
一 CNN的應用領域
CNN在以下幾個領域均有不同程度的應用:
① 圖像處理領域(最主要運用領域)--- 圖像識別和物體識別,圖像標註,圖像主題生成,圖像內容生成,物體標註等。
② 視頻處理領域--- 視頻分類,視頻標準,視頻預測等
③ 自然語言處理(NLP)領域--- 對話生成,文本生成,機器翻譯等
④ 其它方面--- 機器人控制,遊戲,參數控制等
二 CNN的網絡結構
2.1 從傳統神經網絡到CNN
圖2.1 傳統的神經網絡的結構
圖2.2 CNN的網絡結構
如圖2.1爲傳統的神經網絡的結構, 它是一種全連接的結構, 這也就造成了參數訓練的難度加深. 還有BP求解中的可能出現的梯度爆炸和梯度消失的現象等.此外,深度結構(涉及多個非線性處理單元層)非凸目標代價函數中普遍存在的局部最小是訓練困難的主要來源. 這些因素都造成了傳統的神經網絡的不適用性,所以沒有較爲廣泛的運用.
如圖2.2爲CNN的網絡結構--- 爲了解決傳統的神經網絡的複雜性.
CNN的網絡結構和傳統神經網絡結構異同點有:
1) CNN主要有數據輸入層, 卷積層, RELU激勵層, 池化層, 全連接層, Batch Normalization Layer(不一定存在). 傳統神經網絡主要有數據輸入層, 一個或多個隱層以及數據輸出層. 比較可以發現CNN仍然使用傳統神經網絡的層級結構.
2) CNN的每一層都具有不同的功能, 而傳統神經網絡每一層都是對上一層特徵進行線性迴歸, 再進行非線性變換的操作.
3) CNN使用RELU作爲激活函數(激勵函數) , 傳統神經網絡使用sigmoid函數作爲激活函數.
4) CNN的池化層實現數據降維的作用,提取數據的高頻信息.傳統神經網絡沒有這個作用.
2.2 CNN的主要層次介紹
2.2.1 數據輸入層 (Input Layer)
由於給定的數據總會存在着數據(圖片)的大小不一,單位不一以及激活函數的值域等因素的影響,我們對將要進行處理的數據有一定的要求.所以,同機器學習一樣,我們在進行數據輸入時首先要進行數據的預處理的工作.
常見的數據預處理的方式有以下幾種:
1) 均值化處理 --- 即對於給定數據的每個特徵減去該特徵的均值(將數據集的數據中心化到0)
2) 歸一化操作 --- 在均值化的基礎上再除以該特徵的方差(將數據集各個維度的幅度歸一化到同樣的範圍內)
3) PCA降維 --- 將高維數據集投影到低維的座標軸上, 並要求投影后的數據集具有最大的方差.(去除了特徵之間的相關性,用於獲取低頻信息)
4) 白化 --- 在PCA的基礎上, 對轉換後的數據每個特徵軸上的幅度進行歸一化.用於獲取高頻信息.
備註:雖然我們介紹了PCA去相關和白化的操作,但是實際上在卷積神經網絡中,一般並不會適用PCA和白化的操作,一般去均值和歸一化使用的會比較多.
圖2.3 均值化,歸一化處理的效果圖
圖2.4 PCA降維和白化的效果圖
2.2.2 卷積計算層(CONV Layer)
這一層就是卷積神經網絡最重要的一層,也是“卷積神經網絡”的名字由來。
1) 局部感知
對於給定的一張圖片, 人眼總是習慣性的先關注那些重要的點(局部), 再到全局. 局部感知是將整個圖片分爲多個可以有局部重疊的小窗口, 通過滑窗的方法進行圖像的局部特徵的識別. 也可以說每個神經元只與上一層的部分神經元相連, 只感知局部, 而不是整幅圖像.
那麼,爲什麼可以使用局部感知呢?
我們發現, 越是接近的像素點之間的關聯性越強, 反之則越弱. 所以我們選擇先進行局部感知, 然後在更高層(FC層)將這些局部信息綜合起來得到全局信息的方式.
2) 參數共享機制
所謂的參數共享就是就是同一個神經元使用一個固定的卷積核去卷積整個圖像,也可以認爲一個神經元只關注一個特徵. 而不同的神經元關注多個不同的特徵.(每一個神經元都可以看作一個filter)
3) 滑動窗口的重疊
滑動窗口重疊就是在進行滑窗的過程中對於相鄰的窗口有局部重疊的部分,這主要是爲了保證圖像處理後的各個窗口之間的邊緣的平滑度.
4)) 卷積計算
卷積的計算就是: 對於每一個神經元的固定的卷積核矩陣與窗口矩陣的乘積(對應位置相乘)再求和之後再加上偏置項b的值, 就得到了代表該神經元所關注的特徵在當前圖像窗口的值.
如圖2.4所示, 可以看出卷積計算的過程.動態圖點擊這裏查看.
圖2.4 卷積計算圖
2.2.3 RELU激勵層
這一層就是激活層, 在CNN中一般使用RELU函數作爲激活函數.它的作用主要是將卷積層的輸出結果做非線性映射.
1) 常見的幾種激活函數
① sigmoid函數(S函數)
② Tanh函數(2S函數)
③ RELU函數 ----> 線性修正單元 ---> max{ 0, x } ==>無邊界, 易出現'死神經元'
④ Leaky ReLU 函數 ---> 若x> 0 , 則輸出x ; 若x<0,則 alpha*x, 其中 0< alpha <1 ==> 對RELU的改進
⑤ ELU 函數 ---> 若x> 0 , 則輸出x ; 若x<0,則 alpha*(e^x - 1), 其中 0< alpha <1 ==> 也是一種對RELU的改進
⑥ Maxout函數 ---> 相當於增加了一個激活層
2) 激活函數的一些建議
① 一般不要使用sigmoid函數作爲CNN的激活函數.如果用可以在FC層使用.
② 優先選擇RELU作爲激活函數
③ 如果2失效,請用Leaky ReLU或者Maxout
④ 在極少的情況下, tanh也是有不錯的效果的
2.2.4 池化層 (Poling Layer)
池化層主要用於壓縮數據和參數量, 減小過擬合。簡而言之,如果輸入是圖像的話,那麼池化層的最主要作用就是壓縮圖像。
池化層中的數據壓縮的策略主要有:
① Max Pooling(最大池化)---> 選擇每個小窗口中最大值作爲需要的特徵像素點(省略掉不重要的特徵像素點)
② Average Pooling(平均池化) ---> 選擇每個小窗口中平均值作爲需要的特徵像素點
池化層選擇較爲重要的特徵點, 可以降低維度, 能夠在一定程度上防止過擬合的發生.
2.2.5 FC全連接層
通過全連接結構,將前面輸出的特徵重新組合成一張完整的圖像.
2.2.6 Batch Normalization Layer(一般用於卷積層後面,主要是使得期望結果服從高斯分佈,使用較少!!)
三 CNN的優缺點
最後, 簡單總結下CNN的優缺點.
優點:
① 使用局部感知和參數共享機制, 對於較大的數據集處理能力較高.
② 能夠提取圖像的深層次的信息,模型表達效果好.
③ 不需要手動進行特徵選擇, 只要訓練好卷積核W和偏置項b, 即可得到特徵值.
缺點:
① 需要進行調參, 模型訓練時間較長, 需要的樣本較多, 一般建議使用GPU進行模型訓練.
② 物理含義不明, 每層中的結果無法解釋, 這也是神經網絡的共有的缺點.
參考文獻
[2] 卷積神經網絡CNN總結