--- tags: Deep learning --- # 論文閱讀: AlexNet (ImageNet Classification with Deep Convolutional Neural Networks) [論文](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf) ## Introduction AlexNet的提出,是深度學習領域中關鍵的分水嶺。2012年,在ImageNet的圖像分類競賽中,AlexNet top-5 錯誤率比上一年的冠軍下降了10%(如下圖)。證明了CNN在影像分類領域中的強大。  在AlexNet中,許多架構被證明可以增加deep learning model的穩定度與強度,至今仍在被使用,下面將會一一介紹。 ## DateSet ImageNet是一個擁有超過1500萬張有正確標記的影像,超過22,000種的類別的資料集。 從2010年開始,一個被稱為ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)的比賽周年的舉行。使用的資料大約是從ImageNet中選出1000種類,再從中各挑出約1000張影像,總計Training Set約120萬張、Validation Set 5萬張、Testing Set 1.5萬張。AlexNet會在2010(有label)和2012(沒label)年的資料集都做實驗。 ImageNet 的圖片解析度不一,但因為AlexNet只能接受256x256的input。因此AlexNet的input是先把圖片的短邊rescale到256,之後再把長邊從中心往左右延伸128,其他多餘的部分剪裁掉。 ## The Architecture  如圖,AlexNet 的架構共八層,第一層到第五層是 Convolutional Layers 做卷積操作(Convolution Operation)與池化(Pooling);第六層到第八層是 Fully Connected Layers。 下面依照作者認為的重要程度順序(由大到小)介紹AlexNet與當時其他的CNN模型相比,一些比較不同的架構。 ### 1. ReLU Nonlinearity 縱使ReLu在現今已經幾乎是Activation Function中的首選, 但當時最常用的激活函數其實是 Sigmoid 和 tanh function。 然而比起ReLu,Sigmoid 和 tanh function擁有vanishing gradient的問題([可以參考李宏毅老師的課程11:20](https://www.youtube.com/watch?v=xki61j7z-30&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&index=17&t=0s))。簡單來說,就是當CNN的層數越來越深時,input weight的變化對loss的影響就會隨著神經元的傳遞而衰減,導致靠近input層的weight沒辦法被更新,模型的training就已經converge了。   也因此AlexNet將激活函數換成ReLU,如下圖,可以看到收斂的速度變快。  ### 2.Training on Multiple GPUs 礙於當時的GPU的記憶體容量比較小(使用的是GTX 580,只有3GB memory),因此將kernel(neurons)拆半並分到兩個GPU上,並且限制兩個GPU只在特定的層communicate。藉此,作者可以調整兩個GPU分別的計算量。 ### 3.Local Response Normalization 縱使ReLUs擁有不需要正規化input以預防saturating(將input壓到一個區間中)的特性,但作者仍發現加入正規的layer對於訓練仍有幫助。  如公式,AlexNet在每層ReLU後都接一層LRN,Node a 在位置(x, y)上的輸出先透過正規化函式(k = 2, n = 5, α = 10−4 , β = 0.75),以b的值輸入下一層。 不過在VGG的論文中,推翻了LRN有用的這個說法。 ### 4. Overlapping Pooling Poolingd可以蒐集某一區域的Pixel作為區域內的特徵,傳遞到下一層。傳統的Pooling層並不重疊。然而AlexNet論文中表示,使Pooling層重疊可以降低錯誤率並且防止overfitting。 然而實際上到底是不是如此呢?在VGG中反倒是認為使用不重疊的pooling層可以有更好的效果。在state-of-art的應用中,基本上也都是使用不重疊的pooling層來得更多。 ## Reducing Overfitting 在論文中對於overfitting問題提出兩個解法。 ### 1. Data Augmentation data augmentation是在深度學習上,是常被應用於防止overfitting的方法。 論文中使用了兩種方法來達成,由於這些方法的運算量並不大,因此經過augmentation的影像不需要存在disk上。此外augmentation使用了python code在cpu上處理,因此也不會影響到GPU上的training。 #### approach 1 前面有提到原始輸入影像尺寸是 256 x 256。然後論文的方法從中隨機裁切 224 x 224 的影像(包含水平鏡像)出來,在輸入到CNN中(這也是為甚麼input的尺寸是224x224x3),藉此,training set可以放大1024倍。 在使用testing data時,從輸入影像萃取5塊尺寸為 224 x 224 的patch(四個角+ 中心點),加上水平鏡射的影像總共10patch,合併經過Softmax得出最終預測。 #### approach 2 另一種data augmentation的方式是對影像進行PCA,找出整個training set 中RGB像素值的主成分。對於RGB image的每個 pixel Ixy = (IRxy, IGxy, IBxy) 加上一定隨機成分(如下圖)。  pi 和 λi 是 ith eigenvector 和 eigenvalue 對於RGB image的3 × 3 covariance matrix。αi為random variable,並且在同一階段中同一影像的所有pixel會使用同一個αi值。 ### 2. Dropout 像random forest一樣,透過多個decision tree作為weak learner做ensemble learning或許是避免overfitting的好方法。然而對於如deep learning這種需要耗費巨量時間訓練的模型來說,這顯然是一項耗費資源的作法。 AlexNet採用了一個在現今deep learning中常見的做法"dropout"。對於每次input,每個neuron會以0.5的機率不參與訓練(forwark跟back propagation)。因此每次input進來,模型都會呈現出些許的不同。 在test時,這些layer的weight則要被乘上0.5才能被使用。([對於dropout更詳細的介紹可以參考李宏毅老師的影片1:10:30](https://www.youtube.com/watch?v=xki61j7z-30&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&index=16)) dropout在根據Figure 2的前兩個fully connected layer中被使用。 ## Details of learning 參數: * 使用stochastic gradient descent * batch size : 128 examples * momentum of 0.9 * weight decay of 0.0005,作者發現微小的weight decay設定可以降低training error。 * weight initialized 使用 zero-mean, standard deviation 0.01 的Gaussian distribution * 每個layer使用相同 learning rate並根據訓練狀況手動調整。 learning rate從0.01開始,調整共3次。當validation error無法進步時就把learning rate/10再繼續做。 ## Results 在ILSVRC-2010上的error rate,可以看到超出當時的冠軍sparse coding以及AlexNet推出前的最好結果SIFT+FVs許多。  (詳細的結果可以閱讀論文,後面就先省略) ## Discussion 以現今的眼光來看,其實AlexNet並不複雜。然而幾個重要的架構設計使他獲得了成功。其透過ReLu的使用,證明了加深網路對於CNN的表現是有顯著影響的。並且,使用了data augmentation以及dropout以避免over training,這在現今仍然都是十分實用的技巧。 AlexNet的出現,可說是把CNN推入Image classification領域的關鍵,導致了深度學習在這領域上的研究開始蓬勃發展。 ## Reference [AlexNet 架構概述](https://medium.com/@WhoYoung99/alexnet-%E6%9E%B6%E6%A7%8B%E6%A6%82%E8%BF%B0-988113c06b4b)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.