CNN經典算法AlexNet介紹(論文詳細解讀)

本文是深度學習經典算法解讀的一部分,原文發之:https://www.datalearner.com/blog/1051558603213207

來源論文:Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. “Imagenet classification with deep convolutional neural networks.” Advances in neural information processing systems. 2012.

2012年發表的AlexNet可以算是開啓本輪深度學習浪潮的開山之作了。由於AlexNet在ImageNet LSVRC-2012(Large Scale Visual Recognition Competition)贏得第一名,並且錯誤率只有15.3%(第二名是26.2%),引起了巨大的反響。相比較之前的深度學習網絡結構,AlexNet主要的變化在於激活函數採用了Relu、使用Dropout代替正則降低過擬合等。本篇博客將根據其論文,詳細講述AlexNet的網絡結構及其特點。

AlexNet的論文中着重解釋了Tanh激活函數和ReLu激活函數的不同特點,解釋了多個GPU是如何加速訓練網絡的,也說明了防止過擬合的一些方法。都是值得學習的很好的內容。

一、背景介紹

在數據量不大的情況下,目前的算法已經能很好地處理識別任務。例如,在MINST的數字識別任務中,目前算法的錯誤率已經低於0.3%,接近人類的水平了。但是現實世界中的對象有很大的可變性,識別這些對象需要更大的訓練數據。由於LabelMe、ImageNet的發展,目前已經有數以百萬的標註圖像可以使用。

很大的數據集導致訓練異常困難。而卷積神經網絡(Convolutional Neural Networks,CNN)可以通過改變其結構而控制其大小,並且CNN符合自然界的圖像識別的規律導致了其非常有效。相比較同規模的前饋神經網絡,CNN的參數卻小很多,而性能並不會下降。

這篇論文的主要貢獻包括兩點:1)訓練了一個很大的CNN來處理大規模數據並取得了目前最好的成績。2)公開了一個基於GPU優化的二維CNN。

二、AlexNet結構的特點

1.ReLu的非線性問題
激活函數Tanh是屬於飽和非線性,使用梯度下降訓練Tanh這種激活函數會比非飽和非線性激活函數如ReLU要慢。函數是否是飽和函數主要看定義域和值域的範圍。非飽和函數的含義是指,當自變量趨於無窮大的時候,其值也趨向無窮大。這個函數如果不是非飽和函數,那麼它就是飽和函數了。例如Tanh函數的值域是[-1,1],顯然不符合非飽和函數的定義,因此它就是飽和函數。而ReLU函數則是非飽和函數。

下圖就是ReLU激活函數的訓練速度和Tanh的對比,ReLU要比Tanh快6倍。

當然,作者也不是第一個考慮更換傳統的激活函數,也有人曾經使用|tanh(x)|來處理Caltech-101數據集,但是他們最主要的目的是防止過擬合。而作者主要考慮的是加快訓練速度,這在大的網絡訓練中很重要。

2.在多個GPU上訓練

作者使用了兩個GPU並行計算。當前的GPU可以很容易實現並行,因爲GPU之間可以互相直接讀取內存,而不需要通過主機內存實現。在作者實現的並行方法中,他們將一半的kernels(或者是神經元)放到一顆GPU上,但是用了一個技巧,即GPU之間的通信僅僅在某些層上。舉個例子,第3層的kernel從第2層直接讀取所有的kernel結果。但是第4層僅僅從相同的GPU中讀取第3層的kernel。但是,在交叉驗證的時候選擇連接的模式可能有點問題,但是這允許我們精確調整通信量以至於達到一個適合的計算量。

3.局部響應的正規化 Local Response Normalization

ReLU有個很好的特性是它不需要輸入正化來防止它變得飽和。前面說過了,不飽和的函數在梯度下降求解時速度更快。只要某些樣本上能對ReLU產生正值的輸入,那個神經元就可以學習(敲黑板,記住ReLU的形狀)。然而,作者發現,遵從局部響應的正規化有助於泛化能力。作者提出了一種正規化方法,效果很好,但是這個方法看起來稍微有點複雜,而且和GPU編程有關,這裏不詳細看了。

4.Overlapping Pooling

CNN的池化層在之前用的都是不重疊的,在這裏作者發現帶重疊的池化層效果更好。重疊的意思就是步長小於kernel的長,這樣就產生重疊了。作者觀察發現:訓練帶有重疊池化的模型要更加難以過擬合。至於這個爲啥,並沒有很清晰的結論。大家可以看下面的一個討論:
https://www.quora.com/Why-do-training-models-with-overlapping-pooling-make-it-harder-to-overfit-CNNs-in-Krizhevsky-2012

三、AlexNet模型架構

AlexNet總共有8層網絡。AlexNet針對的是ILSVRC2012的比賽圖像,共有1000個類別。與LeNet-5不同的是,AlexNet輸入的圖像不再是灰度圖像,而是具有RGB三個通道的彩色圖片,且大小是256x256。對於不符合要求的需要重新剪裁轉換。AlexNet的每一層如下:

Input:256x256的RGB三通道圖像。因此輸入維度是training_numx256x256x3。
Layer1:卷積層,96個11x11大小的卷積核掃描,步長爲4。使用ReLU激活函數。採用maxpooling池化,3x3,步長爲2。然後做了一次局部正規化。
Layer2:卷積層,256個5x5的卷積核,步長爲1,但是做了padding,padding長度爲2。使用ReLU激活函數。採用maxpooling池化,3x3,步長爲2。然後做了一次局部正規化。
Layer3:卷積層,384個3x3的卷積核,步長爲1,使用ReLU激活函數。做了padding,padding長度爲1。
Layer4:卷積層,384個3x3的卷積核,步長爲1,使用ReLU激活函數。做了padding,padding長度爲1。
Layer5:卷積層,256個3x3的卷積核,步長爲1,使用ReLU激活函數。做了padding,padding長度爲1。採用maxpooling池化,3x3,步長爲2。然後做了一次Dropout(rate=0.5)。
Layer6:全連接層,加上ReLU激活函數,4096個神經元。然後做了一次Dropout(rate=0.5)。
Layer7:全連接層,加上ReLU激活函數,4096個神經元。
Layer8:全連接層,加上ReLU激活函數,1000個神經元。這一層也就是輸出層了。

AlexNet總共有6230萬個參數(大約),一次前饋計算需要11億的計算。這裏的卷積參數實際只有370萬,只佔6%左右,但是消耗了95的計算量。這個發現也使得Alex發了另一篇論文來解決這個問題。

參考:https://medium.com/@smallfishbigsea/a-walk-through-of-alexnet-6cbd137a5637

四、防止過擬合

如前所述,AlexNet有六千多萬個參數,過擬合是很可能發生的事情。爲了防止過擬合,Alex做了如下工作。

1.數據增強

數據增強是計算機視覺中最常用的防止過擬合的方法。作者在這裏主要使用了兩種方法,一個是水平翻轉,第二個是更改RGB通道的密集度。

2.丟棄法Dropout

Dropout就是隨機刪除隱藏層中的神經元,被刪除的神經元不會在本次迭代中傳遞值。因此,每一次迭代都有一個不太一樣的網絡架構,但是他們都共享權重。這種技術降低了神經元的co-adaptions的複雜性,因此某個神經元不能只依靠某些特定的神經元來計算,這強制整個網絡學習更加具有魯棒性的特徵。在測試的時候不會使用Dropout。但是會把結果乘以0.5,近似模仿這種行爲。如前面所述,在第5層的卷幾層結束做了Dropout,在第6層的全連接層做了Dropout,所以這影響的是最開始的兩個全連接層。最後一層輸出沒有收到影響。

Dropout大約使得收斂的迭代次數翻倍了。這要記住。

五、AlexNet網絡特點及問題

作者使用了ReLU方法加快訓練速度,並且使用Dropout來防止過擬合,通過多GPU的訓練降低訓練時間,儘管這些都不是作者自己提出的技巧,但是,作者的工作引起來大家的廣泛關注,使得很多人開始利用GPU來訓練大型的CNN網絡。當然,作者提出的局部響應正規化也在後來被證明沒啥效果(看VGG的論文)。但不管如何,這篇論文引起了很多人對深度學習和GPU訓練的重視,也算是非常有影響的工作了。

六、代碼實現

PyTorch最簡單:https://github.com/pytorch/vision/blob/master/torchvision/models/alexnet.py

預訓練的模型:
https://github.com/onnx/models/tree/master/bvlc_alexnet

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章