GoogLeNet的心路歷程(二)

本文介紹關(guān)于GoogLeNet第一篇正式論文,習(xí)慣稱為inception v1,如下:

在開始介紹論文之前,先說一些題外話,GoogLeNet這個名字的誕生由兩方面促成,一是設(shè)計者在Google工作,二是向LeNet致敬。GoogLeNet只是一個名字,它的核心內(nèi)容是發(fā)明了Inception Architecture(以下簡稱IA),發(fā)明IA的靈感來自于2013年的一篇論文《Provable Bounds for Learning Some Deep Representations》,這篇論文讀起來非常困難,需要很多的數(shù)學(xué)知識,有興趣的可以看看。

一、inception v1的主要貢獻

  • 1、提出inception architecture并對其優(yōu)化
  • 2、取消全連層
  • 3、運用auxiliary classifiers加速網(wǎng)絡(luò)converge

接下來對以上幾點分別介紹。

二、Inception architecture

首先得說一下Szegedy發(fā)明IA的動機,他估計是在某天閱讀了Provable Bounds for Learning Some Deep Representations這篇論文,又結(jié)合自己多年來在深度學(xué)習(xí)界摸爬滾打的經(jīng)驗,發(fā)現(xiàn)傳統(tǒng)的提高網(wǎng)絡(luò)精度的方法是一條邪路(P.S. 傳統(tǒng)的方法指的是 擴大網(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)“小”、“分散”呢?如下圖:


Inception Architecture,naive version

原來造神經(jīng)網(wǎng)絡(luò),都是一條線下來,我們可以回想一下AlexNet、VGG等著名網(wǎng)絡(luò),而IA是“分叉-匯聚”型網(wǎng)絡(luò),也就是說在一層網(wǎng)絡(luò)中存在多個不同尺度的kernels,卷積完畢后再匯聚,為了更好理解,“匯聚”的tensorflow代碼寫出來是這樣的:

net = tf.concat(3, [branch1x1, branch5x5, branch3x3, branch_pool])

就是簡單的在kernel維度把矩陣concatenate起來。但是這么做有一個問題,會產(chǎn)生“維度爆炸”,什么意思呢?假如branch1x1、branch3x3、branch5x5都有256個kernels,加上branch_pool的kernels(假定為256),經(jīng)過tf.concat操作,最終的kernels是256×4=1024個kernels!這沒法接受??!如果多層IA疊加起來,那kernels的數(shù)量豈不上天??!于是Szegedy就改進了一下,如下圖:

Inception module with dimension reductions

他加入了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在論文里解釋過一點點:IA之所以能提高網(wǎng)絡(luò)精度,可能就是歸功于它擁有多個不同尺度的kernels,每一個尺度的kernel會學(xué)習(xí)不同的特征,把這些不同kernels學(xué)習(xí)到的特征匯聚給下一層,能夠更好的實現(xiàn)全方位的深度學(xué)習(xí)!

三、取消全連層

為什么VGG網(wǎng)絡(luò)的參數(shù)那么多?就是因為它在最后有兩個4096的全連層!Szegedy吸取了教訓(xùn),為了壓縮GoogLeNet的網(wǎng)絡(luò)參數(shù),他把全連層取消了!其實我個人也認為全連層作用確實沒那么大,取消了也好,GoogLeNet網(wǎng)絡(luò)詳細配置如下:


GoogLeNet詳細配置

從上圖就可以看出,網(wǎng)絡(luò)的最后幾層是avg pool、dropout、linear和softmax,沒有看到fully connect的影子?,F(xiàn)在取消全連層貌似是個大趨勢,近兩年的優(yōu)秀大型神經(jīng)網(wǎng)絡(luò)都沒有全連層,可能是全連層參數(shù)太多,網(wǎng)絡(luò)深度增加了以后,難以接受吧

四、Auxiliary classifiers

搞機器學(xué)習(xí)的都知道,梯度消散是所有深層網(wǎng)絡(luò)的通病,往往訓(xùn)練到最后,網(wǎng)絡(luò)最開始的幾層就“訓(xùn)不動了”!于是Szegedy加入了auxiliary classifiers(簡稱AC),用于輔助訓(xùn)練,加速網(wǎng)絡(luò)converge,如下圖畫紅框部分:

GoogLeNet

以上圖片摘自此文,因為網(wǎng)絡(luò)太深了,豎著太長,就把它橫過來看了??梢钥吹?,筆者在網(wǎng)絡(luò)中間層加入了兩個AC,這兩個AC在訓(xùn)練的時候也跟著學(xué)習(xí),同時把自己學(xué)習(xí)到的梯度反饋給網(wǎng)絡(luò),算上網(wǎng)絡(luò)最后一層的梯度反饋,GoogLeNet一共有3個“梯度提供商”,先不說這么做有沒有問題,它確實提高了網(wǎng)絡(luò)收斂的速度,因為梯度大了嘛。另外,GoogLeNet在做inference的時候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)于這個問題還有待深究。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容