AlexNet小簡介(1) — 論文翻譯(上)

Martin Huang
10 min readAug 27, 2020

--

原文在此[1] ,標題為ImageNet Classification with Deep Convolutional Neural Networks,出版於2012年。這篇主要是將文章做翻譯,會加入些許個人見解,若有錯誤,請指教。

前言

由Alex在2012年提出的網路,參加當年的ImageNet比賽拿到冠軍,而且一口氣推進了誤判率,從26.2%到15.3%。所謂的誤判率是指神經網路可以針對每個圖片猜五個最可能的選項,然後五個都答錯的情形。據說在此之前這項比賽一直由SVM演算法領先,直到AlexNet開始才翻轉這個局勢。

從這裡開始神經網路將持續被加深,不再是5~6層,而會到甚至破百層。要訓練的神經網路元也因此大幅增加。同時為了因應大量的神經元和資料,在當時平行運算還不出色的年代,也用了一些方法來確保訓練的效果。接下來就看看AlexNet比起LeNet做了哪些變化。

資料集

ImageNet是一個擁有將近1500萬附標籤的圖片資料,其分類項目達22000種。資料來源自網路,且標籤由人工完成,其平台為Amazon’s Mechanical Turk crowd-sourcing tool。從2010年開始,每年都有一項賽事ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)會舉行。它將從ImageNet中挑選1000個類別,每個類別挑選約1000張圖片,做比賽之需。總計有120萬的訓練集、5萬驗證集、以及15萬測試集的資料。

在文章發表時,只有ILSVRC-2010的資料是有公開測試集的,所以本神經網路大部分依據這套圖片集進行實驗。最後,也會拿ILSVRC-2012的圖片集測試,並有紀錄結果於後。ImageNet的錯誤率看兩個項目:top-1和top-5。前者就是答錯率(猜羧可能的那一個和正確答案不符);後者是正確答案並未出現在猜測最可能的前五個之中。

ImageNet的資料集並未將圖片的解析度標準化,因此每張圖片的解析度不同;然而神經網路要求一致。因此,他們將圖片全部降解成256 256。先將短邊剪裁至256長度,再將圖片從中心起算的256 256範圍剪裁。除了在訓練集的圖片中有針對每個畫素萃取平均活動(mean activity)之外,本網路並未再針對圖片做任何前處理,完全依照圖片的初始RGB值訓練。

架構

總結來說,本網路共有8層神經網路。前5層是卷積(其實部分含有最大池化層),後三層則是全連結層。接下來則會介紹本神經網路的特色。

ReLu的非線性啟動函數

ReLu全名叫Rectified Linear Units (ReLUs),即數值和0比較,如果0比較大就選0(不啟動),數值比較大就選數值(啟動)。這個方式在梯度下降法時比LeNet用tanh(雙曲正切函數)所需時間較短,因為tanh在y值靠近1或-1時變化較小(飽和)。根據實驗對照,ReLu在下降至25%錯誤率時所需的訓練批次數是tanh的幾乎1/7。面對ImageNet如此龐大的資料量,若用tanh將會花非常多的時間。

多元GPU

這在最近幾年是再普通不過的事,不過在只有GTX 580的2010~2012年則是創舉。因為當時的GPU其記憶體容量只有3GB,無法儲存如此巨大的資料,因此他們將資料分流,變成兩部分。然後使用兩個GPU做平行運算。在當年兩個GPU互相溝通是沒問題的;一個GPU可以用另一個GPU儲存的資料作運算。然而,本網路用了另一個技巧:只在部分層讓GPU溝通。例如:從第二層進第三層時,GPU之間還是互相溝通的。到了第四層,就只讓第三層中屬於同一個GPU管轄的神經元進到各自的下一層,而不再跨GPU。如何設定那些層要跨GPU而那些不用就是關鍵了。文章中認為這個技術讓他們的top-1和top-5誤判率分別下降了1.7%和1.2%。

Local Response Normalization(區域回應標準化/一般化)

文章中認為在神經網路元將輸入經過權重、誤差,及啟動函數的運算之後的值,經過這道手續後可以讓結果更好。根據網路資料,這道手續的啟發是由真正神經網路的「側抑制」而來。所謂側抑制就是當某個神經元啟動時,它還會抑制周遭的神經元。如果神經網路可以模仿這個性質,則可以更加區分某些特徵。實務上的做法是將此神經元運算出來的結果,除以前後同一通道範圍的神經元運算的結果之平方和。公式如下。

其中k、n、α、β都是常數,經過驗證的設定之後固定為2、5、 、0.75。文章中認為這個方法讓top-1和top-5誤判率分別下降了1.4%和1.2%。然而,有後續的文章指出這個方法並不會使訓練效果更好,因此在後來的CNN網路中這個方法已經被排除了。

Overlapping Pooling

傳統CNN不讓池化層的核重疊。本神經網路允許其重疊,其移動方式類似捲積核,以一格為單位重疊。目的是減少overfitting。文章中認為這樣的方式比起不重疊讓top-1和top-5誤判率分別下降了0.4%和0.3%。

完整結構

(1) 輸入卷積層: 雖然在上圖顯示輸入的圖片是224*224,文章中也表示沒有做前處理,但用224去計算會出現小數點。
— — — -
要如何計算呢?其實是植樹問題,以第一層為例,卷積核大小為11*11,而步長為4。即「每四公尺種一棵樹,且最後一顆必須離終點剛好11公尺」的意思。其中距離就是步長,而最後一棵樹離終點的距離就是卷積核大小。所以(224–11)/4+1就是答案,但會發現213無法被4整除,不通。根據網路上查到的多方資料,似乎被認為實際上輸入的圖片大小為227*227,若是如此,216就可以被整除了。最後的結果是55,剛好符合第一層的大小。
— — — -
卷積核的數目是作者設定的。96個卷積核分兩個GPU運算進行,所以各48。這也是本層的「通道數」。
本層還有池化,承(4)本結構是允許池化層重疊的,因此也是類似植樹的問題。池化核是3*3,步長是2。(55–3)/2+1=27,此時大小已經縮至27。
最後再加上LRN,這一步不影響大小,所以現在輸出是27*27*48*2。

(2)卷積層:第二個卷積層所使用的卷積核大小是5 5,步長文章中沒有再特別提及,推測是和LeNet一樣的1。所以(27–5)/1+1=23,照理來說該是23,怎麼會是27?結果原來是因為有先經過補白處理,也就是再輸入前先在周圍擴張2個像素,使大小變成27+2*2=31,再丟進第二層卷積。所以實際上是(31–5)/ 1+1=27。恰好使大小再卷積過後仍保持不變。這件事文章中也沒提,偷吃步。卷積核增加至256,一樣分2個GPU運算,所以各自是128。
本層也有池化,池化核和步長與第一層相同,所以(27–3)/2+1=13。然後再LRN,最後輸出是13*13*128*2。

(3)卷積層:卷積核是3*3,步長是1,所以(13–3)/1+1=11,又不吻合了。所以接下來的層數都會和第二層一樣,先加一點像素擴充,再丟進網路。重點就是維持目前的大小。接下來的三層卷積都會擴充1個像素,所以是(15–3)/1+1=13。
卷積核是384,分兩個GPU運算,所以各自是192。但在本層有進行交換,兩個GPU都要接收上一層全部的神經網路輸出。
本層沒有池化,但有LRN。

(4)卷積層:和第三層幾乎一樣,唯一的差別是本層不溝通,各自只接收上一層一半的輸出。

(5)卷積層:還是維持13*13的大小,但卷積核又回到256,分兩個GPU各128。本層亦不溝通。
有池化,一樣是3*3,步長是2。(13–3)ㄥ2+1=6。目前大小為6*6*128*2。

(6)全連接層:每一個神經元都要拿出來。最後的輸出是4096 1 1,分兩個GPU但彼此有互通,各自是2048。本層另外還有drop out機制,會隨機的把每個神經元去除,一般是50%機率。如此可減少overfitting,又可以減少神經網路而增加運算速度;此外也有一說是可以對樣本增加複雜度,變相增加樣本數而提升訓練效果。

(7)全連接層:和第七層完全一樣。

(8)輸出層:將結果用softmax分成1000個類型,各自的機率加總為100%。由此來判斷最可能的一個或五個分類項目。

降低overfitting的方法

本神經網路共有60萬個神經元。訓練的過程中難保不會有overfitting,但這是要盡量避免的事情。以下是文章中提出降低overfitting的方法:

資料擴充(data augmentation)

最簡單且常用的方法之一。將已知標籤的資料進行變形,以人工的方式增加資料量。本文提到使用兩種增加資料量的方式,兩個方法都只用很小的運算方式即可達成,而且不用將資料存在硬碟中。

(1)用影像轉譯(image translation)和水平鏡像。利用一個224 224大小的框隨機裁取原本圖片(256 256)及水平鏡像處理過的圖片。才取之後的影像再放入神經網路。這讓我們訓練影像的數目增加2048倍。在測試時,神經網路會在圖片中用224 224的框隨機裁切5張,同時在其水平鏡像也裁切五張,共10張。接著以softmax運算出可能性之後,將10張平均以取得結果。

(2)改變圖片RGB的強度。他們對圖片中的像素RGB值做主成分分析(PCA)。在每個訓練圖片,將原本的RGB值乘以主成分 — 由一個相對應的特徵值,和一個由高斯分布抽樣出來的隨機變數,其平均值為0,標準差為0.1 — 所以每個圖片中的畫素RGB值 ,會再加上一組 ,其中p和λ分別為一個由RGB像素值所組成的3 3共變異數矩陣所對應的特徵向量和特徵值。α則是上述提到的隨機變數。每一個α都只在該圖片的該像素被拿來訓練時才抽一次。如果該圖片被再次選中作為訓練時,會重新再抽一個。這樣一來圖片的顏色會隨機變化,然而圖片中的特徵性質是不變的。利用這樣的方式增加資料量,文章中認為這可以幫助下降top-1誤判率1%。

Dropout

如前所述,以50%的機率隨機將神經元的輸出設為0。被「封口」的神經元將不再對下面一層輸出,也不參與反向傳播。所以每次神經網路的結構都會有一些變動,但這些神經元仍共享權重。這種方法強迫每個神經元盡量學習各自獨立的特徵,而非根據周圍的神經元調整自己學的特徵。測試時則使用全部的神經元但把輸出乘0.5,以模仿訓練時由dropout的狀況下,神經網路做的預測。
dropout使用在兩層全連接層,也就是第六和第七層。這是一個降低overfitting很關鍵的手法。

下一篇會將後段的學習細節、結果、討論再做進一步分析。

本文請勿轉載,謝謝。

Reference

[1] A. Krizhevsky, I. Sutskever, G.E.Hinton: ImageNet Classification with Deep Convolutional Neural Networks, 2012

--

--

Martin Huang

崎嶇的發展 目前主攻CV,但正在往NLP的路上。 歡迎合作或聯絡:martin12345m@gmail.com