本課重點(diǎn):
-
經(jīng)典CNN架構(gòu)
-
AlexNet
-
VGG
-
GoogLeNet
-
ResNet
-
-
其他架構(gòu)
1 經(jīng)典架構(gòu)
1.1 AlexNet
首先回顧一下在數(shù)字識別領(lǐng)域有巨大成功的LeNet-5缰盏,該網(wǎng)絡(luò)結(jié)構(gòu)為 [CONV-POOL-CONV-POOL-FC-FC]蓝仲。卷積層使用5x5的卷積核,步長為1蒋得;池化層使用2x2的區(qū)域饮醇,步長為2;后面是全連接層。如下圖所示:
而2012年的AlexNet是第一個在ImageNet大賽上奪冠的大型CNN網(wǎng)絡(luò)姜胖,它的結(jié)構(gòu)和LeNet-5很相似,只是層數(shù)變多了——[CONV1-MAX POOL1-NORM1-CONV2-MAX POOL2-NORM2-CONV3-CONV4-CONV5-Max POOL3-FC6-FC7-FC8]淀散,共有5個卷積層右莱、3個池化層、2個歸一化層和三個全連接層档插。如下圖所示:
- 輸入:227x227x3的圖片慢蜓;
- CONV1:使用96個11x11大小的卷積核,步長為4郭膛,由于(227-11)/4+1=55晨抡,所以輸出的尺寸為55x55x96,共有96x11x11x3個參數(shù);
- POOL1:使用3x3的池化區(qū)域耘柱,步長為2如捅,由于(55-3)/2+1=27,所以輸出為27x27x96调煎,沒有參數(shù)镜遣;
- NORM1:歸一化后仍然是27x27x96;
- CONV2:使用256個5x5的卷積核士袄,stride 1烈涮、pad 2 ,(27+2x2-5)+1=27窖剑,所以輸出為27x27x256坚洽;
- POOL2:3x3 filters,stride 2 西土,(27-3)/2+1=13讶舰,所以輸出為13x13x256;
- NORM2:13x13x256需了;
- CONV3: 384個3x3 filters跳昼,stride 1, pad 1,輸出 [13x13x384] 肋乍;
- CONV4: 384個3x3 filters鹅颊,stride 1, pad 1,輸出[13x13x384] 墓造;
- CONV5: 256個3x3 filters堪伍,stride 1, pad 1,輸出 [13x13x256]觅闽;
- POOL3: 3x3 filters帝雇,stride 2 輸出為[6x6x256];
- FC6: 4096個神經(jīng)元蛉拙,輸出為[4096]尸闸;
- FC7: 4096個神經(jīng)元,輸出為[4096]孕锄;
- FC8: 1000個神經(jīng)元吮廉,(class scores)輸出為[1000]。
之所以分成上下兩個部分畸肆,是因為當(dāng)時的GPU容量太小宦芦,只能用兩個來完成。還有一些細(xì)節(jié)是:
- 第一次使用ReLU函數(shù)恼除;
- 使用歸一化層(現(xiàn)在不常用了) 踪旷;
- 數(shù)據(jù)增強(qiáng)曼氛;
- dropout 0.5 ;
- batch size 128令野;
- SGD Momentum 0.9 舀患;
- 學(xué)習(xí)率1e-2, 當(dāng)驗證準(zhǔn)確率平穩(wěn)時,手動減少10气破;
- L2權(quán)重衰減是5e-4
- 7 CNN ensemble: 18.2% -> 15.4%
AlexNet奪得ImageNet大賽2012的冠軍時聊浅,將正確率幾乎提高了10%,2013年的冠軍是ZFNet现使,和AlexNet使用相同的網(wǎng)絡(luò)架構(gòu)低匙,只是對超參數(shù)進(jìn)一步調(diào)優(yōu):
- CONV1: 將 (11x11 stride 4) 改為 (7x7 stride 2) ;
- CONV3,4,5: 不再使用384, 384, 256個濾波器碳锈,而是使用512, 1024, 512個顽冶。
這樣將錯誤率從16.4%降低到11.7%
14年的冠亞軍GoogLeNet和VGG分別有22層和19層,下面來分別介紹售碳。
1.2 VGG
VGG相對于AlexNet使用更小的卷積核强重,層數(shù)也更深。VGG有16層和19層兩種贸人。卷積核只使用3x3间景,步長為1,pad為1艺智;池化區(qū)域2x2倘要,步長為2。
那么為什么使用3x3的小卷積核呢十拣?
- 多個卷積層堆疊時封拧,第一層的感受野是3x3,第二層的感受野是5x5(感受原圖像)父晶,這樣堆疊三層的有效感受野就變成7x7哮缺;
- 多個3x3的卷基層比一個大尺寸卷積核的卷積層有更多的非線性(更多層的非線性函數(shù)),使得判決函數(shù)更加具有判決性甲喝;
- 多個3x3的卷積層比一個大尺寸的卷積核有更少的參數(shù),假設(shè)卷積層的輸入和輸出的特征圖大小相同為C铛只,那么三個3x3的卷積層參數(shù)個數(shù)3x(3x3xCxC)=27C2埠胖;一個7x7的卷積層參數(shù)為 7x7xCxC=49C2;所以可以把三個3x3的filter看成是一個7x7filter的分解(中間層有非線性的分解, 并且起到隱式正則化的作用)淳玩。
下面看一下VGG-16的參數(shù)和內(nèi)存使用情況:
- 總內(nèi)存占用: 24M * 4 bytes直撤,每張圖片約96MB,加上反向傳播需要乘以2蜕着;大多數(shù)內(nèi)存都用在了前面幾層卷積層谋竖;
- 總參數(shù)個數(shù): 138M红柱,大多都在全連接層,全連接層的第一層就有100多M蓖乘。
VGG網(wǎng)絡(luò)的一些細(xì)節(jié)是:
- 14年ImageNet大賽分類第二名锤悄,定位第一名;
- 訓(xùn)練過程和AlexNet很接近嘉抒;
- 不使用局部響應(yīng)歸一化零聚;
- 有16層和19層兩種,19層效果稍微好一些些侍,但是占用更多內(nèi)存隶症,16層應(yīng)用的更廣泛;
- 使用模型集成岗宣;
- FC7的特征泛化非常好蚂会,可以直接用到其他任務(wù)中。
下面來看一下分類的第一名耗式,GoogLeNet颂龙。
1.3 GoogLeNet
先說明GoogLeNet的一些細(xì)節(jié):
- 網(wǎng)絡(luò)有22層,比VGG深一些纽什;
- 為了高效的計算措嵌,使用 “Inception” 模塊;
- 不使用全連接層芦缰;
- 只有500萬個參數(shù)企巢,比AlexNet少了12倍;
- 14年分類的冠軍(6.7% top 5 error)
1.3.1 Inception Module
“Inception”模塊是一種設(shè)計的比較好的局域網(wǎng)拓?fù)浣Y(jié)構(gòu)让蕾,然后將這些模塊堆疊在一起浪规。
這種拓?fù)浣Y(jié)構(gòu)對來自前一層的輸入,并行應(yīng)用多種不同的濾波操作探孝,比如1x1卷積笋婿、3x3卷積、5x5卷積和3x3池化顿颅。然后將所有濾波器的輸出在深度上串聯(lián)在一起缸濒。如下圖所示:
但是這種結(jié)構(gòu)的一個問題是計算復(fù)雜度大大增加。比如考慮下面的網(wǎng)絡(luò)設(shè)置:
輸入為28x28x256粱腻,而串聯(lián)后的輸出為28x28x672庇配。(假設(shè)每個濾波操作都通過零填充保持輸入尺寸)并且運(yùn)算花費(fèi)也非常高:
- [1x1 conv, 128] 28x28x128x1x1x256次乘法運(yùn)算;
- [3x3 conv, 192] 28x28x192x3x3x256次绍些;
- [5x5 conv, 96] 28x28x96x5x5x256次捞慌。
總計: 854M次乘法運(yùn)算。
由于池化操作會保持原輸入的深度柬批,所以網(wǎng)絡(luò)的輸出一定會增加深度啸澡。解決辦法是在進(jìn)行卷積操作前添加一個“瓶頸層”袖订,該層使用1x1卷積,目的是保留原輸入空間尺寸的同時嗅虏,減小深度洛姑,只要卷積核的數(shù)量小于原輸入的深度即可。
使用這種結(jié)構(gòu)旋恼,同樣的網(wǎng)絡(luò)參數(shù)設(shè)置下吏口,的確會減少計算量:
最終得到的輸出為28x28x480。此時總運(yùn)算量為:
- [1x1 conv, 64] 28x28x64x1x1x256
- [1x1 conv, 64] 28x28x64x1x1x256
- [1x1 conv, 128] 28x28x128x1x1x256
- [3x3 conv, 192] 28x28x192x3x3x64
- [5x5 conv, 96] 28x28x96x5x5x64
- [1x1 conv, 64] 28x28x64x1x1x256
總計:358M冰更。減少了一倍多产徊。
1.3.2 完整結(jié)構(gòu)
Inception module堆疊成垂直結(jié)構(gòu),這里方便描述蜀细,將模型水平放置:
藍(lán)色部分主干網(wǎng):
Input - Conv 7x7+2(S) - MaxPool 3x3+2(S) - LocalRespNorm - Conv 1x1+1(V) - Conv 3x3+1(S) - LocalRespNorm - MaxPool 3x3+2(S)
含參數(shù)的層只有3個卷積層舟铜;紅色部分Inception module堆疊:
并行層只算一層,所以一個Inception module只有兩層奠衔,共有9個相同的模塊18層谆刨。綠色部分的輸出:
移除昂貴的全連接層,只留一個分類用的FC归斤。
AveragePool 7x7+1(V) - FC - SoftmaxActivation - Output
所以含參數(shù)的層總計3+18+1 = 22層痊夭。此外,橙色部分的層不計入總層數(shù)脏里,這兩塊的結(jié)構(gòu)都是:AveragePool 5x5+3(V) - Conv 1x1+1(S) - FC - FC - SoftmaxActivation - Output她我。“該相對較淺的網(wǎng)絡(luò)在此分類任務(wù)上的強(qiáng)大表現(xiàn)表明迫横,網(wǎng)絡(luò)中間層產(chǎn)生的特征應(yīng)該是非常有區(qū)別性的番舆。 通過添加連接到這些中間層的輔助分類器,我們期望在分類器的較低階段中鼓勵區(qū)分矾踱,增加回傳的梯度信號恨狈,并提供額外的正則化。 這些輔助分類器采用較小的卷積核呛讲,置于第三和第六個Inception module的輸出之上禾怠。 在訓(xùn)練期間,它們的損失會加到折扣權(quán)重的網(wǎng)絡(luò)總損失中(輔助分類的損失加權(quán)為0.3)圣蝎。 在預(yù)測時刃宵,這些輔助網(wǎng)絡(luò)被丟棄∨枪”——引自原論文
1.4 ResNet
從2015年開始,網(wǎng)絡(luò)的層數(shù)爆發(fā)式的增長哮针,15-17年的冠軍都是有152層关面,開始了“深度革命”坦袍!
ResNet是一種非常深的網(wǎng)絡(luò),使用了殘差連接等太。細(xì)節(jié)是:
- 152層捂齐;
- ILSVRC’15優(yōu)勝者(3.57% top 5 error);
- 橫掃了所有ILSVRC’15 和COCO’15分類/檢測的競賽缩抡!
表現(xiàn)這么好的ResNet僅僅是因為深嗎奠宜?答案是否定的,研究表明一個56層的卷積層堆疊網(wǎng)絡(luò)訓(xùn)練誤差和測試誤差都比一個20層的網(wǎng)絡(luò)要大瞻想,并且不是過擬合的原因压真,而是更深的網(wǎng)絡(luò)優(yōu)化更難。但是一個更深的模型至少能和一個較淺的模型表現(xiàn)一樣好蘑险,如果想把一個較淺的層變成較深的層滴肿,可以用下面的方式來構(gòu)建:將原來比較淺的層拷貝到較深的層中,然后添加一些等于本身的映射層〉杵現(xiàn)在較深的模型可以更好的學(xué)習(xí)泼差。
1.4.1 核心思想
ResNet通過使用多個有參層來學(xué)習(xí)輸入與輸入輸出之間的殘差映射( residual mapping ),而非像一般CNN網(wǎng)絡(luò)(如AlexNet/VGG等)那樣使用有參層來直接學(xué)習(xí)輸入輸出之間的底層映射( underlying mapping)呵俏。
殘差學(xué)習(xí)(Residual Learning)
若將輸入設(shè)為X堆缘,將某一有參網(wǎng)絡(luò)層映射設(shè)為H,那么以X為輸入的該層的輸出將為H(X)普碎。通常的CNN網(wǎng)絡(luò)會直接通過訓(xùn)練學(xué)習(xí)出參數(shù)函數(shù)H的表達(dá)式吼肥,從而直接得到 X 到 H(X) 的映射。而殘差學(xué)習(xí)則是致力于使用多個有參網(wǎng)絡(luò)層來學(xué)習(xí)輸入到輸入随常、輸出間的殘差(H(X) - X)的映射潜沦,即學(xué)習(xí) X -> (H(X) - X) ,然后加上X的自身映射(identity mapping)绪氛。也就是說網(wǎng)絡(luò)的輸出仍然是 H(X) - X + X = H(X)唆鸡,只是學(xué)習(xí)的只是 (H(X) - X),X部分直接是本身映射枣察。
自身映射(Identity Mapping)
殘差學(xué)習(xí)單元通過本身映射的引入在輸入争占、輸出之間建立了一條直接的關(guān)聯(lián)通道,從而使得強(qiáng)大的有參層集中精力學(xué)習(xí)輸入序目、輸出之間的殘差臂痕。一般我們用來表示殘差映射,那么殘差學(xué)習(xí)單元的輸出即為:
猿涨。當(dāng)輸入握童、輸出通道數(shù)相同時,自然可以直接使用 X 進(jìn)行相加叛赚。而當(dāng)它們之間的通道數(shù)目不同時澡绩,我們就需要考慮建立一種有效的自身映射函數(shù)從而可以使得處理后的輸入 X 與輸出 Y 的通道數(shù)目相同即
稽揭。
當(dāng)X與Y通道數(shù)目不同時,有兩種自身映射方式肥卡。一種是簡單地將X相對Y缺失的通道直接補(bǔ)零從而使其能夠相對齊溪掀,另一種則是通過使用1x1的卷積來表示 Ws 映射從而使得最終輸入與輸出的通道一致。
實驗表明使用一般意義上的有參層來直接學(xué)習(xí)殘差比直接學(xué)習(xí)輸入步鉴、輸出間映射要容易得多(收斂速度更快)揪胃,也有效得多(可通過使用更多的層來達(dá)到更高的分類精度)。比如在極端情況下氛琢,如果自身映射是最優(yōu)的喊递,那么將殘差設(shè)為零比通過使用一堆非線性層進(jìn)行自身映射更容易。
1.4.2 完整結(jié)構(gòu)
完整的網(wǎng)絡(luò)結(jié)構(gòu)如下:
- 殘差塊堆疊艺沼;
- 每個殘差塊有兩個3x3卷積層册舞;
- 周期性的使用兩倍的卷積核數(shù)量,降采樣通過設(shè)置步長為2障般;
- 在網(wǎng)絡(luò)開始處有7x7的卷積層和最大池化層(步長2)调鲸;
- 在網(wǎng)絡(luò)的最后不使用全連接層 (只有一個用于1000個分類的FC);
- 在最后一個卷積層后使用全局的平均池化挽荡;
- 總共的深度有34藐石、50、101或152定拟。
對于ResNet-50+的網(wǎng)絡(luò)于微,為提高計算效率,使用類似GoogLeNet的“瓶頸層”青自。像Inception模塊那樣通過使用1x1卷積來巧妙地縮減或擴(kuò)張?zhí)卣鲌D維度從而使得3x3 卷積的卷積核數(shù)目不受上一層輸入的影響株依,它的輸出也不會影響到下一層。不過它純是為了節(jié)省計算時間進(jìn)而縮小整個模型訓(xùn)練所需的時間而設(shè)計的延窜,對最終的模型精度并無影響恋腕。
1.4.3 網(wǎng)絡(luò)訓(xùn)練
ResNet的實際訓(xùn)練如下:
- 每個CONV層后使用批量歸一化;
- 權(quán)重使用He初始化逆瑞;
- 更新方式使用SGD + Momentum (0.9) 荠藤;
- 學(xué)習(xí)率為0.1, 驗證錯誤率不變時除10 ;
- Mini-batch size為256 获高;
- 權(quán)重衰減是1e-5 哈肖;
- 不使用dropout。
實際的訓(xùn)練效果為可以堆疊很多的層而不使準(zhǔn)確率下降:152在ImageNet上, 1202層在CIFAR上∧钛恚現(xiàn)在和預(yù)想中的一致淤井,網(wǎng)絡(luò)越深,訓(xùn)練準(zhǔn)確率越高。橫掃了2015年所有的獎項庄吼,第一次超過人類的識別率缎除。
1.5 幾種網(wǎng)絡(luò)的對比
下面左圖通過Top1準(zhǔn)確率來比較各種網(wǎng)絡(luò)的準(zhǔn)確性严就;右圖是不同網(wǎng)絡(luò)的運(yùn)算復(fù)雜度总寻,橫軸為計算量,圓圈大小表示內(nèi)存占用梢为。其中 Inception-v4是 Resnet + Inception渐行。
圖中可以看出:
- Inception-v4具有最高的準(zhǔn)確率;
- VGG內(nèi)存占用最大铸董,計算量最多祟印;
- GoogLeNet最高效,準(zhǔn)確率較高粟害,運(yùn)算復(fù)雜度較性桃洹;
- AlexNet計算量較小但內(nèi)存占用較大悲幅,準(zhǔn)確率也低套鹅;
- ResNet準(zhǔn)確率較高,效率取決于模型汰具。
還可以比較前向傳播時間和功率消耗:
2 其他網(wǎng)絡(luò)架構(gòu)
2.1 Network in Network (NiN)
- 在每個卷積層內(nèi)的Mlpconv層具有“Micronetwork”用于計算局部區(qū)域的更抽象的特征卓鹿;
- Micronetwork使用多層感知器(FC,即1x1卷積層)
- GoogLeNet和ResNet“瓶頸”層的先驅(qū)
- GoogLeNet的哲學(xué)靈感
2.2 ResNet的改進(jìn)
-
Identity Mappings in Deep Residual Networks
- 創(chuàng)造者自己改進(jìn)了ResNet塊設(shè)計
- 創(chuàng)建更直接的路徑留荔,以便在整個網(wǎng)絡(luò)中傳播信息(將激活函數(shù)移動到殘差的映射路徑)
- 提供更好的性能
-
Wide Residual Networks
- 認(rèn)為殘差是重要因素吟孙,而不是深度
- 使用更寬的殘差塊(F x k個濾波器代替每層中的F個濾波器)
- 50層Wide ResNet優(yōu)于152層原始ResNet
- 增加寬度而不是深度更具計算效率(可并行化)
-
ResNeXt
- 也來自ResNet的創(chuàng)建者
- 通過多個平行路徑增加殘差塊的寬度(“cardinality”)
- 與Inception模塊相似的并行路徑
- 單個分支“變窄”
-
Deep Networks with Stochastic Depth
- 動機(jī):在訓(xùn)練期間通過縮短網(wǎng)絡(luò)減少梯度消失和訓(xùn)練時間
- 在每次訓(xùn)練過程中隨機(jī)丟棄一個層子集
- 具有自身映射功能的旁路,丟棄的層權(quán)重為1聚蝶,恒等映射
- 在測試時使用完整的深度網(wǎng)絡(luò)
-
Network Ensembling(Fusion)
- 多尺度集成 Inception杰妓、Inception-Resnet、Resnet碘勉、Wide Resnet模型
- ILSVRC'16分類獲勝者
-
Squeeze-and-Excitation Networks (SENet)
- 添加“特征重新校準(zhǔn)”模塊巷挥,該模塊學(xué)習(xí)自適應(yīng)重新加權(quán)特征圖
- 全局信息(全局平均池化層)+ 2個FC層,用于確定特征圖權(quán)重恰聘,即“特征重新校準(zhǔn)”模塊
- ILSVRC'17分類獲勝者(使用ResNeXt-152作為基礎(chǔ)架構(gòu))
2.3 FractalNet
- 認(rèn)為關(guān)鍵是從淺層到深層有效地過渡句各,并且不需要?dú)埐畋硎?/li>
- 具有淺和深路徑輸出的分形結(jié)構(gòu)
- 訓(xùn)練時隨機(jī)拋棄子路徑
- 測試時使用完整網(wǎng)絡(luò)
2.4 Densely Connected Convolutional Networks
- 密集塊,其中每個層以前饋方式連接到之后的每個層
- 減輕梯度消失晴叨、加強(qiáng)特征傳播凿宾、鼓勵特征重用
2.5 Efficient Networks —— SqueezeNet
- 由1x1卷積核組成“擠壓”層,然后構(gòu)成Fire模塊兼蕊,由1x1和3x3卷積核組成“擴(kuò)展”層
- ImageNet上的AlexNet級精度初厚,參數(shù)減少50倍
- 可以壓縮到比AlexNet小510倍(0.5Mb參數(shù))
2.6 Learn network architectures —— Meta-learning
-
Neural Architecture Search with Reinforcement Learning (NAS)
- 一種“控制器”網(wǎng)絡(luò),可以學(xué)習(xí)設(shè)計良好網(wǎng)絡(luò)架構(gòu)(輸出與網(wǎng)絡(luò)設(shè)計相對應(yīng)的字符串)
- 迭代:
1)從搜索空間中采樣架構(gòu)
2)訓(xùn)練架構(gòu)以獲得相應(yīng)于準(zhǔn)確度的“獎勵”R
3)計算樣本概率的梯度,并通過R進(jìn)行縮放以執(zhí)行控制器參數(shù)更新(即增加被采樣架構(gòu)良好的可能性产禾,減少不良架構(gòu)的可能性)
-
Learning Transferable Architectures for Scalable Image Recognition
- 將神經(jīng)架構(gòu)搜索(NAS)應(yīng)用于像ImageNet這樣的大型數(shù)據(jù)集非常昂貴
- 設(shè)計可以靈活堆疊的構(gòu)建塊(“單元”)的搜索空間
- NASNet:使用NAS在較小的CIFAR-10數(shù)據(jù)集上找到最佳的單元結(jié)構(gòu)排作,然后將架構(gòu)轉(zhuǎn)移到ImageNet
總結(jié)
- 經(jīng)典架構(gòu)
- AlexNet:開啟CNN時代。
- VGG:減小卷積核尺寸亚情、增加網(wǎng)絡(luò)層數(shù)獲得高準(zhǔn)確率妄痪。
- GoogLeNet:引入 Inception module 。
- ResNet:引入殘差塊楞件,證明普通堆疊層數(shù)沒意義衫生,殘差堆疊可以;目前應(yīng)用最廣泛的網(wǎng)絡(luò)結(jié)構(gòu)土浸。
- 其他架構(gòu)
- NiN (Network in Network) :1x1卷積先驅(qū)
- Wide ResNet:加大ResNet的寬度而不是深度
- ResNeXT:使用多個分支加寬ResNet
- Stochastic Dept:Dropout層
- SENet:自適應(yīng)特征圖重新加權(quán)
- DenseNet:每個層連接到之后的每個層
- FractalNet:使用分形結(jié)構(gòu)罪针,不用殘差
- SqueezeNet:壓縮網(wǎng)絡(luò),減少參數(shù)
- NASNet:學(xué)習(xí)網(wǎng)絡(luò)架構(gòu)
- 總結(jié)
- VGG黄伊、GoogLeNet泪酱、ResNet均被廣泛使用,可在模型族中獲取 还最;
- ResNet是當(dāng)前默認(rèn)最佳的選擇墓阀,也可考慮SENet ;
- 研究趨向于極深的網(wǎng)絡(luò) 憋活;
- 研究重心圍繞層/跳過連接的設(shè)計和改善梯度流
- 努力研究深度岂津、寬度與殘差連接的必要性
- 更近期的趨勢是研究meta-learning