卷積神經網路模型(2)-AlexNet解讀

最近要開始找工作啦,準備將自己看過的文章及其實現通過專欄的方式記錄一下,也希望能一起交流。主要內容包括:深度學習模型、目標檢測、語義分割、細粒度識別、目標追蹤、遷移學習、通用學習等,主要是論文及自己的思考,目前在一步步構建中。

說起深度學習在圖像領域的應用,不得不提Hinton實驗室的AlexNet在ILSVRC-2012上的矚目表現,也是卷積神經網路在大規模數據集的開篇巨作。同時我把該專欄第一篇文章留給了LeNet-5,由於要寫BP傳播、卷積池化的作用比較繁瑣,所以先寫了第二篇文章AlexNe本文組織框架如下:AlexNet的創新點及其意義、網路結構及特點、實驗結果。同時我正在通過TensorFlow實現AlexNet,爭取下一篇文章放出。

1、意義

AlexNet首次在大規模圖像數據集實現了深層卷積神經網路結構,點燃了深度學習這把火。其在ImageNet LSVRC-2012目標識別的top-5 error為15.3%,同期第二名僅為26.2%,碾壓其他傳統的hand-craft 特徵方法,使得計算機視覺從業者從繁重的特徵工程中解脫出來,轉向思考能夠從數據中自動提取需要的特徵,做到數據驅動。得益於GPU計算性能的提升以及大規模數據集的出現,自此後每年的ImageNet LSVRC挑戰賽都被深度學習模型霸佔著榜首。

2、創新點

  • 訓練出當前最大規模的卷積神經網路,此前LeNet-5網路僅為3個卷積層及1個全連接層。
  • 實現高效的GPU卷積運算結構,也使得此後GPU成為深度學習的主要工具,老黃做夢都要笑醒了。
  • 通過眾多的skills(dropout、RELU、Data Augmentation)解決深層神經網路的過擬合問題,使得該網路在60 million參數的情況下依舊能很好收斂。這些方法現在已經成為了CNN不可或缺的一部分。

3、網路結構

由於當時的GPU運算能力比較低,AlexNet通過兩個GPU協同訓練,因此文章給出的網路結構不如NetScope的清晰,參見Netscope。

該網路共包含8個權重層,其中5個卷積層,3個全連接層。1,2卷積層後連有LRN層,不過此後的網路也證明LRN並非CNN中必須包含的層,甚至有些網路加入LRN後效果反而降低。每個LRN及最後層卷積層後跟有最大池化層,並且各個權重層均連有RELU激活函數。全連接層後使用了dropOut這一神器以解決過擬合。上面這幅圖的feature map 維度需要綜合上下兩個GPU的結果,其輸入為224*224*3的圖片,第一層卷積層的kernel個數為96,size為11*11*3,步伐為4,其得到的feature map size為55*55*48。有個細節,計算feature map size時我們發現,(224-11)/4 並不能整除,也就是說kernel在水平移動時的最後一個感受野並非為11*11。不過這個細節在NetScope中已經修改了,裡面的輸入被resize到227*227*3。其後的卷積、池化及全連接就比較好理解了,當我們發現卷積的kernel size不能整除時,自動pad就好啦。

卷積1步伐為4,kernel size為11*11*96,feature map 為55*55*96

Pooling1步伐為2,kernel為3*3,feature map 為27*27*96

卷積2步伐為1,kernel size 為5*5*256,feature map 為27*27*256,feature map大小未變說明卷積前左右各pad 2

Pooling2步伐為2,kernel 為3*3,feature map 為13*13*256

卷積3步伐為1,kernel size 為3*3*384,feature map 為13*13*384

卷積4步伐為1,kernel size 為3*3*384,feature map 為13*13*384

卷積4步伐為1,kernel size 為3*3*256,feature map 為13*13*256

Pooling3步伐為2,kernel 為3*3,feature map 為6*6*256

全連接6、7的神經元個數為4096,全連接層8神經元個數為1000,對應於ImageNet的1000類。

4、網路特點

  • RELU的使用

我們知道神經網路需要使用激活函數,一般激活函數具有兩個作用。其一、無論卷積還是全連接層,實質上都是線性運算,通過加入非線性的激活函數可以增強網路的非線性映射能力,相當於kernel method。其二、神經網路一般通過BP演算法優化,激活函數可以加快網路收斂速度。傳統神經網路激活函數通常為反正切或是sigmoid,AlexNet使用RELU作為激活函數,相比於反正切,該方法訓練速度大約有6倍提升。RELU激活函數簡單到難以置信,f(x)=max(0,x),也就是說我們放棄了小於0的那部分導數,同時正數部分的導數為1啊!BP時自然會快啦!

  • LRN

雖然後來的很多網路都不屑於使用LRN,甚至直接說LRN對於網路沒有任何提升,但是思路真的很新奇呀。

LRN加在RELU的激活後面,能夠增加網路的泛化能力,並在ILSVRC-2012上降低1%的錯誤率。傳說思路來源於神經元的側向抑制機制,不同的神經元都在做特徵提取這件事,能否讓他們相互競爭呢?

其中a_{x,y}^{i} 為kernel i 在x,y坐標的feature map,j為x,y位置的其他相鄰kernel的feature map,這樣我們就可以通過其他kernel的響應抑制我們的我們的feature map啦。文章給出了超參數的經驗值,估計試了很多很多次吧。成功開啟深度學習調參之路。

  • Overlapping Pooling

也算是創新點之一吧,畢竟此前的文章的池化沒有重疊的,不過後續的其他文章也鮮有重疊。重疊池化的意思是,池化步伐小於kernel size,這樣池化後的feature map的感受野其實是有部分重疊的。

  • Data Augmentation

文章使用Random Crop、flip從而上千倍的擴充訓練樣本的數量,也使得隨機裁剪成為通用方法。具體做法就是首先將圖片resize到256*256大小,然後從中隨機crop出224*224大小的patch訓練,測試時就從四個角及中心crop,然後水平翻轉圖像形成10個測試圖片,然後對於這10個結果取一下平均值就好啦。另一種增強為轉換RGB通道的強度,在之後的模型中很少用到,對於該模型,大約降低了1%錯誤率。

  • DropOut

Hinton自家的東西,當然要用上啦,可以看到卷積神經網路的計算量其實主要集中在全連接層,這些層參數太多了,也最容易發生過擬合。DropOut通過訓練時隨機使得一部分結點失效,不貢獻連接權重而減少過擬合風險。同時強迫這些神經元去學習互補的一些特徵。現在已經是主流做法啦,訓練時全連接層50%結點不工作,測試時工作就好啦。

5、實驗結果

比第二名高出太多,其實FV方法直到現在都是很常用的方法,也衍生出了FV-CNN,可以說當時是非常流弊的方法了。關於代碼部分,第三篇文章補上。

6、參考

論文下載地址:machinelearning.wustl.edu


推薦閱讀:

如何理解卷積神經網路中的權值共享?
如何看待顧險峰《看穿機器學習(W-GAN模型)的黑箱》這篇文章?
ICML 2016上哪些論文值得關注?
是不是對於任意 n×n 大小的圍棋棋盤,人類都贏不了 AlphaGo Zero 了?
美國cs博士一般幾年能畢業?

TAG:深度学习DeepLearning | TensorFlow | 机器学习 |