Inception

之前也寫過GoogLeNet的筆記,但那個時候對Inception有些似懂非懂,這周重新看了一遍,覺得有了新的體會,特地重新寫一篇博客與它再續前緣。

本文屬於論文筆記性質,特此聲明。

大體思路:(參考:http://blog.csdn.net/langb2014/article/details/52787095

  • Inception v1的網絡,將1x1,3x3,5x5的conv和3x3的pooling,stack在一起,一方面增加了網絡的width,另一方面增加了網絡對尺度的適應性;
  • v2的網絡在v1的基礎上,進行了改進,一方面了加入了BN層,減少了Internal Covariate Shift(內部neuron的數據分佈發生變化),使每一層的輸出都規範化到一個N(0, 1)的高斯,另外一方面學習VGG用2個3x3的conv替代inception模塊中的5x5,既降低了參數數量,也加速計算;
  • v3一個最重要的改進是分解(Factorization),將7x7分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算(多餘的計算能力可以用來加深網絡),又可以將1個conv拆成2個conv,使得網絡深度進一步增加,增加了網絡的非線性,還有值得注意的地方是網絡輸入從224x224變爲了299x299,更加精細設計了35x35/17x17/8x8的模塊;
  • v4研究了Inception模塊結合Residual Connection能不能有改進?發現ResNet的結構可以極大地加速訓練,同時性能也有提升,得到一個Inception-ResNet v2網絡,同時還設計了一個更深更優化的Inception v4模型,能達到與Inception-ResNet v2相媲美的性能

Network in Network

GoogLeNet提出之時,說到其實idea是來自NIN,NIN就是Network in Network了。

NIN有兩個特性,是它對CNN的貢獻:

  • MLP代替GLM
  • Global Average Pooling

mlpconv

普通的卷積可以看做是比較特殊的GLM,GLM就是廣義線性模型。那麼MLP是指,在做卷積操作的時候,把線性操作變爲多層感知機。

這個idea的理論基礎是多層感知機的抽象能力更強。假如我們把從圖像中抽取出來的特徵稱作是這個圖像的隱含概念(只是一個名稱罷了,不要過度追究),那麼如果隱含概念是線性可分的,那麼,GLM抽取出來的特徵沒有問題,抽象表達能力剛剛好。但是假如隱含概念並不是線性可分的,那麼就悲劇了,在只使用GLM的情況下,不得不過度的使用filter來表現這個隱含概念的各個方面,然後在下一層卷積的時候重新將這些概念組合,形成更加抽象的概念。

所以,基於如上,可以認爲,在抽特徵的時候直接做了非線性變換,可以有效的對圖像特徵進行更好的抽象。

從而,Linear convolution layer就變成了Mlpconv layer。

值得一提的是,Mlpconv相當於在正常的卷積層後面,再添加一個1×1的卷積層。

Global Average Pooling

Global Average Pooling的做法是將全連接層去掉。

全連接層的存在有兩個缺點:

  • 全連接層是傳統的神經網絡形式,使用了全連接層以爲着卷積層只是作爲特徵提取器來提取圖像的特徵,而全連接層是不可解釋的,從而CNN也不可解釋了
  • 全連接層中的參數往往佔據CNN整個網絡參數的一大部分,從而使用全連接層容易導致過擬合。

而Global Average Pooling則是在最後一層,將卷積層設爲與類別數目一致,然後全局pooling,從而輸出類別個數個結果。

使用了mlpconv和Global Average Pooling之後,網絡結構如下:

Inception

讀google的論文,你立馬會感到一股工程的氣息撲面而來。像此時的春風一樣,凌厲中透着暖意。所謂凌厲,就是它能把一個idea給用到節省內存和計算量上來,太偏實現了,所謂暖意,就是真的灰常有效果。

自2012年AlexNet做出突破以來,直到GoogLeNet出來之前,大家的主流的效果突破大致是網絡更深,網絡更寬。但是純粹的增大網絡有兩個缺點——過擬合和計算量的增加。

解決這兩個問題的方法當然就是增加網絡深度和寬度的同時減少參數,爲了減少參數,那麼自然全連接就需要變成稀疏連接,但是在實現上,全連接變成稀疏連接後實際計算量並不會有質的提升,因爲大部分硬件是針對密集矩陣計算優化的,稀疏矩陣雖然數據量少,但是所耗的時間卻是很難缺少。

所以需要一種方法,既能達到稀疏的減少參數的效果,又能利用硬件中密集矩陣優化的東風。Inception就是在這樣的情況下應運而生。

第一步,將卷積分塊,所謂的分塊就是其實就是將卷積核分組,既然是分組索性就讓卷積和不一樣吧,索性使用了1×1,3×3,5×5的卷積核,又因爲pooling也是CNN成功的原因之一,所以把pooling也算到了裏面,然後將結果在拼起來。這就是最naive版本的Inception。

對於這個Inception,有兩點需要注意:

  • 層級越高,所對應的原始圖片的視野就越大,同樣大小的卷積核就越難捕捉到特徵,因而層級越高,卷積核的數目就應該增加。
  • 1×1,3×3,5×5 只是隨意想出來的,不是必須這樣。

這個naive版的Inception,還有一個問題,因爲所有的卷積核都在上一層的所有輸出上來做,那5×5的卷積核所需的計算量就太大了。因而,可以採用NIN中的方法對上一層的輸出進行Merge。這樣就衍生出了真正可用的Inception。

這個結構利用了NIN結構中非線性變換的強大表達能力。

同時,正如上一篇博客決策森林和卷積神經網絡二道歸一中的隱式數據路由,計算量也大大減少,因爲四個分支之間是不需要做計算的。

再同時,還具有不同的視野尺度,因爲不同尺寸的卷積核和pooling是在一起使用的。

旁白贊曰:其謀略不可爲不遠,其心機不可謂不深啊。

之前心中一直有個疑問,那就是max-pooling之後的feature_map不是應該長寬都減半了麼,那怎麼與conv的輸出拼接。後來纔想到,是自己被theano中的實現誤導了,theano的實現是自動就縮小了,但stride爲1的時候,max_pooling的輸出還可以是長寬不變。

GoogLeNet的模型參數詳細如下:

結構如下:

需要注意的是,爲了避免梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度。文章中說這兩個輔助的分類器的loss應該加一個衰減係數,實際測試的時候,這兩個額外的softmax會被去掉。

Inception-V2

Google的論文還有一個特點,那就是把一個idea發揮到極致,不挖乾淨絕不罷手。所以第二版的更接近實現的Inception又出現了。Inception-V2這就是文獻[3]的主要內容。

Rethinking這篇論文中提出了一些CNN調參的經驗型規則,暫列如下:

  • 避免特徵表徵的瓶頸。特徵表徵就是指圖像在CNN某層的激活值,特徵表徵的大小在CNN中應該是緩慢的減小的。
  • 高維的特徵更容易處理,在高維特徵上訓練更快,更容易收斂
  • 低維嵌入空間上進行空間匯聚,損失並不是很大。這個的解釋是相鄰的神經單元之間具有很強的相關性,信息具有冗餘。
  • 平衡的網絡的深度和寬度。寬度和深度適宜的話可以讓網絡應用到分佈式上時具有比較平衡的computational budget。

Smaller convolutions

簡而言之,就是將尺寸比較大的卷積,變成一系列3×3的卷積的疊加,這樣既具有相同的視野,還具有更少的參數。

這樣可能會有兩個問題, 
- 會不會降低表達能力? 
- 3×3的卷積做了之後還需要再加激活函數麼?(使用ReLU總是比沒有要好)

實驗表明,這樣做不會導致性能的損失。

個人覺得,用大視野一定會比小視野要好麼? 疊加的小視野還具有NIN的效果。所以,平分秋色我覺得還不能說是因爲某個原因。

於是Inception就可以進化了,變成了

Asymmetric Convoluitons

使用3×3的已經很小了,那麼更小的2×2呢?2×2雖然能使得參數進一步降低,但是不如另一種方式更加有效,那就是Asymmetric方式,即使用1×3和3×1兩種來代替3×3. 如下圖所示:

使用2個2×2的話能節省11%的計算量,而使用這種方式則可以節省33%。

於是,Inception再次進化。

注意:實踐證明,這種模式的Inception在前幾層使用並不會導致好的效果,在feature_map的大小比較中等的時候使用會比較好

Auxiliary Classifiers

在GoogLeNet中,使用了多餘的在底層的分類器,直覺上可以認爲這樣做可以使底層能夠在梯度下降中學的比較充分,但在實踐中發現兩條:

  • 多餘的分類器在訓練開始的時候並不能起到作用,在訓練快結束的時候,使用它可以有所提升
  • 最底層的那個多餘的分類器去掉以後也不會有損失。
  • 以爲多餘的分類器起到的是梯度傳播下去的重要作用,但通過實驗認爲實際上起到的是regularizer的作用,因爲在多餘的分類器前添加dropout或者batch normalization後效果更佳。

Grid Size Reduction

Grid就是圖像在某一層的激活值,即feature_map,一般情況下,如果想讓圖像縮小,可以有如下兩種方式:

右圖是正常的縮小,但計算量很大。左圖先pooling會導致特徵表徵遇到瓶頸,違反上面所說的第一個規則,爲了同時達到不違反規則且降低計算量的作用,將網絡改爲下圖:

使用兩個並行化的模塊可以降低計算量。

V2-Inception

經過上述各種Inception的進化,從而得到改進版的GoogLeNet,如下:

圖中的Figure 4是指沒有進化的Inception,Figure 5是指smaller conv版的Inception,Figure 6是指Asymmetric版的Inception。

Label Smoothing

除了上述的模型結構的改進以外,Rethinking那篇論文還改進了目標函數。

原來的目標函數,在單類情況下,如果某一類概率接近1,其他的概率接近0,那麼會導致交叉熵取log後變得很大很大。從而導致兩個問題:

  • 過擬合
  • 導致樣本屬於某個類別的概率非常的大,模型太過於自信自己的判斷。

所以,使用了一種平滑方法,可以使得類別概率之間的差別沒有那麼大,

用一個均勻分佈做平滑,從而導致目標函數變爲:

該項改動可以提升0.2%。

Rethinking 那篇論文裏還有關於低分辨率的輸入的圖像的處理,在此不贅述了。

參考文獻

[1]. Lin M, Chen Q, Yan S. Network in network[J]. arXiv preprint arXiv:1312.4400, 2013.

[2]. Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 1-9.

[3]. Szegedy C, Vanhoucke V, Ioffe S, et al. Rethinking the Inception Architecture for Computer Vision[J]. arXiv preprint arXiv:1512.00567, 2015.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章