網(wǎng)絡(luò)結(jié)構(gòu)
AlexNet包含5個卷積層和3個全連接層,此外還包含一些max pooling層、LRN層(局部響應(yīng)歸一化),具體結(jié)構(gòu)如下:
1.第一層為卷積層,共有96個大小為11*11*3的卷積核,步長為4。后跟LRN層和max pooling層。
2.第二層為卷積層,共有256個大小為5*5*96的卷積核,步長為1。后跟LRN層和max pooling層。
3.第三層為卷積層,共有384個大小為3*3*256的卷積核,步長為1。后面沒有LRN層和max pooling層。
4.第四層為卷積層,共有384個大小為3*3*384的卷積核,步長為1。后面沒有LRN層和max pooling層。
5.第五層為卷積層,共有256個大小為3*3*384的卷積核,步長為1。后面沒有LRN層,只有max pooling層。
6.最后三層為全連接層,每一層都有4096個神經(jīng)元。
在所有層中,用的都是ReLU激活函數(shù)。并且上面提到的max pooling層的kernel都是3*3,步長為2(有重疊的pooling)
相關(guān)trick
一、加速trick
1. 非飽和激活函數(shù)
與之前常用的sigmoid和tanh等有飽和狀態(tài)的函數(shù)不同,AlexNet中使用了此前Hiton等提出的ReLU(Rectified Linear Units)函數(shù),它是非飽和的,可以加速訓(xùn)練。此外,還有許多其他的優(yōu)點。(詳細內(nèi)容請戳:深度學(xué)習(xí)中的激活函數(shù))
2. 雙GPU訓(xùn)練
將網(wǎng)絡(luò)放到兩個GPU上訓(xùn)練,加速是次要的,主要還是因為當(dāng)時單個的GPU很難能放得下AlexNet如此復(fù)雜的神經(jīng)網(wǎng)絡(luò)。作者使用的是兩塊顯存為3GB的GTX 580,將網(wǎng)絡(luò)參數(shù)分?jǐn)偟絻蓚€GPU上并行訓(xùn)練。對于論文中給出的結(jié)構(gòu)圖,有些地方不太理解,為什么有些卷積層之間只對上一層中和它在同一個GPU上的map進行卷積?不應(yīng)該是對上一層所有的map進行卷積嗎?
二、防止過擬合trick
1. Dropout
Dropout也是在AlexNet之前就由Hiton等人提出了,但是直到AlexNet才開始發(fā)揚光大。Dropout就是說,再訓(xùn)練的時候,所有的神經(jīng)元都以一定的概率p被置為0,論文中取p=0.5,但是網(wǎng)絡(luò)的權(quán)值都是共享的。這樣,每個bacth送進網(wǎng)絡(luò)進行訓(xùn)練的時候,相當(dāng)于每次訓(xùn)練的網(wǎng)絡(luò)結(jié)構(gòu)都是不太相同的。最終訓(xùn)練完成之后,進行分類的時候,所有的神經(jīng)元都不會被置為0,也就是說Dropout只發(fā)生在訓(xùn)練階段。這樣,最后的分類結(jié)果其實就相當(dāng)于集成了多個不同的網(wǎng)絡(luò),效果自然會得到提升,泛化能力也強,在一定程度上可以減輕過擬合。
注意,在測試的時候,所有的神經(jīng)元都要乘以p。個人理解應(yīng)該是為了使得測試和訓(xùn)練的時候,這一層的輸出在一個量級上,否則會影響下一層的輸入。比如經(jīng)過Dropout后,3*3的一個小鄰域卷積后得到的結(jié)果為5,而沒有Dropout時,可能這個結(jié)果是10,而后面的輸入都是以5為輸入進行訓(xùn)練的,所以當(dāng)將10輸入后,肯定會影響之后的結(jié)果。
2. 數(shù)據(jù)增強
也就是擴充數(shù)據(jù)集,因為AlexNet要學(xué)習(xí)的參數(shù)有很多,而樣本集相對于這個巨大的參數(shù)量來說還是有些不夠,這種情況下可能會導(dǎo)致過擬合,所以進行數(shù)據(jù)擴充也會緩解一下過擬合現(xiàn)象。AlexNet主要使用兩種方式來對數(shù)據(jù)集進行擴充:
(1) 平移和旋轉(zhuǎn)。步長為1,從256*256的圖像中滑動提取224*224的新圖像,這樣每張圖片得到的新圖片為(256-224)^2=1024張。然后在進行水平翻轉(zhuǎn),最后每張圖片可以得到1024*2=2048張圖片。雖然說這樣得到的圖片其實都是極其相似的,但是也還是有效果的。
(2)對RGB像素值執(zhí)行PCA等等,這一部分并不是很懂
3. LRN
局部響應(yīng)歸一化,簡單來說就是對于在同一位置,不同的map層之間的神經(jīng)元進行歸一化。使得值越大的神經(jīng)元會更大,小的會更小。這樣會增加泛化能力,畢竟這樣的話,不同的輸入對于這些神經(jīng)元的影響也會變小,不會過于敏感。論文中還提到說這樣會激發(fā)不同kernel得到的神經(jīng)元之間的競爭。不過貌似提升不是很大,現(xiàn)在用的不多。
4. Overlapping Pooling
顧名思義,就是在進行pooling操作時,會有重疊現(xiàn)象。舉個例子,之前使用的pooling的kernel大小如果是3*3的話,一般步長也是3,那么上一次進行pooling操作的那些神經(jīng)元,下一次就不會再出現(xiàn)了;而AlexNet使用的步長則是2,也就是說上一次進行pooling操作的那些神經(jīng)元,下一次操作時還有一部分也會出現(xiàn)。這樣得到的結(jié)果當(dāng)然就更精細,可以一定程度上提升泛化能力。