歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld。
技術交流QQ羣:433250724,歡迎對算法、技術感興趣的同窗加入。html
最近接下來幾篇博文會回到神經網絡結構的討論上來,前面我在「深度學習方法(五):卷積神經網絡CNN經典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning」一文中介紹了經典的CNN網絡結構模型,這些能夠說已是家喻戶曉的網絡結構,在那一文結尾,我提到「是時候動一動卷積計算的形式了」,緣由是不少工做證實了,在基本的CNN卷積計算模式以外,不少簡化、擴展、變化均可以讓卷積計算得到更多特性,好比參數減小,計算減小,效果提高等等。node
接下來幾篇文章會陸續介紹下面這些topic:算法
本文先介紹兩個13,14年的工做:Maxout Networks,Network In Network。網上有很多資料,可是不少做者我相信本身都沒有徹底理解,在本文中我會盡量描述清楚。本文重點在於Network In Network。本文針對論文和網絡資料的整理,本身從新撰寫,保證每個初學者均可以看懂。markdown
坦白說Maxout自己並不能算卷積結構的變化,可是它提出了一個概念——線性變化+Max操做能夠擬合任意的的凸函數,包括激活函數(如Relu);後面要介紹的NIN有關係,因此先介紹一下Maxout。網絡
Maxout出如今ICML2013上,大神Goodfellow(GAN的提出人~)將maxout和dropout結合後,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個數據上都取得了start-of-art的識別率。dom
從論文中能夠看出,maxout實際上是一種激或函數形式。一般狀況下,若是激活函數採用sigmoid函數的話,在前向傳播過程當中,隱含層節點的輸出表達式爲:ide
通常的MLP就是這樣狀況。其中W通常是2維的,這裏表示取出的是第i列(對應第i個輸出節點),下標i前的省略號表示對應第i列中的全部行。若是是maxout激活函數,則其隱含層節點的輸出表達式爲:函數
這裏的W是3維的,尺寸爲d*m*k,其中d表示輸入層節點的個數,m表示隱含層節點的個數,k表示每一個隱含層節點展開k箇中間節點,這k箇中間節點都是線性輸出的,而maxout的每一個節點就是取這k箇中間節點輸出最大的那個值。參考一個日文的maxout ppt 中的一頁ppt以下:tornado
這張圖的意識是說,紫圈中的隱藏節點展開成了5個黃色節點,取max。Maxout的擬合能力是很是強的,它能夠擬合任意的的凸函數。從左往右,依次擬合出了ReLU,abs,二次曲線。學習
做者從數學的角度上也證實了這個結論,即只需2個maxout節點就能夠擬合任意的凸函數了(相減),前提是中間節點的個數能夠任意多,以下圖所示,具體能夠翻閱paper[1]。maxout的一個強假設是輸出是位於輸入空間的凸集中的….這個假設是否必定成立呢?雖然ReLU是Maxout的一個特例——其實是得不到ReLU正好的狀況的,咱們是在學習這個非線性變換,用多個線性變換的組合+Max操做。
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。因此,至關於網絡變深了,我理解其實這個變深是效果提高的主要因素。
舉例解釋
假設如今有一個3x3的輸入patch,用x表明,卷積核大小也是3x3,向量w表明,輸入channel是c1,輸出channel是c2。下面照片是我本身手畫的,比較簡單,見諒:)
這裏創建了一個概念,全鏈接網絡能夠等價轉換到1*1的卷積,這個idea在之後不少網絡中都有用到,好比FCN[5]。
在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的好處有:
最後稍微提一下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