經(jīng)典論文之AlexNet

經(jīng)典論文之AlexNet

Reference::Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

基本信息

簡(jiǎn)介:AlexNet參加了2012年9月30日舉行的ImageNet大規(guī)模視覺識(shí)別挑戰(zhàn)賽,達(dá)到最低的15.3%的Top-5錯(cuò)誤率,比第二名低10.8個(gè)百分點(diǎn)。原論文的主要結(jié)論是,模型的深度對(duì)于提高性能至關(guān)重要,AlexNet的計(jì)算成本很高,但因在訓(xùn)練過程中使用了圖形處理器(GPU)而使得計(jì)算具有可行性(Wikipedia)。AlexNet的出現(xiàn)標(biāo)志著深度學(xué)習(xí)正式進(jìn)入現(xiàn)代圖像處理的視野。

貢獻(xiàn):最重要的是訓(xùn)練了ALexNet,取得當(dāng)時(shí)的SOTA,這個(gè)很了不起,應(yīng)該是當(dāng)時(shí)最大的網(wǎng)絡(luò)了(這得益于imageNet,不然早就GG了),其他的這篇論文還專門設(shè)計(jì)了針對(duì)GPU的優(yōu)化,采用Relu等等

幾個(gè)Tricks

利用GPU加速計(jì)算

采用兩個(gè)GPU(GTX 580 3GB)并行計(jì)算,突然想哭,我現(xiàn)在還是用自己的950M在計(jì)算。。。在原始的AlexNet的設(shè)計(jì)中也是采用了兩個(gè)GPU并行計(jì)算的策略,將架構(gòu)分路設(shè)計(jì),并在部分地方(第二層和第三層)進(jìn)行GPU數(shù)據(jù)交流(具體操作會(huì)在下文中提到),Alex在原文中提到:

This scheme reduces our top-1 and top-5 error rates by 1.7% and 1.2%, respectively, as compared with a net with half as many kernels in each convolutional layer trained on one GPU.

然后由于條件限制,很多時(shí)候在初學(xué)階段的implementation大多都忽略了這一點(diǎn)。。。

池化方案

Alex首次提出池化步長(zhǎng)的概念,前面介紹LeNet-5的時(shí)候說過LeNet的池化方案是沒有重疊的,也就是沒有步長(zhǎng)的概念,Alex提出了池化的步長(zhǎng)概念,池化核大小3×3,步長(zhǎng)為2,按他老人家的話說也是降低了錯(cuò)誤率,也降低了過擬合。。。

數(shù)據(jù)增強(qiáng)

增加數(shù)據(jù)量是眾所周知避免過擬合最簡(jiǎn)單粗暴的辦法(雖然大多時(shí)候簡(jiǎn)單不代表成本低)。Alex采用如下兩種方案進(jìn)行數(shù)據(jù)增強(qiáng):
第一種:由于ImageNet本身圖像大小為256×256×3,Alex將圖像按224×224×3進(jìn)行橫向移動(dòng),就像卷積那樣,同時(shí)將數(shù)據(jù)進(jìn)行水平翻轉(zhuǎn),所以數(shù)據(jù)集就增大為原來的(256-224)× (256-224)× 2 = 2048,雖然這樣多生成的圖片之間具有高度依賴,但是總比過擬合好吧。再測(cè)試的時(shí)候就直接選取四個(gè)邊角和中心的圖片以及他們翻轉(zhuǎn)后的圖片求均值作為概率。

第二種:改變圖像RGB通道顏色值,因?yàn)楦淖冋彰鞯膹?qiáng)度和顏色不會(huì)改變對(duì)象的身份。首先用PCA對(duì)imageNet圖像RGB數(shù)據(jù)進(jìn)行分析(個(gè)人覺得這種方案有點(diǎn)得不償失。雖然Alex說明了數(shù)據(jù)增強(qiáng)是在CPU上進(jìn)行的,但是CPU真的等于Computationally Free?)。對(duì)于每一張訓(xùn)練圖片,它們的大小比例是相應(yīng)的特征值乘以一個(gè)隨機(jī)值\alpha_i(來自均值為0,標(biāo)準(zhǔn)差為0.1的高斯分布),\alpha_i只針對(duì)特定圖像生成一次,直到該圖像下一次再用于訓(xùn)練的時(shí)候再重新生成。那么增加多少呢:[p_1,p_2,p_3][\alpha_1\lambda_1,\alpha_2\lambda_2,\alpha_3\lambda_3]^T,其中p_i是3×3的RGB像素值的協(xié)方差矩陣中第 i個(gè)特征向量,lambda_i是3×3的RGB像素值的協(xié)方差矩陣中第i個(gè)特征值。(其實(shí)這里我沒咋看懂)

Dropout

在AlexNet中兩大用于減少過擬合的技術(shù)之一——dropout,Dropout會(huì)隨機(jī)挑選全連接層一些節(jié)點(diǎn)在BP過程中失活(Alex設(shè)定失活概率為0.5),這也就相當(dāng)于我們?cè)谟?xùn)練很多個(gè)權(quán)重共享的不同網(wǎng)絡(luò)。如果是測(cè)試過程中則將每個(gè)節(jié)點(diǎn)的輸出×0.5

激活函數(shù)

激活函數(shù)經(jīng)歷了從最開始的sigmoid->tanh->Relu->Leaky Relu->Maxout,AlexNet中選用了Relu激活,下面從這幾個(gè)函數(shù)談?wù)劊?/p>

sigmoid的函數(shù)表達(dá)式sigmoid(x)=\frac{1}{1+e^{-x}},其函數(shù)圖像如下:

center

由圖可以看出,Sigmoid函數(shù)的值域?yàn)閇0, 1],這就非常符合概率0-1的特性,這也是早起sigmoid受歡迎的原因。函數(shù)在0處的梯度最大。但是在和的梯度基本上接近于0,這對(duì)于梯度更新來說就是一個(gè)問題了,技術(shù)上把這種問題成為gradient vanish,這樣會(huì)導(dǎo)致梯度更新亨曼,或者是直接不更新。第二,我們發(fā)現(xiàn)sigmoid的輸出不是zero-centered,我們上文講過不是zero-center的話回降低gradient decent的速度!同時(shí),由于計(jì)算機(jī)本身對(duì)于


tanh的函數(shù)表達(dá)式tanh(x)=\frac{sinh(x)}{cosh(x)},函數(shù)圖像如下:

center

咋一看tanh和sigmoid沒什么差別,湊近點(diǎn)發(fā)現(xiàn)tanh的梯度還是比sigmoi 還是要大得多。同時(shí)tanh解決了zero-centered的問題。但是也沒有解決gradient vanish的問題


然后就是本文的Relu出現(xiàn)了,relu的全稱叫做Rectified Linear Unit,其表達(dá)式為Relu(x)=max(0,x),這個(gè)線性袖中單元的函數(shù)圖像如下:

center

映入眼簾的Relu一看就沒有解決zero-centered的問題,但是當(dāng)x>0時(shí),函數(shù)導(dǎo)數(shù)就是1,整個(gè)函數(shù)的收斂效果還是很不錯(cuò)的。然鵝,問題在于當(dāng)x<0時(shí)這個(gè)怎么肥四,考慮一種情況,當(dāng)變量w的分布中心時(shí)0.01(反正就是和0很接近),剛開始一切正常,然后在某次較大的梯度流過的過程中(可能是當(dāng)時(shí)梯度的確很大,也可能是learning rate設(shè)置過大)使得w的分布中心變成了-0.1,問題來了,Loss對(duì)于w的梯度變?yōu)?,而且以后永遠(yuǎn)就為0了???喵喵喵,這個(gè)單元就死掉了,這個(gè)在技術(shù)上稱為Dead Relu,Relu的死亡是一種不可逆的過程,這是Relu面臨的比較大的問題(聽說現(xiàn)在有人提出了方法,貌似可以式Dead Relu再次起死回生,等我去了解一下,到時(shí)候?qū)懸黄恼拢?/p>

為了解決傳統(tǒng)Relu的Dead問題,后來又提出了Leaky Relu:f(x)=max(0.01x,x),大致圖像如下,解決方案一看便知:

center

直接給x<0部分添加一個(gè)梯度,能夠更新就行。


至于這個(gè)Maxout,這個(gè)是一種新型的激活函數(shù),這個(gè)我們后面會(huì)單獨(dú)拿出一篇文章來講這個(gè),它的擬合能力很強(qiáng),可以擬合任意凸函數(shù)。

Normalization

前一篇博客我們提到了幾種常規(guī)的normalization方案,在原生AlexNet中使用了一種叫做局部響應(yīng)歸一化(Local Response Normalization, LRN),借這個(gè)機(jī)會(huì)我們聊一聊這幾種特殊的歸一化。

Local Response Normalization(LRN)的原理很簡(jiǎn)單,計(jì)算公式如下:
b_{x,y}^{i}=\frac{a_{x,y}^{i}}{(k+\alpha \sum_{j=max(0,\frac{i-n}{2})}^{min(N-1,i+\frac{n}{2})}(a_{x,y}^{j})^2)^\beta}
這一層里沒有任何需要訓(xùn)練的參數(shù),但是需要設(shè)定四個(gè)參數(shù),就是上面那個(gè)k, \alpha, \beta, n,其中n為鄰域深度,k, \alpha, \beta是根據(jù)驗(yàn)證集設(shè)定的超參。LRN其實(shí)就是針對(duì)一個(gè)樣本深度進(jìn)行歸一化,知乎有一個(gè)文章寫的很好,鏈接微信貌似放不出來:/zhuanlan.zhihu.com/p/87117010,懂的人可以康康。

Batch Normalization(BN)是后來提出的一種新的歸一化方案,也基本上替代了LRN,你看到這個(gè)Batch,能不能下意識(shí)想到mini-batch,對(duì)就是他!原本的LRN是針對(duì)單個(gè)樣本做Normalization,但是Batch Normalization是針對(duì)整個(gè)樣本進(jìn)行歸一化,具體操作是先計(jì)算一個(gè)batch所有等位像素點(diǎn)的均值和方差,將每個(gè)像素值減去均值除以方差(這里還可以增加兩個(gè)可訓(xùn)練參數(shù)\gamma\beta,用法見下),就得到最終結(jié)果。公式如下:
\mu_{c}(x)= \frac{1}{NHW}\sum_{n=1}^{N}\sum_{h=1}^{H}\sum_{w=1}^{W}x_{nchw}
\mu_{c}(x)= \sqrt{\frac{1}{NHW}\sum_{n=1}^{N}\sum_{h=1}^{H}\sum_{w=1}^{W}x_{nchw}-\mu_c(x)^2+\epsilon}

然后進(jìn)行歸一化:
x_{out}=\gamma(\frac{x-\mu_c(x)}{\sigma_c(x)})+\beta

既然有了歸一化的操作,那么為什么要做歸一化?LRN歸一化的作用AlexNet的解釋為:這個(gè)想法來源于生物神經(jīng)網(wǎng)絡(luò)的橫向抑制(lateral inhibition),就是興奮的神經(jīng)細(xì)胞會(huì)抑制周圍神經(jīng)細(xì)胞,我其實(shí)一直都不太敢茍同深度學(xué)習(xí)這個(gè)“仿生”,效果不錯(cuò),至于原因就仁者見仁了吧。至于BN,BN在一定程度上減少了Internal Covariant Shift,Covariant Shift是因?yàn)檩斎氲拿恳粋€(gè)batch的分布不同,導(dǎo)致收斂速度振蕩,這個(gè)是針對(duì)輸入數(shù)據(jù)而言的。Internal Covariant Shift是針對(duì)內(nèi)部節(jié)點(diǎn)出現(xiàn)的Covariant Shift,所以叫做Internal Covariant Shift。將每一層的輸入都進(jìn)行0-1歸一化。

Architecture

不多說,先看圖:


center

通過圖像很容易看到我們前面提到的Alex的GPU分路策略,并且第二、四、五的卷積都是采用當(dāng)前GPU的前一次輸出作為輸入,第三層不一樣,采用了兩個(gè)GPU所有的特征圖作為輸入,全連接也是采用所有GPU的輸入。AlexNet的結(jié)構(gòu)如下(我自己沒有按照GPU分路的設(shè)計(jì)來implement,但我覺得問題不大):

第一層輸入大小為224×224×3(這里有問題,可以清楚看到上圖中的輸入大小是224×224×3,圖來自原論文,但是明顯224算出來不對(duì),所以有人說是Alex用了2個(gè)padding,也有人說是Alex寫錯(cuò)了,應(yīng)該是227×227×3,我更傾向于前一種),然后采用96個(gè)11×11×3的卷積核,以步長(zhǎng)為4,0padding,卷積后的圖像大小為55×55×96,然后做LRN和池化,池化層采用3×3,步長(zhǎng)為2做最大池化。

第二層輸入大小27×27×96,采用256個(gè)5×5×48的卷積核,以步長(zhǎng)為1,2padding(原文沒提,根據(jù)后文推算的),卷積后的圖像大小為27×27×256,然后做LRN和最大池化,池化層采用3×3,步長(zhǎng)為2做最大池化。

第三層輸入大小13×13×256,采用384個(gè)3×3×256的卷積核,以步長(zhǎng)為1,1padding,卷積后的圖像大小為13×13×384;第四層輸入大小13×13×384,采用384個(gè)3×3×256的卷積核,以步長(zhǎng)為1,1padding,卷積后的圖像大小為13×13×384;第五層輸入大小13×13×384,采用256個(gè)3×3×384的卷積核,以步長(zhǎng)為1,1padding,卷積后的圖像大小為13×13×256,再做了一次最大池化,變成6×6×256的特征圖。

然后輸入一個(gè)有4096個(gè)神經(jīng)元節(jié)點(diǎn)帶Dropout的全連接,再輸入一個(gè)有4096個(gè)神經(jīng)元節(jié)點(diǎn)帶Dropout的全連接,再輸入一個(gè)有1000個(gè)節(jié)點(diǎn)的全連接作為輸出。

整個(gè)網(wǎng)絡(luò)在SGD下,以Batch size為128,learning rate為0.01遞減,weight decay 為 0.0005,momentum為0.9,90個(gè)epoch,120萬(wàn)張圖,以0均值,0.01方差高斯分布初始化權(quán)重,第二、四、五層偏置初始化為1,其他層設(shè)置為0.

后記

由于筆者本身能力有限,文章內(nèi)容和文字可能出現(xiàn)一些錯(cuò)誤,歡迎各位批評(píng)指正,共同討論,共同學(xué)習(xí)。硬核引流:歡迎大家推廣關(guān)注我的公眾號(hào)?。。?!


center
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容