<<ImageNet Classification with Deep Convolutional Neural Networks>>
大名鼎鼎的AlexNet,2012年ImageNet比賽的冠軍织阳,可以說是近年深度學(xué)習(xí)浪潮的開山之作愈诚,發(fā)表在了2012年的NIPS上.
作者Alex Krizhevsky,也是Hinton大佬的學(xué)生
ImageNet Classification with Deep Convolutional Neural Networks
Abstract
- 性能: 在包含1000個(gè)類別抑党,120萬張圖片的ImageNet LSVRC-2010訓(xùn)練了一個(gè)神經(jīng)網(wǎng)絡(luò),在test data上達(dá)到了SOTA的效果峻凫,top-1, top-5 error達(dá)到了37.5%, 17%
- 網(wǎng)絡(luò)結(jié)構(gòu):包含5個(gè)卷積層(部分包含max-pooling),3個(gè)全連接層,最后接一個(gè)1000類的softmax做歸一化.
- 其他細(xì)節(jié)貢獻(xiàn):
- 實(shí)現(xiàn)了convolution的GPU版本
- 在全連接層使用了Dropout來避免overfitting.
Introduction
更大的數(shù)據(jù)集矮湘,更強(qiáng)的學(xué)習(xí)能力的模型
為什么要更大的數(shù)據(jù)集?
現(xiàn)在主流識(shí)別任務(wù)的方法都是基于machine-learning的醋寝,要提升這類方法的性能搞挣,需要很大的數(shù)據(jù)集,學(xué)到更強(qiáng)表達(dá)能力的模型音羞,并且使用一些更好的技術(shù)去避免模型的Overfitting(機(jī)器學(xué)習(xí)繞不開的問題)
現(xiàn)有的數(shù)據(jù)集都很小囱桨,在這種小的數(shù)據(jù)集上,比如Mnist手寫數(shù)字識(shí)別任務(wù),模型得到的結(jié)果甚至已經(jīng)比人還好。但是真實(shí)世界的場(chǎng)景遠(yuǎn)比這復(fù)雜嗅绰,因此我們需要更大的數(shù)據(jù)集(對(duì)數(shù)據(jù)集大小提出要求)舍肠,比如ImageNet搀继。
為什么要更強(qiáng)學(xué)習(xí)能力的模型 - 為什么選擇CNN?
即使是有了ImageNet這樣龐大的數(shù)據(jù)集,識(shí)別任務(wù)也不可能被完全的解決翠语,模型同樣需要有一些很強(qiáng)的先驗(yàn)知識(shí)來補(bǔ)充數(shù)據(jù)當(dāng)中沒有的東西(對(duì)模型的選擇提出了更高的要求)
-
Convolutional neural networks的優(yōu)勢(shì)
- 容量可調(diào) : 可以通過修改網(wǎng)絡(luò)的Depth, breadth來調(diào)整網(wǎng)絡(luò)的大小(學(xué)習(xí)能力)
- 對(duì)自然圖像有準(zhǔn)確的先驗(yàn)假定 : stationarity of statistics and locality of pixel dependencies(統(tǒng)計(jì)上的平穩(wěn)性和像素依賴的位置性)
- 和類似結(jié)構(gòu)的feedforward網(wǎng)絡(luò)相比叽躯,CNN有更少的鏈接和參數(shù),可以更好的學(xué)習(xí)肌括,又不會(huì)損失太多的性能
因此CNN其實(shí)有吸引人的特點(diǎn)险毁,Convolution這種Local的結(jié)構(gòu)也非常的高效
GPU版本的Convolution實(shí)現(xiàn)讓CNN訓(xùn)練加快,ImageNet標(biāo)注數(shù)據(jù)的出現(xiàn)讓模型避免了過度的Overfitting
Contributions
- 在ILSVRC-2010,ILSVRC-2012比賽中们童,利用相應(yīng)的ImageNet的子集訓(xùn)練了一個(gè)CNN網(wǎng)絡(luò)獲得了冠軍。
- 完成了Convolution鲸鹦,其他層的GPU版本實(shí)現(xiàn)慧库,并訓(xùn)練了一個(gè)神經(jīng)網(wǎng)絡(luò)。
- 網(wǎng)絡(luò)包含一些小的Feature,能提升訓(xùn)練速度和性能
- 即使是在這么大的數(shù)據(jù)集上馋嗜,我們的網(wǎng)絡(luò)參數(shù)量也有可能會(huì)Overfitting,因此采用了一些技術(shù)來避免Overfitting
- 提出了一個(gè)5卷積-3全連接的CNN網(wǎng)絡(luò)齐板,表示卷積層不能少,少了性能會(huì)降
作者也解釋了一下網(wǎng)絡(luò)模型和訓(xùn)練受限于GPU的發(fā)展葛菇,有更好的GPU可以加快訓(xùn)練(這是不是也是沒嘗試更深的網(wǎng)絡(luò)的原因呢甘磨?)
ImageNet Dataset
介紹了以下ImageNet和ILSVRC比賽,沒啥好說的眯停。
主要關(guān)注以下網(wǎng)絡(luò)數(shù)據(jù)輸入的預(yù)處理
數(shù)據(jù)預(yù)處理
圖像Resize
ImageNet的圖像是不同分辨率的济舆,而AlexNet只能接收固定大小的圖像(因?yàn)槿B接層的參數(shù)直接和輸入數(shù)據(jù)量相關(guān))
因此需要對(duì)圖片進(jìn)行預(yù)處理,做法是downsample到固定256*256的大小
具體的Downsample做法:
給定一張圖像莺债,按短邊resize到256的比例resize整個(gè)圖像滋觉,然后crop這張圖像中心的256*256的patch.
去均值
沒啥好說的,會(huì)計(jì)算所有像素的RGB均值齐邦,做去均值的操作椎侠,輸入數(shù)據(jù)就是原始的RGB值
Netwotrk Architecture
整體網(wǎng)絡(luò)結(jié)構(gòu)包含5 conv + 3 fc層,網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
Noval Features to improve performance
作者也提出了一些新的點(diǎn)去幫助加快訓(xùn)練措拇,提升性能
ReLU Nonlinearity
第一個(gè)最重要的也就是ReLU激活函數(shù),如下
傳統(tǒng)的激活函數(shù)tanh和sigmoid,作為軟飽和的激活函數(shù)我纪,一旦落入飽和區(qū),梯度更新會(huì)趨向于0丐吓,導(dǎo)致梯度消失浅悉,變得很難訓(xùn)練。
而ReLU作為一種在負(fù)半軸抑制汰蜘,正半軸是線性的激活函數(shù)仇冯,這種結(jié)構(gòu)表達(dá)了非線性的篩選能力,又能解決梯度消失的問題族操,是一種比較好的選擇(也有問題苛坚,神經(jīng)元死亡)
當(dāng)然上面這段都是自己加上去的比被,在這篇文章里作者并沒有過多分析,而是直接替換了Relu, 認(rèn)為在CNN中運(yùn)用Relu可以加快訓(xùn)練速度泼舱。
作者用4層的神經(jīng)網(wǎng)絡(luò)在CIFAR-10數(shù)據(jù)集上訓(xùn)練比較了tanh和Relu分別作為激活函數(shù)的訓(xùn)練速度等缀,發(fā)現(xiàn)要達(dá)到25% train error,Relu激活函數(shù)花費(fèi)更少的時(shí)間,如下圖:
因此在更大的網(wǎng)絡(luò)和數(shù)據(jù)集上娇昙,我們應(yīng)該也可以得到類似的結(jié)論尺迂,因此作者認(rèn)為在更復(fù)雜的CNN中用Relu替代tanh和sigmoid可以顯著加快網(wǎng)絡(luò)訓(xùn)練。
Training on Multiple GPUs
Multi-GPUs的訓(xùn)練冒掌,可以加快速度噪裕,屬于工程問題,這里不提了股毫。
Local Response Normalization
局部相應(yīng)歸一化層膳音,作者認(rèn)為做這樣的歸一化可以提升性能,把top1,top5 error分別降低了1.4%和1.2%
思想就是對(duì)于一個(gè)卷積層的輸出铃诬,考慮各個(gè)channel通道的每個(gè)像素位置祭陷,單個(gè)channel通道上的每個(gè)像素位置的值,根據(jù)該像素位置在所有通道上的平方和來做歸一化趣席,公式如下:
Overlapping Pooling
Pooling的時(shí)候兵志,會(huì)有stride,kernel_size兩個(gè)參數(shù)。
如果kernel_size = stride,就是Non-Overlapping的Pooling
如果kernel-size > stride,就是Overlapping的Pooling宣肚,Pooling后的圖像上想罕,每個(gè)像素點(diǎn)與附近的像素點(diǎn)之間是有信息的Overlap的。
作者發(fā)現(xiàn)這種Overlapping的Pooling可以增加準(zhǔn)確率钉寝,top1,top5 error各自降低了0.4%,0.3%個(gè)點(diǎn)弧呐。
作者認(rèn)為這種Overlapping的Pooling在訓(xùn)練的時(shí)候可以輕微降低Overfitting
Overall Architecture
看一下整個(gè)網(wǎng)絡(luò)結(jié)構(gòu),這里好像因?yàn)榉至薓ulti-GPUs還特地把網(wǎng)絡(luò)分開來了。嵌纲。真蛋疼俘枫,我們就當(dāng)做一個(gè)網(wǎng)絡(luò),統(tǒng)一的參數(shù)看
這里結(jié)合了一下Caffe版本的具體Code看,會(huì)比較清楚:
Alexnet_train_prototxt
- input: 224x224x3的輸入圖像逮走,前面說預(yù)處理是256x256,為什么鸠蚪?其實(shí)是因?yàn)楹竺孀鰀ata augmentation最終得到224x224的圖,所以前面的256x256是保證可以做crop师溅,真正的網(wǎng)絡(luò)輸入還是224x224x3
- conv1_relu_lrn_maxpooling: 單個(gè)kernel的size=11x11x3,stride=4,kernel數(shù)量96個(gè)茅信,后面接relu,lrn,和3x3 stride=2的max-pooling.
- conv2_relu_lrn_maxpooling: 單個(gè)kernel的size=5x5x96,stride=1,kernel數(shù)量256個(gè),后面接relu,lrn,和3x3 stride=2的max-pooling.
- conv3_relu: 單個(gè)kernel的size=3x3x256,stride=1,kernel數(shù)量384個(gè)墓臭,后面接relu
- conv4_relu: 單個(gè)kernel的size=3x3x384,stride=1,kernel數(shù)量384個(gè)蘸鲸,后面接relu
- conv5_relu_maxpooling: 單個(gè)kernel的size=3x3x384,stride=1,kernel數(shù)量256個(gè),后面接relu窿锉,和3x3 stride=2的max-pooling
- fc6_4096_relu_dropout:將上一層得到的結(jié)果拉成1xn的向量,過全連接層輸出1x4096的向量酌摇,過relu,訓(xùn)練時(shí)候過ratio=0.5的dropout
- fc7_4096_relu_dropout:同理,過全連接層輸出1x4096的向量膝舅,過relu,訓(xùn)練時(shí)候過ratio=0.5的dropout
- fc8_1000:過全連接輸出1x1000的向量,再過softmax就可以得到歸一化的1x1000的向量窑多,每個(gè)點(diǎn)代表屬于對(duì)應(yīng)label的概率仍稀。一般實(shí)現(xiàn)的時(shí)候train把softmax和交叉熵?fù)p失函數(shù)放在一起,test的時(shí)候用softmax得到歸一化概率埂息。
可以看到網(wǎng)絡(luò)結(jié)構(gòu)如果拋開那些細(xì)節(jié)的話技潘,就是11x11,5x5,3x3,3x3,4x4卷積,4096全連接千康,4096全連接享幽,1000分類概率。
以現(xiàn)在的眼光看拾弃,對(duì)于圖像級(jí)的分類問題琉闪,不太好的地方在哪里呢?
主要是前面的卷積層有優(yōu)化的地方砸彬,我們一般叫做CNN特征提取層,AlexNet這樣5層的CNN特征提取斯入,能提取出較好地對(duì)于圖像分類問題的feature嗎砂碉?
對(duì)于分類問題,最后用全連接可以考慮全局的信息刻两,但是也破壞了相應(yīng)的localization的信息增蹭,是不是有弊端呢?
Reducing Overfitting
機(jī)器學(xué)習(xí)問題無法避免Overfitting,但是好的模型要盡可能有較好的泛化能力磅摹,因此模型如何減緩Overfitting是很重要的一部分滋迈。
作者也提出了一些減少Overfitting的辦法。
Data Augmentation
數(shù)據(jù)增廣大概是從數(shù)據(jù)角度我們最郴模考慮的辦法饼灿,做法是對(duì)原圖做一些簡(jiǎn)單的變化。
這里其實(shí)可以有兩種做法
- 事先增廣好帝美,存在磁盤里:好處是降低訓(xùn)練時(shí)候的運(yùn)算(雖然是在CPU上的)碍彭,壞處是會(huì)增大磁盤的存儲(chǔ)量
- 在訓(xùn)練的同時(shí)增廣:好處是降低了磁盤的存儲(chǔ)量,壞處是可能有一些CPU運(yùn)算的開銷悼潭。
作者似乎選的是第二種.
增廣的方式
隨機(jī)Crop+水平翻轉(zhuǎn):在256x256的圖像上隨機(jī)Crop得到224x224的圖像庇忌,并且得到他水平翻轉(zhuǎn)的圖像,這樣2048倍增加了數(shù)據(jù)集的量舰褪,不做的話會(huì)Overfitting.問題是皆疹,這樣怎么對(duì)256x256的圖像做test,作者的做法是提取圖像的中心patch+四個(gè)角落patch,再做水平翻轉(zhuǎn)占拍,得到一共10個(gè)patch分別過網(wǎng)絡(luò)略就,得到這些patch預(yù)測(cè)得到的概率的平均值捎迫,最大的平均值對(duì)應(yīng)的類別為圖像的分類結(jié)果。
-
PCA Jittering:先計(jì)算RGB通道的均值和方差残制,進(jìn)行歸一化立砸,然后在整個(gè)訓(xùn)練集上計(jì)算協(xié)方差矩陣,進(jìn)行特征分解初茶,得到特征向量和特征值(這里其實(shí)就是PCA分解)颗祝,在分解后的特征空間上對(duì)特征值做隨機(jī)的微小擾動(dòng),根據(jù)下式計(jì)算得到需要對(duì)R,G,B擾動(dòng)的值恼布,把它加回到RGB上去螺戳,作者認(rèn)為這樣的做法可以獲得自然圖像的一些重要屬性,把top-1 error又降低了1%
PCA Jittering也算是比較常見的一種Data Augmentation的做法
Dropout
作者認(rèn)為一種好的避免過擬合的做法是做模型的Ensemble,類似傳統(tǒng)機(jī)器學(xué)習(xí)里的做法折汞,但是網(wǎng)絡(luò)的Ensemble會(huì)耗費(fèi)大量的資源倔幼,因此比較好的做法是在訓(xùn)練的時(shí)候,在網(wǎng)絡(luò)內(nèi)部實(shí)現(xiàn)Ensemble爽待。
作者用了他人提到的一種dropout的方法损同,通過50%的概率隨機(jī)地在訓(xùn)練的時(shí)候?qū)⑸窠?jīng)元的輸出置為0,讓他對(duì)forward和backward失效鸟款。
這樣可以使得每次訓(xùn)練的時(shí)候膏燃,網(wǎng)絡(luò)都會(huì)sample出一個(gè)model,但是所有sample出來的model共享一個(gè)全局的model。作者認(rèn)為這種方法可以減少?gòu)?fù)雜系統(tǒng)下神經(jīng)元之間的依賴性何什,因?yàn)槲覀儾幌M粋€(gè)神經(jīng)元依賴于某個(gè)特定的神經(jīng)元组哩。
這樣可以強(qiáng)迫網(wǎng)絡(luò)在后面其他部分的神經(jīng)元每次都在隨機(jī)變化的情況下,卷積部分可以學(xué)到更加魯邦的feature
在測(cè)試的時(shí)候处渣,會(huì)打開所有全連接層的神經(jīng)元伶贰,但是會(huì)對(duì)輸出乘0.5,這是取了預(yù)測(cè)分布的幾何平均,是一種比較合理的實(shí)現(xiàn)方案罐栈。
作者在FC6,FC7用了全連接黍衙,顯著地降低了Overfitting,但是會(huì)使得網(wǎng)絡(luò)的訓(xùn)練時(shí)間增加到兩倍荠诬。
Details of learning
一些基本的參數(shù)
batch_size=128, 用的SGD, momentum給了0.9, weight_decay給了0.0005
參數(shù)初始化
所有的層用高斯隨機(jī)初始化们豌,mean=0, var=0.01
conv2,4,5和fc層的bias初始化為1,這樣做加速了網(wǎng)絡(luò)早起的訓(xùn)練(給了Relu正的輸入),其它層的bias初始化為0
學(xué)習(xí)率調(diào)整策略
base_lr給的是0.01,一旦在validation集上不下降了就降低10倍浅妆,在結(jié)束前最多降低三次望迎。
Result
結(jié)果沒啥好說的,下圖是在ILSVRC-2010上的結(jié)果凌外,比傳統(tǒng)方法都好了辩尊,開啟了深度學(xué)習(xí)刷榜的年代。
我的總結(jié)
AlexNet作為CNN在圖像領(lǐng)域應(yīng)用康辑,并取得顯著成功的開山之作摄欲,以現(xiàn)在的眼光來看還是有很多值得借鑒的點(diǎn)轿亮。
比如
- Relu作為激活函數(shù)解決tanh,sigmoid這些軟激活函數(shù)落入飽和區(qū)會(huì)梯度消失的問題,加快訓(xùn)練速度,現(xiàn)在還是最主流的激活函數(shù)胸墙。
- 提出Dropout在全連接層的時(shí)候我注,在單個(gè)網(wǎng)絡(luò)內(nèi)部模擬模型的ensemble,降低神經(jīng)元之間的關(guān)聯(lián)性迟隅,加強(qiáng)了耦合度但骨,在降低Overfitting的同時(shí)而不增加參數(shù)量, 雖然現(xiàn)在因?yàn)槿矸e網(wǎng)絡(luò)的出現(xiàn)在一些問題里用的越來越少了。
- 提出了Data Augmentation的方法智袭,random crop, flip, PCA Jittering現(xiàn)在都還是比較主流的做法奔缠,都被沿用了下來。
- 像overlapping pooling吼野,是現(xiàn)在網(wǎng)絡(luò)標(biāo)準(zhǔn)的pooling做法校哎。
- 提出了這樣一個(gè)conv,relu,maxpooling...conv,relu,maxpooling......fc,fc的分類網(wǎng)絡(luò)框架,單層看作為局部特征的提取瞳步,全局看是一個(gè)低維到高維空間的映射闷哆,fc做高維信息的整合來做分類,是后面分類網(wǎng)絡(luò)非常主流的一個(gè)框架单起。
當(dāng)然也有一些以現(xiàn)在的眼光去看值得改進(jìn)的地方,
1.比如LRN后來就很少用了阳准。
2.網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)上一些細(xì)節(jié)處現(xiàn)在也有更好的做法,比如用小kernel替代大的kernel
3.AlexNet整體還是比較淺的馏臭,深度網(wǎng)絡(luò)現(xiàn)在可以越做越深。不知道當(dāng)時(shí)沒做深有沒有硬件的限制讼稚。括儒。
Anyway,深度學(xué)習(xí)的浪潮因?yàn)锳lexNet的出現(xiàn)正式到來。