深度學習方法(十):卷積神經網路結構變化——Maxout Networks,Network In Network,Global Average Pooling

深度學習方法(十):卷積神經網路結構變化——Maxout Networks,Network In Network,Global Average Pooling

歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld
技術交流QQ群:433250724,歡迎對演算法、技術感興趣的同學加入。


最近接下來幾篇博文會回到神經網路結構的討論上來,前面我在“深度學習方法(五):卷積神經網路CNN經典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning”一文中介紹了經典的CNN網路結構模型,這些可以說已經是家喻戶曉的網路結構,在那一文結尾,我提到“是時候動一動卷積計算的形式了”,原因是很多工作證明了,在基本的CNN卷積計算模式之外,很多簡化、擴充套件、變化都可以讓卷積計算獲得更多特性,比如引數減少,計算減少,效果提升等等。

接下來幾篇文章會陸續介紹下面這些topic:

  1. Maxout Networks
  2. Network In Network
  3. Inception Net(Google)
  4. ResneXt
  5. Xception(depth-wise convolution)
  6. Spatial Transformer Networks

本文先介紹兩個13,14年的工作:Maxout Networks,Network In Network。網上有不少資料,但是很多作者我相信自己都沒有完全理解,在本文中我會儘可能描述清楚。本文重點在於Network In Network。本文針對論文和網路資料的整理,自己重新撰寫,保證每一個初學者都可以看懂。

1、Maxout Network

坦白說Maxout本身並不能算卷積結構的變化,但是它提出了一個概念——線性變化 Max操作可以擬合任意的的凸函式,包括啟用函式(如Relu);後面要介紹的NIN有關係,所以先介紹一下Maxout。

Maxout出現在ICML2013上,大神Goodfellow(GAN的提出人~)將maxout和dropout結合後,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個資料上都取得了start-of-art的識別率。

從論文中可以看出,maxout其實是一種激或函式形式。通常情況下,如果啟用函式採用sigmoid函式的話,在前向傳播過程中,隱含層節點的輸出表示式為:

這裡寫圖片描述

一般的MLP就是這樣情況。其中W一般是2維的,這裡表示取出的是第i列(對應第i個輸出節點),下標i前的省略號表示對應第i列中的所有行。如果是maxout啟用函式,則其隱含層節點的輸出表示式為:

這裡寫圖片描述

這裡寫圖片描述

這裡的W是3維的,尺寸為d*m*k,其中d表示輸入層節點的個數,m表示隱含層節點的個數,k表示每個隱含層節點展開k箇中間節點,這k箇中間節點都是線性輸出的,而maxout的每個節點就是取這k箇中間節點輸出最大的那個值。參考一個日文的maxout ppt 中的一頁ppt如下:

這裡寫圖片描述

這張圖的意識是說,紫圈中的隱藏節點展開成了5個黃色節點,取max。Maxout的擬合能力是非常強的,它可以擬合任意的的凸函式。從左往右,依次擬合出了ReLU,abs,二次曲線。

這裡寫圖片描述

作者從數學的角度上也證明了這個結論,即只需2個maxout節點就可以擬合任意的凸函式了(相減),前提是中間節點的個數可以任意多,如下圖所示,具體可以翻閱paper[1]。maxout的一個強假設是輸出是位於輸入空間的凸集中的….這個假設是否一定成立呢?雖然ReLU是Maxout的一個特例——實際上是得不到ReLU正好的情況的,我們是在學習這個非線性變換,用多個線性變換的組合 Max操作。

這裡寫圖片描述

2、Network In Network

OK,上面介紹了Maxout[1],接下來重點介紹一下14年新加坡NUS顏水成老師組的Min Lin一個工作Network In Network ,說實話,不論是有心還是無意,本文的一些概念,包括1*1卷積,global average pooling都已經成為後來網路設計的標準結構,有獨到的見解。

這裡寫圖片描述
圖1

先來看傳統的卷積,圖1左:

這裡寫圖片描述

很多同學沒有仔細看下標的含義,所以理解上模稜兩可。xij表示的是一個卷積視窗的patch(一般是k_h*k_w*input_channel),k表示第k個kernel的index;啟用函式是ReLU。並不是說只做一個kernel,而是指任意一個kernel。

再來看本文提出的Mlpconv Layer,也就是Network In Network,圖1右。這裡只是多加了一層全連線MLP層,什麼意思呢?作者稱之為“cascaded cross channel parametric pooling layer”,級聯跨通道的帶引數pooling層,目的是:

Each pooling layer performs weighted linear recombination on the input feature maps

這裡寫圖片描述

看公式2就很清楚了,是第一層還是傳統的卷積,在做一次卷積以後,對輸出feature map的中的每一個畫素點fij,其對應的所有channel又做了一次MLP,啟用函式是ReLU。n表示第n層,而kn表示一個index,因為在第n層裡面有很多kernel,和前面公式1是一個道理。所以,我們看下面整個NIN網路就很清楚了:

這裡寫圖片描述

看第一個NIN,本來11*11*3*96(11*11的卷積kernel,輸出map 96個)對於一個patch輸出96個點,是輸出feature map同一個畫素的96個channel,但是現在多加了一層MLP,把這96個點做了一個全連線,又輸出了96個點——很巧妙,這個新加的MLP層就等價於一個1 * 1 的卷積層,這樣在神經網路結構設計的時候就非常方便了,只要在原來的卷積層後面加一個1*1的卷積層,而不改變輸出的size。注意,每一個卷積層後面都會跟上ReLU。所以,相當於網路變深了,我理解其實這個變深是效果提升的主要因素。

舉例解釋

假設現在有一個3×3的輸入patch,用x代表,卷積核大小也是3×3,向量w代表,輸入channel是c1,輸出channel是c2。下面照片是我自己手畫的,比較簡單,見諒:)

  • 對於一般的卷積層,直接x和w求卷積,得到1*1的1個點,有C2個kernel,得到1*1*c2;
  • Maxout,有k個的3×3的w(這裡的k是自由設定的),分別卷積得到k個1×1的輸出,然後對這k個輸入求最大值,得到1個1*1的點,對每一個輸出channel都要這樣做;
  • NIN,有k個3×3的w(這裡的k也是自由設定的),分別卷積得到k個1×1的輸出,然後對它們都進行relu,然後再次對它們進行卷積,結果再relu。(這個過程,等效於一個小型的全連線網路)

這裡寫圖片描述

這裡建立了一個概念,全連線網路可以等價轉換到1*1的卷積,這個idea在以後很多網路中都有用到,比如FCN[5]。

Global Average Pooling

在Googlenet網路中,也用到了Global Average Pooling,其實是受啟發於Network In Network。Global Average Pooling一般用於放在網路的最後,用於替換全連線FC層,為什麼要替換FC?因為在使用中,例如alexnet和vgg網路都在卷積和softmax之間串聯了fc層,發現有一些缺點:

(1)引數量極大,有時候一個網路超過80~90%的引數量在最後的幾層FC層中;
(2)容易過擬合,很多CNN網路的過擬合主要來自於最後的fc層,因為引數太多,卻沒有合適的regularizer;過擬合導致模型的泛化能力變弱;
(3)實際應用中非常重要的一點,paper中並沒有提到:FC要求輸入輸出是fix的,也就是說影象必須按照給定大小,而實際中,影象有大有小,fc就很不方便;

作者提出了Global Average Pooling,做法很簡單,是對每一個單獨的feature map取全域性average。要求輸出的nodes和分類category數量一致,這樣後面就可以直接接softmax了。

這裡寫圖片描述

作者指出,Global Average Pooling的好處有:

  • 因為強行要求最後的feature map數量等於category數量,因此feature map就會被解析為categories confidence maps.
  • 沒有引數,所以不會過擬合;
  • 對一個平面的計算,使得利用了空間資訊,對於影象在空間中變化更魯棒;

這裡寫圖片描述

Dropout

最後稍微提一下dropout,這個是hinton在Improving neural networks by preventing co-adaptation of feature detectors[9]一文中提出的。方法是在訓練時,一層隱藏層輸出節點中,隨機選p(比如0.5)的比例的節點輸出為0,而與這些0節點相連的那些權重在本次迭代training中不被更新。Dropout是一個很強力的正則方法,為啥?因為有一部分權重沒有被更新,減少了過擬合,而且每一次訓練可以看做使用的網路model是不一樣的,因此,最終全域性就相當於是指數個model的混合結果,混合模型的泛化能力往往比較強。一般Dropout用於FC層,主要也是因為FC很容易過擬合。


OK,本篇就到這裡,歡迎初學DL的同學分享,有問題可以在下面留言。


參考資料

[1] Maxout Networks, 2013
[2] http://www.jianshu.com/p/96791a306ea5
[3] Deep learning:四十五(maxout簡單理解)
[4] 論文筆記 《Maxout Networks》 && 《Network In Network》
[5] Fully convolutional networks for semantic segmentation, 2015
[6] http://blog.csdn.net/u010402786/article/details/50499864
[7] 深度學習(二十六)Network In Network學習筆記
[8] Network in Nerwork, 2014
[9] Improving neural networks by preventing co-adaptation of feature detectors