本文介紹關(guān)于GoogLeNet第一篇正式論文料皇,習(xí)慣稱為inception v1,如下:
- [v1] Going Deeper with Convolutions践剂,top5 error 6.67%
在開始介紹論文之前逊脯,先說一些題外話,GoogLeNet這個(gè)名字的誕生由兩方面促成巩螃,一是設(shè)計(jì)者在Google工作匕争,二是向LeNet致敬。GoogLeNet只是一個(gè)名字拍皮,它的核心內(nèi)容是發(fā)明了Inception Architecture(以下簡稱IA),發(fā)明IA的靈感來自于2013年的一篇論文《Provable Bounds for Learning Some Deep Representations》盗胀,這篇論文讀起來非常困難锄贼,需要很多的數(shù)學(xué)知識,有興趣的可以看看屑迂。
一冯键、inception v1的主要貢獻(xiàn)
- 1、提出inception architecture并對其優(yōu)化
- 2手报、取消全連層
- 3改化、運(yùn)用auxiliary classifiers加速網(wǎng)絡(luò)converge
接下來對以上幾點(diǎn)分別介紹。
二揍鸟、Inception architecture
首先得說一下Szegedy發(fā)明IA的動機(jī)句旱,他估計(jì)是在某天閱讀了Provable Bounds for Learning Some Deep Representations這篇論文谈撒,又結(jié)合自己多年來在深度學(xué)習(xí)界摸爬滾打的經(jīng)驗(yàn),發(fā)現(xiàn)傳統(tǒng)的提高網(wǎng)絡(luò)精度的方法是一條邪路(P.S. 傳統(tǒng)的方法指的是 擴(kuò)大網(wǎng)絡(luò)規(guī)模 或 增大訓(xùn)練數(shù)據(jù)集)道川,而想從本質(zhì)上提高網(wǎng)絡(luò)性能立宜,就得用sparsely connected architectures,即“稀疏連接結(jié)構(gòu)”尊流。
我自己對“稀疏連接結(jié)構(gòu)”的理解是這樣的灯帮,用盡可能的“小”逻住、“分散”的可堆疊的網(wǎng)絡(luò)結(jié)構(gòu)迎献,去學(xué)習(xí)復(fù)雜的分類任務(wù)吁恍,怎么體現(xiàn)“小”、“分散”呢伴奥?如下圖:
原來造神經(jīng)網(wǎng)絡(luò)感局,都是一條線下來,我們可以回想一下AlexNet询微、VGG等著名網(wǎng)絡(luò)拓提,而IA是“分叉-匯聚”型網(wǎng)絡(luò)隧膘,也就是說在一層網(wǎng)絡(luò)中存在多個(gè)不同尺度的kernels,卷積完畢后再匯聚蹦疑,為了更好理解萨驶,“匯聚”的tensorflow代碼寫出來是這樣的:
net = tf.concat(3, [branch1x1, branch5x5, branch3x3, branch_pool])
就是簡單的在kernel維度把矩陣concatenate起來。但是這么做有一個(gè)問題叁温,會產(chǎn)生“維度爆炸”核畴,什么意思呢谤草?假如branch1x1莺奸、branch3x3冀宴、branch5x5都有256個(gè)kernels,加上branch_pool的kernels(假定為256)甚疟,經(jīng)過tf.concat操作刨肃,最終的kernels是256×4=1024個(gè)kernels真友!這沒法接受啊盔然!如果多層IA疊加起來愈案,那kernels的數(shù)量豈不上天!遭铺!于是Szegedy就改進(jìn)了一下恢准,如下圖:
他加入了kernels數(shù)量控制方式馁筐,就是那些1×1的卷積層,這些1×1的卷積層輸出kernels會比上一層要少敏沉,這樣即便在經(jīng)過tf.concat以后盟迟,總kernels數(shù)量不會增加太多。另外迫皱,這些1×1的卷積層還增加了網(wǎng)絡(luò)的非線性程度要尔。
關(guān)于IA的結(jié)構(gòu)就介紹完了新娜,可是既绩,為什么饲握?這樣的結(jié)構(gòu)有啥用?Szegedy在論文里解釋過一點(diǎn)點(diǎn):IA之所以能提高網(wǎng)絡(luò)精度衰粹,可能就是歸功于它擁有多個(gè)不同尺度的kernels笆怠,每一個(gè)尺度的kernel會學(xué)習(xí)不同的特征,把這些不同kernels學(xué)習(xí)到的特征匯聚給下一層瓢捉,能夠更好的實(shí)現(xiàn)全方位的深度學(xué)習(xí)办成!
三迂卢、取消全連層
為什么VGG網(wǎng)絡(luò)的參數(shù)那么多?就是因?yàn)樗谧詈笥袃蓚€(gè)4096的全連層靶壮!Szegedy吸取了教訓(xùn)拍摇,為了壓縮GoogLeNet的網(wǎng)絡(luò)參數(shù)馆截,他把全連層取消了蜡娶!其實(shí)我個(gè)人也認(rèn)為全連層作用確實(shí)沒那么大,取消了也好幕随,GoogLeNet網(wǎng)絡(luò)詳細(xì)配置如下:
從上圖就可以看出宿接,網(wǎng)絡(luò)的最后幾層是avg pool、dropout梢卸、linear和softmax蛤高,沒有看到fully connect的影子。現(xiàn)在取消全連層貌似是個(gè)大趨勢塞绿,近兩年的優(yōu)秀大型神經(jīng)網(wǎng)絡(luò)都沒有全連層恤批,可能是全連層參數(shù)太多,網(wǎng)絡(luò)深度增加了以后涧黄,難以接受吧
四赋荆、Auxiliary classifiers
搞機(jī)器學(xué)習(xí)的都知道窄潭,梯度消散是所有深層網(wǎng)絡(luò)的通病,往往訓(xùn)練到最后月帝,網(wǎng)絡(luò)最開始的幾層就“訓(xùn)不動了”幽污!于是Szegedy加入了auxiliary classifiers(簡稱AC),用于輔助訓(xùn)練簸搞,加速網(wǎng)絡(luò)converge准潭,如下圖畫紅框部分:
以上圖片摘自此文,因?yàn)榫W(wǎng)絡(luò)太深了寺擂,豎著太長,就把它橫過來看了垦细〉脖疲可以看到挚瘟,筆者在網(wǎng)絡(luò)中間層加入了兩個(gè)AC,這兩個(gè)AC在訓(xùn)練的時(shí)候也跟著學(xué)習(xí)焰檩,同時(shí)把自己學(xué)習(xí)到的梯度反饋給網(wǎng)絡(luò)订框,算上網(wǎng)絡(luò)最后一層的梯度反饋穿扳,GoogLeNet一共有3個(gè)“梯度提供商”,先不說這么做有沒有問題矛物,它確實(shí)提高了網(wǎng)絡(luò)收斂的速度履羞,因?yàn)樘荻却罅寺铩A硗獍疲珿oogLeNet在做inference的時(shí)候AC是要被摘掉的糙及。
AC這種加速收斂訓(xùn)練方式與ResNet表面上看不太一樣,但是我感覺本質(zhì)上應(yīng)該是類似的唇聘。ResNet也很深雳灾,但是它先是通過構(gòu)建淺層網(wǎng)絡(luò)學(xué)習(xí)參數(shù)冯凹,再把淺層網(wǎng)絡(luò)的參數(shù)應(yīng)用到較深網(wǎng)絡(luò)中,從而盡可能減少梯度消散的影響匈庭。GoogLeNet是直接把淺層網(wǎng)絡(luò)的訓(xùn)練和深層網(wǎng)絡(luò)的訓(xùn)練揉到一起了阱持。關(guān)于這個(gè)問題還有待深究。