傳統神經網絡:
是全連接形式,即樣本的每個特征屬性都通過所有的隱藏層節點映射,最后輸出數據。由於是全連接,所以計算極為復雜,且模型不易學習。
卷積神經網絡:卷積神經網絡(Convolutional Neural Networks, CNN), CNN可以有效的降低反饋神經網絡(傳統神經網絡)的復雜性,常見的CNN結構有LeNet-5、AlexNet、ZFNet、VGGNet、 GoogleNet、 ResNet等等 ,其中在LVSVRC2015冠軍ResNet網絡深度是AlexNet的20多倍,是VGGNet的8倍;從這些結構來講CNN發展的一個方向就是層次的增加,通過這種方式可以利用增加的非線性得出目標函數的近似結構,同時得出更好的特征表達,但是這種方式導致了網絡整體復雜性的增加,使網絡更加難以優化,很容易過擬合或模型退化。CNN的應用主要是在圖像分類、人臉識別、和物體識別、語義分割等應用比較多。
首要步驟:數據預處理:
需要進行預處理的主要原因是:
◆輸入數據單位不-樣,可能會導致神經網絡收斂速度慢, 訓練時間長
◆數據范圍大(方差大)的輸入在模式分類中的作用可能偏大,而數據范圍小的作用就有可能偏小
◆由於神經網絡中存在的激活函數是有值域限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域
◆S形激活函數在(-4, 4)區間以外區域很平緩,區分度太小。例如S形函數f(X), f(100)與f(5)只相差0.0067
常見3種數據預處理方式:
◆去均值
將輸入數據的各個維度中心化到0
◆歸一化
將輸入數據的各個維度的幅度歸一化到同樣的范圍
◆PCA/白化(不常用)
用PCA降維(去掉特征與特征之間的相關性)
白化是在PCA的基礎上,對轉換后的數據每個特征軸.上的幅度進行歸一化
cnn的統計學原理
1、統計不變性:指基本不會隨着時間和空間改變的事物。
2、無論貓處在什么位置,檢測出來都應該是貓,這稱為平移不變性。
3、所以如果網絡從左上角學到了貓咪的特征,那么這部分特征應該可以被重復利用,而不需要重復學習去識別圖右下角的貓咪。這種學習方法就稱為:權重共享(weights sharing)---進而引出了:卷積神經網絡CNN (空間. 上共享參數的神經網絡)
4、這種思想應用到自然語言處理,就產生了embeding嵌入和RNN網絡
問題: CNN為什么具備平移不變性?尺度不變性?
因為共享權重值
CNN具備旋轉不變性?不具備。(但是通過數據增強, 人為旋轉圖片喂入模型,讓模型學會)
第二個首要步驟:
■在卷積神經網絡中,可以看到神經元之間的連接是通過權重w以及偏置b實現的。在具
體的神經網絡之前,我們還有一個任務需要做,那就是初始化參數
◆權重的初始化
一般方式:很小的隨機數(對於多層深度神經網絡,太小的值會導致回傳的梯度非常小), -般隨機
數是服從均值為0,差末知(建議: 2/n. n為權重數量, https://arxiv.org/pdf/1502.01852.pdf)
的高斯分布隨機數列。
錯誤方式:全部初始化為0,全部設置為0,在反向傳播的時候是一樣的梯度值, 那么這個網絡的
權重是沒有辦法差異化的,也就沒有辦法學習到東西。
◆偏置項的初始化
一般直接設置為0,在存在ReLU激活函數的網絡中,也可以考慮設置為一個很小的數字
CNN的流程:輸入層
[卷積層+批歸一化+relu之類的激活函數+ dropout(可選)]
*N池化層*M-拉平層-[FC+ 批歸一化+激活]*K
輸出層
激活函數(分類用:softmax或sigmoid)
input層:首先一個數據輸入進來,假設為一張圖片,rgb格式,三通道,長寬是32*32
卷積層:設定一個卷積核,又稱濾波器。這里設定為5*5*3,通道數3要和上一步驟的通道數一樣,此處為輸入圖片的通道數。一個卷積核提取的是一個特征,設定多個卷積提取的是多個不同特征
設定一個步長。步長意為濾波器每次走的步數,步長為1時,最后得到的矩陣大小一樣,為2時,矩陣大小就成了原矩陣的二分之一。
進行卷積運算(原始圖像是真實圖像,其經過卷積運算后的矩陣,稱為特征圖像,feature_map):
步長也分橫向縱向的
很多時候為了避免圖像內的像素點的特征總是被重復提取,以及邊緣的特征的值總是很少被提取,所以可以在原始圖片數據矩陣四周填充幾圈0,稱為padding填充。
此例是三個通道的原始圖像,所以有三層的濾波器,卷積操作后生成了三個特征圖。
我們通過第一個卷積核進行的操作提取了(原圖第一層通道)的不同位置的同樣特征,由於所有位置都是用的統一卷積核,即神經元之間連接的權重不變
我們通過第2個卷積核進行的操作提取了(原圖第2層通道)的不同位置的同樣特征,然后第三層。
最后,三個通道的總共三個特征圖加一起,再加個偏置項,組成卷積層的輸出的矩陣(矩陣數就是想提取的特征數),見過程演示
過程演示:http://cs231n.qithub.io/assets/conv-demo/index.html
激活:
將卷積層的輸出結果做一次非線性的映射,也就是做一次“激活”
如果輸入變化很小,導致輸出結構發生截然不同的結果,這種情況是我們不希望看到的,為了模擬更細微的變化,輸入和輸出數值不只是0到1,可以是0和1之間的任何數,
激活函數是用來加入非線性因素的,因為線性模型的表達力不夠
這句話字面的意思很容易理解,但是在具體處理圖像的時候是什么情況呢?我們知道在神經網絡中,對於圖像,我們主要采用了卷積的方式來處理,也就是對每個像素點賦予一個權值,這個操作顯然就是線性的。但是對於我們樣本來說,不一定是線性可分的,為了解決這個問題,我們可以進行線性變化,或者我們引入非線性因素,解決線性模型所不能解決的問題。
常用非線性激活函數:
◆Sigmoid(S形函數)
◆Tanh(雙曲正切,雙S形函數)
◆ReLU
◆Leaky ReLU
◆ELU
其中前兩個s形激活函數需要先對輸入數據歸一化,否則激活后的值都會進入平坦區,使隱層的輸出全部趨同
激活之后可選用dropout來解決過擬合問題:
神經網絡的學習能力受神經元個數與神經網絡層次的深度影響,個數越多,層數越深,學習能力越強,越容易造成過擬合。為解決過擬合,有兩種方法,一是正則化,通過在損失函數上加L1,或L2正則項。二是dropout方法,Dropout:通過隨機刪除神經網絡中的神經元來解決vefting問題,在每次迭代的時候,只使用部分神經元訓練模型獲取W和d的值一般情況下, 對於同一組訓練數據,利用不同的神經網絡訓練之后,求其輸出的平均值可以減少overfitting。
Dropout就是利用這個原理 ,每次丟掉一半左右的隱藏層神經元,相當於在不同的神經網絡上進行訓練,這樣就減少了神經元之間的依賴性,即每個神經元不能依賴於某幾個其它的神經元(指層與層之間相連接的神經元),使神經網絡更加能學習到與其它神經元之間的更加健壯robust (魯棒性)的特征。另外Dropout不僅減少overfitting, 還能提高測試集准確率。(訓練數據集有時會降低)
池化層:
池化的目的是為了縮小圖像(或稱為下采樣(subsampled)或降采樣(downsampled)),其主要目的有兩個:
1、使得圖像符合顯示區域的大小;
2、生成對應圖像的縮略圖。
■在連續的卷積層中間存在的就是池化層,可以說每卷積計算后加上偏置項后就池化一次
主要功能是:通過逐步減小表征的空間尺寸來減小參數量和網絡中的計算;池化層在每個特征圖上獨立操作。使用池化層替代卷積層可以達到壓縮數據和參數的量,減小過擬合。
拉平層:將池化后的特征圖,拉伸成向量,
# 拉平層 [N, 28/4, 28/4, 64] ---> [N, 7*7*64] shape = pool2.get_shape() # [N, 7, 7, 64] flatten_shape = shape[1] * shape[2] * shape[3] flatted = tf.reshape(pool2, shape=[-1, flatten_shape])
全連接層:最后進行全連接,卷積取的是局部特征,全連接就是把以前的局部特征重新通過權值矩陣組裝成完整的圖。全連接是用來解決最后的分類問題,因為用到了所有的局部特征,所以叫全連接。 而最后全連接層是否可以用其他分類方法替代呢?比如隨機森林,是可以的。
也可以俗氣的理解:假設你是一只小螞蟻,你的任務是找小面包。你的視野還比較窄,只能看到很小一片區域。當你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你們全部的螞蟻開了個會,把所有的小面包都拿出來分享了。全連接層就是這個螞蟻大會~
簡單來說:它把特征representation整合到一起,輸出為一個值。這樣做,有一個什么好處:就是大大減少特征位置對分類帶來的影響。
注:樣本標記空間也叫樣本輸出空間。
再舉個例子說明上述的過程:
從上圖我們可以看出,貓在不同的位置,輸出的feature值相同,但是位置不同。對於電腦來說,那分類結果也可能不一樣。
而這時全連接層filter的作用就相當於:貓在哪我不管,只要找到貓就可以,於是讓全連接層filter去把這個貓找到,實際就是把feature map 整合成一個值。
這個值大,有貓,這個值小,那就可能沒貓,這和貓在哪關系不大了,魯棒性大大增強了!
因為空間結構特性被忽略了,所以全連接層不適合用於在方位上找模式的任務,比如分割。
全連接層為什么大部分是兩層?
只用一層fully connected layer 有時候沒法解決非線性問題,而如果有兩層或以上fully connected layer就可以很好地解決非線性問題了。
批歸一化:
梯度消失原因:是鏈式求導法則,導致梯度逐層遞減,我們BP第一節推倒公式時就是通過鏈式求導把各層連接起來的,但是因為激活函數是SIGMOD函數,取值在1和-1之間,因此每次求導都會比原來小,當層次較多時,就會導致求導結果也就是梯度接近於0。
以前在神經網絡訓練中,為解決梯度消散,只是對輸入層數據進行歸一化處理,卻沒有在中間層進行歸一化處理。要知道,雖然我們對輸入數據進行了歸一化處理,但是輸入數據經過矩陣乘法以及非線性運算之后,其數據分布很可能被改變,而隨着深度網絡的多層運算之后,數據分布的變化將越來越大。如果我們能在網絡的中間也進行歸一化處理,是否對網絡的訓練起到改進作用呢?答案是肯定的。
這種在神經網絡中間層也進行歸一化處理,使訓練效果更好的方法,就是批歸一化Batch Normalization(BN)。
BN的流程:
1.求每一個訓練批次數據的均值
2.求每一個訓練批次數據的方差
3.使用求得的均值和方差對該批次的訓練數據做歸一化,獲得0-1分布。其中εε是為了避免除數為0時所使用的微小正數。
4.重構(尺度變換和偏移):將xi乘以γ調整數值大小,再加上β增加偏移后得到yi,這里的γ是尺度因子,β是平移因子。這一步是BN的精髓,由於歸一化后的xi基本會被限制在正態分布下,使得網絡的表達能力下降。為解決該問題,我們引入兩個新的參數:γ,β。 γ和β是在訓練時(梯度反向傳播更新,即BP)網絡自己學習得到的。
卷積神經網絡優缺點:
■優點
◆共享卷積核(共享參數),對高維數據的處理沒有壓力
◆無需選擇特征屬性,只要訓練好權重,即可得到特征值
◆深層次的網絡抽取圖像信息比較豐富,表達效果好
■缺點
◆需要調參,需要大量樣本,訓練迭代次數比較多,最好使用GPU訓練
◆黑箱:物理含義不明確,從每層輸出中很難看出含義來
反向傳播求梯度值,從而用梯度下降去更新模型參數
全連接層反向傳播 求w與b的梯度
卷積層反向傳播 求w與b的梯度
池化層反向傳播 沒有w與b,也用不着求w與b的梯度
最后得到w與b的梯度
關於各層反向傳播,這位博主寫的很好,可以引用。https://blog.csdn.net/kyang624823/article/details/78633897
事實上,梯度下降時,是可以對梯度下降法進行優化的。
動量梯度下降法(Momentum)
- 另一種成本函數優化算法,優化速度一般快於標准的梯度下降算法.
-
基本思想:計算梯度的指數加權平均數並利用該梯度更新你的權重
-
假設圖中是你的成本函數,你需要優化你的成本函數函數形象如圖所示.其中紅點所示就是你的最低點.使用常規的梯度下降方法會有擺動這種波動減緩了你訓練模型的速度,不利於使用較大的學習率,如果學習率使用過大則可能會偏離函數的范圍.為了避免擺動過大,你需要選擇較小的學習率.
- 而是用Momentum梯度下降法,我們可以在縱向減小擺動的幅度在橫向上加快訓練的步長.
基本公式
RMSprop(均方根)
RMSprop (root mean square prop),也可以加速梯度下降.
- 對於梯度下降,橫軸方向正在前進,但是縱軸會有大幅度的波動.我們現將橫軸代表參數W,縱軸代表參數b.橫軸也可以代表但是為了便於理解,我們將其稱之為b和W
- w的在橫軸上變化變化率很小,所以dw的值十分小,所以也小,而b在縱軸上波動很大,所以斜率在b方向上特別大.所以這些微分中,db較大,dw較小.這樣W除數是一個較小的數,總體來說,W的變化很大.而b的除數是一個較大的數,這樣b的更新就會被減緩.縱向的變化相對平緩.
- 注意:這里的W和b標記只是為了方便展示,在實際中這是一個高維的空間,很有可能垂直方向上是W1,W2,W5..的合集而水平方向上是W3,W4,W6...的合集.
- 實際使用中公式建議為:
為了保證實際使用過程中分母不會為0.
- 主要目的是為了減緩參數下降時的擺動,並允許你使用一個更大的學習率,從而加快你的算法速率.
Adam算法
Adam 算法基本原理是將Momentum和RMSprop結合在一起.
算法原理
超參數取值