本文主要參考《TensorFlow 實戰》黃文堅、唐源著.
Inception V1
Google Inception Net V1和VGG同年面世,并且擊敗VGG奪得了ILSVRC 2014年比賽的第一名。Inception V1最大的特點是控制計算量和參數的同時,還獲得了非常好的分類性能——Top5 錯誤率為6.67%,只有AlexNet的一半不到。
Inception V1只有22層(卷積層,包含池化層共27層),比AlexNet的8層或是VGG的19層都要深。但是其計算量只有15億次浮點運算,同時只有500w參數數量,僅為AlexNet(6000w)的1/12,但是其準確率卻遠超AlexNet,可見Inception v1的性能非常優越。
一般來說,提升網絡性能最直接的辦法就是增加網絡深度和寬度,深度指網絡層次數量、寬度指神經元數量。但這種方式存在以下問題:
- 參數太多,需要供模型學習的數據量就越大,如果訓練數據集有限,很容易產生過擬合;
- 參數越多模型越大,計算復雜度也越大,耗費計算資源也更大;
- 網絡越深,容易出現梯度彌散問題(梯度越往后穿越容易消失),難以優化模型。
Inception V1參數少但效果好的原因除了模型更深,表達能力更強外,還有兩點:(1)其一是使用全局平均池化層來代替卷積層,這樣不僅能減少模型參數數量,還能減輕過擬合;(2)第二個就是Inception系列中的反復堆疊的Inception module,這些結構借鑒了NIN的思想,提高了參數的利用效率,每個Inception module都相當于大網絡中的小網絡。一般來說,卷積層想要提高表達能力,主要依靠增加輸出通道數,但副作用是計算量增大和過擬合,每一個輸出通道對應一個濾波器,同一個濾波器共享參數,只能提取一類特征,因此一個輸出通道只能作一個特征處理。
Inception module包括4個分支(如下圖):第一個分支對輸入進行1x1的卷積。1x1卷積是一個非常優秀的結構,他可以跨通道組織信息,提高網絡的表達能力,同時可以對輸出通道升維和降維,Inception module 的4個分支都用到了1x1卷積。第二個分支使用了1x1和3x3卷積,相當于進行了兩次特征變換。第三支分支類似。最后一個分支則是3x3最大池化層后使用1x1卷積。最后通過一個聚合操作將這四個分支的輸出通道合并。Inception module中包括3種不同的尺寸的卷積和1個最大池化,增加了網絡對不同尺度的適應性,這一部分和Multi-Scale的思想類似。早期計算機視覺的研究中,受靈長類視覺神經系統的啟發,Serre使用不同尺寸的Gabor濾波器處理不同尺寸的圖片,Inception 借鑒了這種思想。論文中指出,Inception module可以讓網絡的深度和寬度高效率的擴充,提高準確率的同時還能防止過擬合。
人腦神經元的連接是稀疏的,因此研究者認為大型神經網絡合理的連接方式應該也是稀疏的。稀疏結構是非常適合神經網絡的一種結構,尤其是對非常大型、非常深的神經網絡,可以減輕過擬合并降低計算量,如卷積神經就是稀疏連接。Inception Net的主要目標就是找到最優的稀疏結構單元(即Inception module),論文中提到的稀疏結構基于Hebbian原理——神經反射活動的持續與重復會導致神經元連接穩定性的持久提升,當兩個神經元A和B距離很近,并且A參與了對B重復、持續的興奮,那么某些代謝變化會導致A將作為能使B興奮的細胞。總結一下即‘一起發射的神經元會連接在一起’(cells that fire together, wire together),學習過程中的刺激會使神經元間的突觸強度增加。受Hebbian原理啟發,另一篇文章Provable Bounds for Learning Some Deep Representations提出,如果數據集的概率分布可以被一個很大很稀疏的神經網絡所表達,那么構筑這個網絡的最佳方法是逐層構筑網絡:將上一層高度相關的節點聚類,并將聚類出來的每一個小簇連接到一起,這個相關性高的節點應該被連接在一起的結論(如下圖),即是從神經網絡角度對Hebbian原理有效性的證明。
因此一個好的稀疏結構,應該是符合Hebbian原理的,相關性高的一簇神經元節點應該連接在一起。在普通的數據集中,這可能需要對神經元節點聚類,但是在圖片數據中,天然就是鄰近區域的數據相關性高,因此相鄰的像素點被卷積操作連接在一起。而我們可能有多個核,同一空間位置但在不同通道的卷積核的輸出結果相關性極高。因此,一個1x1的卷積就可以很自然地把這些相關性很高的、在同一個空間位置但是不同通道的特征連接在一起,這就是為什么1x1卷積這么頻繁地被應用到Inception中的原因。1x1卷積所連接的節點的相關性是最高的,而稍微大一點尺寸的卷積,比如3x3、5x5的卷積所連接的節點相關性也很高,因此可以適當地使用一些大尺寸的卷積、增加多樣性。最后Inception Module通過4各分支中不同尺寸的1x1, 3x3、5x5等小型卷積將相關性很高的節點連接到一起,就完成了其設計初衷,構建出了很高效的符合Hebbian原理的稀疏結構。
在Inception module中,通常1x1卷積的比例(輸出通道數占比)最高,3x3卷積和5x5卷積稍低。而在整個網絡中,會有多個堆疊的Inception module,我們希望靠后的Inception module可以捕捉更高階的抽象特征,因此靠后的Inception module的卷積的空間集中度應該逐漸降低,這樣可以捕獲更大面積的特征。因此,越靠后的Inception module中,3x3,5x5這兩個大面積的卷積核的占比(輸出通道)應該更多。
Inception Net有22層(只包括卷積層,加上池化層后共27層),除了最后一層的輸出,其中間節點的分類效果也很好。因此在Inception Net中,還使用到了輔助分類節點,即將中間某一層的輸出用作分類,并按一個較小的權重(0.3)加到最終分類結果中。這樣相當于做了模型融合,同時給網絡增加了反向傳播的梯度信號,也提供了額外的正則化,但是這個輔助loss對于整個Inception Net的作用貌似較為有限,論文中提出使用輔助loss后準確率僅提升了0.6%。
Inception V1是在CPU上面進行訓練的。使用了異步SGD訓練,學習速率每迭代8個epoch降低4%。同時,Inception V1也使用了Multi-Scale、Multi-crop等數據增強方法,還嘗試了模型融合,最后的ILSVRC 2014的比賽成績為top5錯誤率6.67%。
Inception V2
Inception V2學習VGG使用兩個3x3卷積來代替5x5的大卷積用以減少參數并減輕過擬合,同時提出了著名的Batch Normalization方法。BN是一個非常有效的正則化方法,可以讓網絡的訓練速度加快很多倍,同時收斂后的分類準確率也可以得到大幅提高。BN在用于神經網絡時,會對每一個mini-batch數據的內部進行標準化(normalization 處理),使輸出規范到N(0,1)的正態分布,減少了Internal covariate shift(內部神經元分布的改變)。BN論文指出,傳統的深度神經網絡在訓練時,每一層輸入的分布都在變化,導致訓練變得困難,我們只能使用一個小的學習率解決這個問題。而對每一層使用BN之后,我們就可以較有效的解決這個問題,學習率可以增大多倍,而達到之前準確率所需要的迭代次數更少,訓練時間大大縮短。最后使用BN的模型的top5準確率為4.8%,遠超Inception V1。
什么是Internal covariate shift?
隨著訓練的進行,神經網絡中的參數也隨著梯度下降在不停更新。一方面,當底層網絡中參數發生微弱變化時,由于每一層中的線性變換與非線性激活映射,這些微弱變化隨著網絡層數的加深而被放大(類似蝴蝶效應);另一方面,參數的變化導致每一層的輸入分布會發生改變,進而上層的網絡需要不停地去適應這些分布變化,使得我們的模型訓練變得困難。上述這一現象叫做Internal Covariate Shift。BN具有一定的正則化效果
在Batch Normalization中,由于我們使用mini-batch的均值與方差作為對整體訓練樣本均值與方差的估計,盡管每一個batch中的數據都是從總體樣本中抽樣得到,但不同mini-batch的均值與方差會有所不同,這就為網絡的學習過程中增加了隨機噪音,與Dropout通過關閉神經元給網絡訓練帶來噪音類似,在一定程度上對模型起到了正則化的效果。
更多BN詳細解釋可見Batch Normalization原理與實戰
當然,單純使用BN獲得的增益還不明顯,還需要做一些相應的調整:增大學習率并加快學習衰減速度以適應BN規范后的數據;去除dropout并減輕L2正則(因為BN已經起到正則化的作用);去除LRN;更徹底的對樣本進行shuffle;減少數據增強過程中對數據的光學畸變(因為BN訓練更快,每個樣本被訓練的次數更少,因此更真實的樣本對訓練更有幫助)。在使用了這些措施后,Inception V2訓練達到Inception V1的準確率時快了14倍,并且模型在收斂時的準確率上限更高。
Inception V3
Inception V3網絡主要有兩方面的改造:一是引入了Factorization into small convolutions的思想,將一個較大的二維卷積拆成兩個較小的一維卷積,比如將7x7卷積拆成1x7和7x1的卷積,或者將3x3的卷積拆成3x1的卷積和1x3的卷積(如下圖所示)。這種方法一方面減少了大量參數,加速運算并減輕了過擬合(將7x7卷積拆成1x7和7x1的卷積比拆成兩個3x3的卷積更節約參數),同時還增加了一層非線性擴展模型表達能力。論文中指出,這種非對稱的卷積結構拆分,其結果比對稱的拆分幾個相同的小卷積效果更好,可以處理更多,更豐富的空間特征,增加特征多樣性。
另一方面,Inception V3優化了Inception module的結構,現在Inception module有35x35(輸入module的feature map大?。?、17x17和8x8三種結構,如下圖所示。這些Inception module只在網絡的后半部分出現,前面還是普通的卷積層。并且Inception v3除了在Inception module中使用分支,還在分支中使用分支(8x8結構中),可以說是Network In Network In Network。
在論文中還提及了網絡設計的原則:
- 1、避免特征表示瓶頸,尤其是在網絡的前面。前饋網絡可以通過一個無環圖來表示,該圖定義的是從輸入層到分類器或回歸器的信息流動。要避免嚴重壓縮導致的瓶頸。特征表示尺寸應該溫和的減少,從輸入端到輸出端。特征表示的維度只是一個粗淺的信息量表示,它丟掉了一些重要的因素如相關性結構;
- 2、高維信息更適合在網絡的局部處理。在卷積網絡中逐步增加非線性激活響應可以解耦合更多的特征,那么網絡就會訓練的更快;
- 3、空間聚合可以通過低維嵌入,不會導致網絡表達能力的降低。例如在進行大尺寸的卷積(如3*3)之前,我們可以在空間聚合前先對輸入信息進行降維處理,如果這些信號是容易壓縮的,那么降維甚至可以加快學習速度;
- 4、平衡好網絡的深度和寬度。通過平衡網絡每層濾波器的個數和網絡的層數可以使網絡達到最佳性能。增加網絡的寬度和深度都會提升網絡的性能,但是兩者并行增加獲得的性能提升是最大的。所以計算資源應該被合理的分配到網絡的寬度和深度。
最后,文中還提出了一種模型正則化方法 Label Smoothing Regularization,具體解釋可參見優化策略5 Label Smoothing Regularization_LSR原理分析。
Inception V4
Inception V4相比V3主要是結合了微軟的ResNet,添加了殘差單元,方便訓練更深的網絡。參考:
Going Deeper with Convolutions.
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift.
Rethinking the Inception Architecture for Computer Vision.
Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning.
《TensorFlow 實戰》 黃文堅,唐源.