天天看點

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

1.摘要

       2010年ImageNet LSVRC -2010競賽中,AlexNet用來在1.2millon高分辨率圖檔上辨識1000個類别,并取得了top1,top5錯誤率為37.5%和17%。取得了目前的最高水準。該網絡使用了60millon參數和650000個神經元,包含5個卷積層 ,3個全連接配接層。為了使訓練更加快速,我們使用了非飽和神經元和兩個GPU進行運算。為了減少過拟合,文中首次提出了dropout正則化方法。在ILSVRC2012年的比賽中,我們的top5錯誤率達到了15.3%,遠低于第二名的26.3%。

2.資料集:

      ImageNet資料集包括15millon張高分辨率圖檔,22000個類别,ILSVRC 使用ImageNet資料集中1000個類别,且每個類别大約1000張圖檔。是以,大約有1.2millon訓練圖檔,50000張驗證集,150000張測試集。ILLSVRC-2010是ILSVRC系列比賽中唯一一個提供測試集的,是以我們在2010的比賽中取得了最好的效果。

     實驗中,我們會經常使用top1,top5錯誤率,top5錯誤率是對一個圖檔類别預測的前五個類别不包含正确的比例.

     ImageNet中包含不同分辨率的圖檔,但是我們的系統需要輸入統一的尺寸。是以,我們采用下采樣得到固定大小256*256大小的圖檔。下采樣的方法是:我們首先重新縮放圖像,使得短邊長度為256,然後從得到的圖像中裁剪出中央256×256的一片,除了周遊訓練集從每個像素中減去平均活躍度外,我們沒有以任何其他方式預處理圖像。是以我們用這些像素(中央那一片的)原始RGB值訓練網絡。(這裡也就是對圖像的每個像素進行中心化處理,即對每個圖像對應像素的R,G,B三個值分别求均值,然後每個圖像的每個像素的R值-R平均,G值-G平均,B值-B平均)

3.結構

   AlexNet包括5個卷積層,3個全連接配接層

3.1Relu不飽和非線性激活函數

      3.1.1為什麼我們要引入激活函數?

       如果不用激勵函數(其實相當于激勵函數是f(x) = x),在這種情況下你每一層輸出都是上層輸入的線性函數,很容易驗證,無論你神經網絡有多少層,輸出都是輸入的線性組合,與沒有隐藏層效果相當,這種情況就是最原始的感覺機(Perceptron)了。非線性激活函數的作用就是增加神經網絡非線性特性,進而增加其表示能力。

       3.1.2為什麼要使用relu(不飽和非線性激活函數)?而使用sigmoid,tanh?

       sigmoid神經元有一個不好的特性,就是當神經元的激活在接近0或1處時會飽和:在這些區域,梯度幾乎為0。回憶一下,在反向傳播的時候,這個(局部)梯度将會與整個損失函數關于該門單元輸出的梯度相乘。是以,如果局部梯度非常小,那麼相乘的結果也會接近零,這會有效地“殺死”梯度,幾乎就有沒有信号通過神經元傳到權重再到資料了。還有,為了防止飽和,必須對于權重矩陣初始化特别留意。比如,如果初始化權重過大,那麼大多數神經元将會飽和,導緻網絡就幾乎不學習了。

       而ReLU線性部分能很好的傳播梯度,不會産生梯度消失問題。ReLu隻有負值才會被稀疏掉,即引入的稀疏性是可以訓練調節的,是動态變化的,且減少了參數的互相依存關系,緩解了過拟合問題的發生。

      3.1.3生物神經的稀疏激活性

     在神經科學方面,除了新的激活頻率函數之外,神經科學家還發現了神經元的稀疏激活性。

     還是2001年,Attwell等人基于大腦能量消耗的觀察學習上,推測神經元編碼工作方式具有稀疏性和分布性。

     2003年Lennie等人估測大腦同時被激活的神經元隻有1~4%,進一步表明神經元工作的稀疏性。

     從信号方面來看,即神經元同時隻對輸入信号的少部分選擇性響應,大量信号被刻意的屏蔽了,這樣可以提高學習的精度,更好更快地提取稀疏特征。

     從這個角度來看,在經驗規則的初始化W之後,傳統的Sigmoid系函數同時近乎有一半的神經元被激活,這不符合神經科學的研究,而且會給深度網絡訓練帶來巨大問題。

     因而, 校正函數max(0,x)成了近似符合該模型的最大赢家。

     3.1.4 這種稀疏性有何作用?

      換句話說,我們為什麼需要讓神經元稀疏?不妨舉個例子來說明。當看名偵探柯南的時候,我們可以根據故事情節進行思考和推理,這時用到的是我們的大腦左半球;而當看蒙面唱将時,我們可以跟着歌手一起哼唱,這時用到的則是我們的右半球。左半球側重理性思維,而右半球側重感性思維。也就是說,當我們在進行運算或者欣賞時,都會有一部分神經元處于激活或是抑制狀态,可以說是各司其職。再比如,生病了去醫院看病,檢查報告裡面上百項名額,但跟病情相關的通常隻有那麼幾個。與之類似,當訓練一個深度分類模型的時候,和目标相關的特征往往也就那麼幾個,是以通過ReLU實作稀疏後的模型能夠更好地挖掘相關特征,拟合訓練資料。

 綜上:我們引入relu非線性激活函數有兩個原因:

    1.采用sigmoid等函數,算激活函數時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法,計算量相對大,而采用Relu激活函數,整個過程的計算量節省很多。

    2.ReLU由于非負區間的梯度為常數,是以不存在梯度消失問題(Vanishing Gradient Problem),使得模型的收斂速度維持在一個穩定狀态

    3.Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,ReLU實作稀疏後的模型能夠更好地挖掘相關特征,拟合訓練資料

3.2在兩個GPU上訓練

       受當時的條件限制,AlexNet采用2個GTX 580 GPU(3G memory)進行訓練,我們采用的方案基本上是在每個GPU中放置一半核(或神經元),GPU間的通訊隻在某些層進行,例如,第3層的核需要從第2層中所有核映射輸入。然而,第4層的核隻需要從第3層中位于同一GPU的那些核映射輸入,但其實在現有的條件下,使用單個GPU就可以運算,是以,在這裡我們就不必過多讨論。

3.3Local Response Normalization(局部響應歸一化):

     3.3.1什麼叫做魯棒性:

      魯棒性我認為指的是對個别異常點的反應不敏感,即個别異常點對分類器設計(神經網絡的連接配接權)的影響不大。

      這個方法源自生物學的“側抑制”。就是指被激活的神經元會抑制相鄰神經元。歸一化的目的就是抑制。特别是對于Relu函數的抑制作用特别大。用在卷積層(卷積後再激活)之後,因為激活函數是一個非線性變換,會影響資料的分布,激活函數改變了資料分布,就需要進行歸一化。

      LRN處理類似于生物神經元的橫向抑制機制,可以了解為将局部響應最大的再放大,并抑制其他響應較小的(我的了解這是放大局部顯著特征,作用還是提高魯棒性)

     此處論文中給的公式為:

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks
AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

表示第i個核在位置(x,y)運用Relu非線性神經元的輸出,n是同一個位置上臨近位置kernel map的數目,N是kernel總數,

         k是偏置,

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

是放縮比例(因為不一定所有的資料本身的分布都是以0為中心的,如果強制歸一化就會出問題,是以稍微增加一點偏移和放縮)

          舉個例子:i=10,N=96(經過卷積與激活之後信道的次元),n=4表示第i=10個卷積核在位置x,y處輸出為a,用a/第8/9/10/11/12在位置x,y處提取到的特征之和

   如下圖:下面是一批卷積(包括激活)後的特征圖,紅點是正在歸一化的點,該點值等于與其他相鄰的特征圖上的對應位置的點(藍點)歸一化後的輸出值

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

   通常使用 k = 2,n= 5,α= 10-4, andβ= 0:75

   響應歸一化将我們的top-1與top-5誤差率分别減少了1.4%與1.2%

不妨我們舉個極端的例子,即當

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

很大時, 當a10很大時,a9很小,n=N-1,則a9,a10都除以所有的激活值,很顯然,a9很小,a10較大,除以相同的值,a9變小很多,a10并沒有比a9小的那麼多

3.4重疊pooling

    AlexNet采用的步長s小于池化核的大小,這樣池化層的輸出之間會有重疊和覆寫,提升了特征的豐富性

3.5總體結構

  我這裡介紹的是采用單個GPU進行訓練的,因為現有的條件已經可以實作

    conv1:輸入-卷積-relu-LRN-max pooling

    conv2:conv-relu-LRN-max pooling

    conv3:conv-relu

    conv4:conv-relu

    conv5:conv-relu-max pooling

     fc1:Fc-relu-dropout

    fc2:Fc-relu-dropout

    fc3:softmax

下面是論文中的圖,采用的是兩個GPU

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

我們現實中實作的是下面的圖

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

4.減少過拟合

AlexNet網絡有60millon參數,是以過拟合問題是我們急需考慮的,下面提供兩種方式來減少過拟合

此處我先解釋一下什麼叫過拟合:

  當學習器把訓練樣本學的太好了,很可能把訓練樣本身的一些特點當成所有潛在樣本都具有的一些性質,這樣會導緻泛化性能下降,這種現象就是過拟合

       例如: 當用訓練器去識别樹葉時,它把樹葉具有鋸齒特征也學了下來,而認為沒有鋸齒的都不是樹葉,這就是學的太好了,導緻不能适用于所有的樣本

當使用過多參數的時候,以至于太适應目前情況,而不适用于一般情況,也就是不能很好的預測未來。

4.1增加資料

最常見的解決過拟合的方法是人工增大資料集,我們使用兩種方式來增加資料集。

        第一種由圖檔轉化和水準翻轉實作,我們從256*256中抽出224*224圖檔,并進行反轉,得到(256-224)*(256-224)*2=2048,是以資料集擴大了2048倍,但是由此産生的資料有一定的互相依賴性。

  第二種是改變訓練圖檔中rgb通道的強度,我們在周遊ImageNet訓練集的RGB像素值集合中使用PCA?

 此處使用PCA達到降維的目的,具體分析看http://blog.codinglabs.org/articles/pca-tutorial.html

4.2dropout正則化

       首先解釋什麼是dropout: dropout會周遊神經網絡的每一層,并設定消除神經網絡節點的機率,假設,神經網絡的每一層的每一個節點都以抛硬币的方式設定機率,每個節點得以消除和保留的機率都是0.5,設定完節點機率,我們會消除一些節點,然後删掉從該節點近處的連線,最後得到一個節點更少,規模更小的網絡,然後用反向傳播進行訓練,右邊就是網絡節點精簡後的一個樣本,對于每一個樣本,我們都采用精簡後的神經網絡來訓練它.是以使用dropout随機忽略神經元減少過拟合。

      dropout在全連接配接層使用,為什麼dropout會可以減少過拟合?

     通過dropout,該單元的輸入神經與幾乎被消除,是以,輸出不能依靠任何一個特征,因為該單元的任何一個輸入都有可能被随機清除,我不願意把所有的賭注都放在一個節點上,不願意給任何一個輸入加入太多的權重,因為它有可能被删除,是以該神經網絡将以這種方式傳播,并為每個單元的四個輸入增加一點權重,通過傳播所有權重,dropout會産生收縮權重的平方範數的效果,和L2範式類似,dropout的結果是它會壓縮權重,并完成一些預防過拟合的外層正則化,為了防止過拟合,當某一層的節點數過多(更容易過拟合),設定keep-prob較低,對于最後一層,keep-prob=1,意味着保留其所有的節點現實中,我們對輸入層不用dropout。

5.使用momentum 梯度下降法進行訓練

  momentum梯度下降法的運作速度幾乎快于普通的梯度下降算法,其基本思想時計算梯度的指數權重平均,那麼什麼叫做指數的權重平均?點選

http://blog.csdn.net/liyinhua123456/article/details/78625764

并利用該梯度更新權重。使用梯度的指數權重平均,可以減少縱軸的幅度,而不改變橫軸的幅度,使得損失函數盡快降到最小,盡快得到最優的模型,之前的普通的标準的梯度下降法就類似與人喝醉酒了一樣,當他站在山頂,往下走的時候,經常出現搖搖晃晃,偏離正确的路線很遠,是以,到達山底的速度也會很慢。而momentum梯度下降,就類似于一個石頭從山頂滾下,很少出現左右搖晃,即使搖晃,幅度也很小,是以能很快到達山底。這樣也就形象的表示了momentum與普通的梯度下降法的差別了。

繼續閱讀