回顧一些重要的CNN改進模型(你真的瞭解 Convolutional Neural Networks 麼)

beihangzxm123發表於2016-01-12

轉載自:

乾貨 | 你真的瞭解 Convolutional Neural Networks 麼
https://mp.weixin.qq.com/s?__biz=MzAwMjM3MTc5OA==&mid=403231780&idx=1&sn=4d6b282e45a016df274b72f08ddf8492&scene=1&srcid=0111p2ycZ4HF6hZ8N9eohts2&ascene=1&uin=OTE0NTE3ODQx&devicetype=webwx&version=70000001&pass_ticket=8WwTcRsKg44bcrNwjcBl175U1yC17S0EJItWCw7eG1u5%2Fripwp%2FMV3S1QmkuD7Sl

包括全卷積網路:http://arxiv.org/abs/1412.6806

Network In Network(只是講了一方面):http://arxiv.org/abs/1312.4400

Spatial Transformer Networks:http://arxiv.org/abs/1506.02025

Stacked What-Where Auto-encoders:http://arxiv.org/abs/1506.02351

今天要跟大家分享的是一些 Convolutional Neural Networks(CNN)的工作。大家都知道,CNN 最早提出時,是以一定的人眼生理結構為基礎,然後逐漸定下來了一些經典的架構——convolutional 和 pooling 的交替,最後再加上幾個 fully-connected layers 用作最後做 prediction 等的輸出。然而,如果我們能“反思”經典,深入剖析這些經典架構中的不同 component 的作用,甚至去改進它們,有時候可能有更多的發現。所以,今天分享的內容,便是改進 CNN 的一些工作。


 Striving For SimplicityThe All Convolutional Net

先說一篇探究 CNN 中不同 component 的重要性和作用的工作。這篇工作發表於 ICLR 2015,已經有一年多的時間了。個人覺得它應該受到更大的關注。這篇工作最大的貢獻是,把經典架構的 CNN 中的 pooling 層,用 stride convolutional 層給替換掉了,也就是去掉了 deterministic 層。並且,通過數學公式和實驗結果證明,這樣的替換是完全不會損傷效能的。而加入 pooling 層,如果不慎,甚至是有傷效能的。


具體來看,CNN 中的每次 feature map 表達,都可以看做一個 W*H*N 的三維結構。在這個三維結構下,pooling 這種 subsampling 的操作,可以看成是一個用 p-norm(當 p 趨向於正無窮時,就是我們最常見的 max-pooling)當做 activation function convolutional 操作。有了這樣的解釋,自然而然地,就會提出一個問題:那麼引入這樣的 pooling 操作,有什麼意義呢?真的有必要麼?在過去的工作中,大家普遍認為,pooling 層有三種可能的功效:(1)提取更 invariant feature;(2)抽取更廣範圍的(global)的 feature—— spatially dimension reduction;(3)更方便優化。這篇作者認為,其中(2)是對 CNN 最重要的。基於此,它們就提出,那麼我只要在去掉 pooling 層的同時,保證這種 spatially dimension reduction——是否就可以構造出一個 all convolutional net,同時這個 net 的效果還不比 convolutional + pooling 交替的差?


最後,果然,如他們所料。它們的 all convolutional net 達到了甚至有時候超過了 state-of-art,同時他們還發現有時候加入 pooling 反而不如不加。這篇工作的另外一個貢獻是他們提出了一種新的 visualizing CNN 的方法,效果更直觀更有分辨性。總結來說,這篇工作提出的 all convolutional net 可以實現自主 downsampling,並且效果不差;其二,它不是在說 pooling 不好,我們一定要拋棄;而是對於 minimum necessary ingredients for CNN 進行了探究。


 Network in Network

第一個要分享的是如何去 replace pooling layer after convolutional layer,接下來要分享的是 replace fully-connected layer on the top of CNN。這個也是經典的 CNN 架構中的一個組成部分。也許這個東西大家還不熟悉,但是提到另一個詞,大家就會很熟悉了。那就是,dropout。已經有非常多的工作,在 CNN 的 fully-connected layer 中,加入 dropout,來避免 overfitting。受此啟發,後來又有了一個 sparse convolutional neural networks 的工作。然而,更具開創性的工作是,《Network in Network》這篇,提出了用 global averaging pooling layer 替代 fully-connected layer.


這樣的 global averaging pooling layer 顯然,可以把 input/feature map 和 output/category,也就可以達到減少 overfitting 的作用(和 dropout 一樣)。


現在,global average pooling 已經被用得很廣泛,比如在《Going Deeper with Convolutions》中,作者指出:

We found that a move from fully connectedlayers to average pooling improved the top-1 accuracy byabout 0.6%, however the use of dropout remained essentialeven after removing the fully connected layers.

當然它也有它自己的一定弊端,比如 convergence 會變慢。但是關於 fully-connected layer 是否一定是必須的這個問題,卻在被各種工作和各種場景探究。比如 Google 去年非常火的 inceptionism 的工作中,也放棄了 fully-connected layer,並達到了很好的效果。

所以,關於這點,小S 是認為,我們不要光看表面的 dropout or global averaging pooling 這些技術,而是要去思考它們的共同之處和它們的原理。從它們帶給網路結構的變化入手。也許現在來看,最初的結論還是對的,deeper is better,我們暫時要解決的是如何 deeper。


 Spatial Transformer Networks

這篇是 NIPS 2015 中,來自 Google DeepMind 的工作。這篇也被前幾天 huho larochelle 評選出的 Top 10 arXiv 2015 Deep Learning Papers 收錄(另外提一下,昨天看到這個評選,發現大部分我都寫過筆記了,大家如果感興趣,我可以單獨整理一份,以供大家查閱)。回到這篇工作上來,它主要是說,儘管 CNN 一直號稱可以做 spatial invariant feature extraction,但是這種 invariant 是很有侷限性的。因為 CNN max-pooling 首先只是在一個非常小的、rigid 的範圍內(2×2 pixels)進行,其次即使是 stacked 以後,也需要非常 deep 才可以得到大一點範圍的 invariant feature,三者來說,相比 attention 那種只能抽取 relevant feature,我們需要的是更廣範圍的、更 canonical features。為此它們提出了一種新的完全 self-contained transformation module,可以加入在網路中的任何地方,靈活高效地提取 invariant image features.


具體上,這個 module 就叫做 Spatial Transformers,由三個部分組成: Localization Network, Grid generator 和 Sampler。Localization Network 非常靈活,可以認為是一個非常 general 的進一步生成 feature map 和 map 對應的 parameter 的網路。因此,它不侷限於用某一種特定的 network,但是它要求在 network 最後有一層 regression,因為需要將 feature map 的 parameter 輸出到下一個部分:Grid generator。Grid generator 可以說是 Spatial Transformers 的核心,它主要就是生成一種“蒙版”,用於“摳圖”(Photoshop 附體……)。Grid generator 定義了 Transformer function,這個 function 的決定了能不能提取好 invariant features。如果是 regular grid,就好像一張四四方方沒有傾斜的蒙版,是 affined grid,就可以把蒙版“扭曲”變換,從而提取出和這個蒙版“變換”一致的特徵。在這個工作中,只需要六個引數就可以把 cropping, translation, rotation, scale and skew 這幾種 transformation 都涵蓋進去,還是很強大的;而最後的 Sampler 就很好理解了,就是用於把“圖”摳出來。


這個工作有非常多的優點:(1)它是 self-contained module,可以加在網路中的任何地方,加任何數量,不需要改變原網路;(2)它是 differentiable 的,所以可以直接進行各種 end-to-end 的訓練;(3)它這個 differentiable simple and fast,所以不會使得原有網路變慢;(4)相比於 pooling 和 attention 機制,它抽取出的 invariant features 更 general。


 Stacked What-Where Auto-encoders

這篇文章來自 NYU,Yann LeCun 組,已投稿到 ICLR 2016。與之前整理過的 improving information flow in Seq2Seq between encoder-decoder 類似的是,這篇文章主要是改進了基於 CNN 的 encoder-decoder,並非常 intuitive 的討論了不同 regularizer 的區別。架構圖可以直接看 Figure 1 的右側,會比較清晰。具體來講,Stacked What-Where Auto-encoders(SWWAE) 基於前向 Convnet 和前向 Deconvnet,並將 max-pooling 的輸出稱為 “what”,其實就是將 max function 的 content 和 position 傳給下一層;同時,max-pooling 中的 position/location 資訊,也就是 argmax function,作為 “where” 要“橫向”傳給 decoder。這樣,在進行 decoder reconstruct 的過程時,則更能基於 where + what 的組合,進行 unpooling。

為了能讓網路利用好 what 和 where,文章考慮了三種 loss,見公式(1),即傳統的 discriminate loss,和新增的 input-level reconstruction loss for “what” 還有 intermediate-level reconstruction loss for “where”


如上文所說,文章的 Section 3 很 intuitive,首先說明並解了為什麼使用的是 soft version 的 max/argmax 去進行 ”what“ 和 ”where“;第二,討論了為何加入 reconstruction loss 和這樣一個 hybird loss function 更好(generalization 和 robustness);第三,說明了 intermediate loss 對於“what”“where”一起學習的重要性。

實驗結果上來看,這樣的 SWWAE 模型 generate 出來的圖片更清晰,更“乾淨”(clearer and cleaner)。



其實,關於 CNN 的改進和探究,是很符合科研發展的。就像更熟悉的 RNN 一樣,一個東西火起來,被證實在各種領域 powerful,那麼緊隨其後的便是對於其原理的深刻揭示。當關於原理的基礎工作有了突破,又會對後續的改進和實際應用起到指導作用。這便是科學工作中的一種 pattern 吧。


相關文章