深度學習基礎模型NIN(Network in Network)+Pytorch

論文(2014年): 鏈接

Pytorch代碼: 鏈接


《Network In Network》是一篇比較老的文章了(2014年ICLR的一篇paper),是當時比較牛逼的一篇論文,同時在現在看來也是一篇非常經典並且影響深遠的論文,後續很多創新都有這篇文章的影子。通常里程碑式的經典是不隨時間而黯淡的,同樣值得好好學習。

NIN的結構有兩個創新點,都是比較有里程碑意義的,分別是MLPconv以及全局平均池化

MLP Convolution Layers

在講之前,我想梳理一下“歷史”,我們知道在神經網絡還沒有出現之前,有個叫感知機(PLA)的東西,它是神經網絡的雛形,它所用的激活函數叫階躍函數,而當激活函數使用非線性函數時,便進入到了神經網絡的世界,神經網絡的一個重要性質就是它可以自動地從數據中學習到合適的權重參數,不同於感知機時的人工設置參數.而神經網絡的別名就是多層感知機(Multi Layer Perceptron,MLP), 即使用sigmoid等非線性激活函數的多層網絡.非線性激活函數的重要性很大,如果使用線性激活函數,加深神經網絡的層數就沒有意義了,如下圖1列舉了一個經典的例子

v2-3eccc2b5248924493af8b9f32657f7cb_b.jpg
圖1 神經網絡爲什麼要使用非線性激活函數?(來自[3])

所以神經網絡必須使用非線性激活函數, 神經網絡出現不久,就引進了一個叫全連接(fully-connected),就是相鄰的所有神經元之間都有連接,但是全連接的神經網絡當輸入數據的尺寸比較大的時候,會帶來了一個很嚴重的問題,就是參數特別多特別多多多,於是才誕生了卷積神經網絡CNN,關於CNN的這段曲折的歷史,想了解更多的話,可以閱讀這篇文章

玖零猴:卷積神經網絡CNN(卷積池化、感受野、共享權重和偏置、特徵圖)

CNN中的卷積層中是通過線性濾波器對輸入特徵圖進行卷積運算,然後緊跟其後的是非線性激活函數,這裏的非線性激活函數爲什麼要用非線性前面已經提到了原因,就是爲了讓隱層變得有意義,而線性濾波器何謂線性?普通的卷積操作可以用一下公式來表示:

v2-ccf1c89358b3e9c4410a2eb838b772f4_b.png

其中,w∗x+b爲線性變換,函數f爲非線性激勵函數,例sigmoid,tanh,ReLUsigmoid,tanh,ReLU等.從公式中可以看到,普通的卷積過程是一個線性變化,可以簡單地理解線性就是“直線”, 這是一種線性濾波器,它是一個廣義線性模型(generalized linear model, GLM), 當樣本的隱含概念(latent concept,即從圖像中抽取出來的特徵)線性可分時,廣義線性模型足以抽象線性可分的隱含概念。然而, 傳統的CNN是建立在認爲隱含概念是線性可分的假設上,但是這個假設比較理想主義,實際情況中大多隱含概念都是線性不可分的. 但是事情還沒結束,GLM感覺自己還能再搶救一下,就發現了可以通過瘋狂增加濾波器(卷積核)的數量來cover各個方面的隱含概念[4],然後在下一層卷積的時候把這些隱含概念結合起來,然後再繼續抽象更多的隱含概念,那麼問題也隨之而來 ,GLM爲了能儘量全面的cover到所有隱含概念就只能瘋狂增加每一層神經元的數量,這就導致產生了很多冗餘的參數,同時,使用太多濾波器也給下一層帶來了很大的負擔,需要考慮來自前一層的所有變化的組合[5].

在maxout網絡[6]中, 線性函數的最大化使得分段線性逼近器能夠逼近任何凸函數。與傳統CNN的卷積層進行線性分離相比,maxout網絡更有效 。但是它也有前提:隱含概念位於輸入空間的凸集內.

綜上所述,通俗一點來講, 就是現有的卷積還不能很好地對特徵進行抽象,它們都在一個比較理想的前提假設下,而實際中往往比較複雜, 因此我們需要一個更通用的函數逼近器, 也就是說卷積如何去卷才能在隱含概念處於更復雜的分佈時也依然能夠逼近潛在概念的更抽象的表示。我們知道在較高的層的卷積核會映射到原始輸入的較大區域(通過感受野的增大得知),它通過結合較低層的語義特徵來生成更高層次的語義特徵,所以作者認爲在結合之前能夠把這些局部特徵更好的抽象出來,那麼對後面的網絡的進一步處理有着有更大的意義

徑向基(Radial basis network)和多層感知機(multilayer perceptron,MLP)是兩個著名的通用函數逼近器。在這項工作中,作者選擇了多層感知器,也就是說作者利用多層感知器去進行卷積,這樣能夠更好地把特徵抽象出來,選擇多層感知器有兩個原因:

  1. 多層感知器其實就是神經網絡, 它與卷積神經網絡的結構一樣,都是通過反向傳播訓練。它們可以相互兼容。
  2. 其次多層感知器符合特徵再利用的原則,我的理解是特徵裏面還有可以用的特徵。

基於這個MLP,作者將原來的GLM改造成了MLPconv,下面分別對它們進行講解

普通卷積層(卷積核大小大於1)即文中提到的GLM, 相當於單層網絡,抽象能力有限,其計算公式(省略了偏置b)和示意圖如下:

v2-a73c1f90a3d7d63ee02acd59062a5e6c_b.jpg

v2-cae978e057b96cc0a837e0039605bbf3_b.png

爲了提高特徵的抽象表達能力,作者提出了使用多層感知機(MLP)來替代傳統卷積層。

v2-b0feeeb35d4ee92c25a8df6302e2804d_b.jpg

如上圖所示,MLPConv其實就是在常規卷積(卷積核大小大於1)後接若干層若干個1x1卷積(後面我再講爲什麼是1x1卷積),這些1x1卷積如果看成神經元的話,這樣就像是MLP(多層感知機)了,也就是說這裏有一個微型的神經網絡,而且還是全連接,用這個微型的神經網絡也就是MLP來對特徵進行提取, 這也是文章的最大創新點,所以纔要叫Network in Network,公式如下圖所示, n爲網絡層數,第一層爲普通卷積層(卷積核尺寸大於1),後面層用的是1x1卷積。(這裏每層mlp採用Relu來進行激活)

v2-d2444c989f1ad6a9524121cea9356f8b_b.jpg

v2-1b21cbe8c168718ae13f095d69492261_b.png

綜上所述,像Mlpconv這樣的卷積操作,也就是這種利用了MLP這個更通用的函數逼近器,使得網絡能夠逼近潛在概念的更抽象的表示.

我們下面舉個例子去感受一下MLPconv的卷積過程,並順便講解下爲什麼要用到1x1卷積

假設輸入數據尺寸爲27X27,通道數爲3,然後經過一個常規卷積,即4個3X3的卷積核,輸出特徵圖尺寸爲9X9,通道數爲4,然後經過4個1X1的卷積,輸出特徵圖尺寸爲9X9,通道數爲4,最後再經過4個1X1的卷積,輸出特徵圖結果依舊是尺寸爲9X9,通道數爲4(每一層MLP由ReLU激活)

v2-2944e4bd51679fa13de4022ffee1d334_b.jpg

這裏的1X1卷積除了爲了保持特徵圖的尺寸而使用外,個人覺得它也把各通道的輸入特徵圖進行線性加權,起到綜合各個通道特徵圖信息的作用,多幾層這樣的1X1卷積的話,那最終提取的特徵會更加抽象。其實可以做個假設,如果不用1X1卷積而是用更大的卷積核,那和連續用GLM有什麼區別?就是因爲用了1X1卷積,才增強了常規卷積的抽象表達能力。

MLPconv其實就是在常規卷積後面加了N層1X1卷積,所以很容易理解,並且從代碼的層次來講,這種結構也比較的容易實現,以Pytorch爲例

        def nin_block(in_channels,out_channels,kernel_size,strides,padding):
    blk = nn.Sequential(
        nn.Conv2d(in_channels,out_channels,kernel_size,strides,padding)
        nn.ReLU()
        nn.Conv2d(out_channels,out_channels,kernel_size=1)
        nn.ReLU()
        nn.Conv2d(out_channels,out_channels,kernel_size=1)
        nn.ReLU())
    return blk
      

在當時作者應該是第一個使用1x1卷積的,具有劃時代的意義,之後的Googlenet借鑑了1*1卷積,還專門致謝過這篇論文,現在很多優秀的網絡結構都離不開1x1卷積,ResNet、ResNext、SqueezeNet、MobileNetv1-3、ShuffleNetv1-2等等. 1x1卷積作爲NIN函數逼近器基本單元,除了增強了網絡局部模塊的抽象表達能力外,在現在看來, 還可以實現跨通道特徵融合和通道升維降維。

全局平均池化 GAP

INI不採用傳統的全連接層進行分類,而是直接輸出來自最後一層mlpconv的feature maps,然後通過全局平均池化層,然後將得到的向量送入softmax層。在傳統的CNN中,由於完全連接的層之間充當了一個黑盒子,很難解釋來自目標成本層的類別級信息是如何傳遞迴之前的卷積層的。相比之下,全局平均池更有意義和可解釋性,因爲它加強了feature map和類別之間的對應。此外, 全連通層容易發生過擬合,嚴重依賴dropout正則化,而全局平均池本身就是一個結構正則化器,從本質上防止了整體結構的過擬合

v2-316ea6ad9a2e097501ac9ad1a97b8869_b.jpg
Network In Network(NIN): three mlpconv layers and one global average pooling layer


reference

1、NIN(Network in Network)學習筆記

2、深度學習網絡篇——NIN(Network in Network)

3、《深度學習入門基於Python的理論與實現》

4、Quoc V Le, Alexandre Karpenko, Jiquan Ngiam, and Andrew Ng. Ica with reconstruction cost for efficient overcomplete feature learning. In Advances in Neural Information Processing Systems, pages 1017–1025, 2011.

5、Ian J Goodfellow. Piecewise linear multilayer perceptrons and dropout. arXiv preprint arXiv:1301.5088, 2013.

6、Ian J Goodfellow, David Warde-Farley, Mehdi Mirza, Aaron Courville, and Yoshua Bengio.Maxout networks. arXiv preprint arXiv:1302.4389, 2013.

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