如何評價 Squeeze-and-Excitation Networks ?

Momenta 的這個工作獲得了ImageNet2017 image classification 的冠軍 ,如何理解文章的演算法改進和 intuition?文章鏈接 https://arxiv.org/pdf/1709.01507.pdf


可以看做是feature map 的 attention ... 就跟spatial transform network一樣,如果要學好attention, 就必須要有一個比較好的初始化, 不然容易陷入到一個糟糕的點。


ImageNet的冠軍肯定是個非常不錯的工作,而且我也看到了senet復現work的一些消息,不過我看論文以及自己使用senet時遇到了一些問題,貌似作者出現了,希望能夠請教一下

先說下senet主要的思想我認為就是在第三個維度channel維度增加了一個attention,之前已經有在時間軸的attention和feature map空間上的attention,senet和大部分網路不一樣的地方就是認為每個channel的feature map的作用權重不一樣的,於是給每個channel學習一個權重。實現方法也很科學,先global pooling得到channel長度的FC,然後通過FC和sigmoid出權重,很自然很科學。

然後是我的一些疑問想請教一下作者和大家:

(1)為什麼要用兩個FC層,如果是我的話我會直接global pooling直接跟一個C長度的FC,為什麼中間要把FC的維度降下來然後經過一個RELU再變回C長度,以及這個1/16的長度是怎麼確定下來的,有什麼trick依據嗎?

(2)第二個是senet初始化的問題,我也遇到了senet不work的問題,我用別人在ImageNet上pre-trained一個resnet-senet,做metric learning訓triplet loss,發現網路直接飛掉了loss炸了,之後也沒有詳細去研究

(3)顯存消耗的問題,senet顯存比我想像中消耗的要多,雖然多了兩個FC顯存消耗要多一些我是能夠理解,但是使用過程顯存消耗的似乎比我想像中多的多,所以想知道這個顯存消耗主要在哪些地方

(4)關於論文補充材料中的兩點,一個是label-smooth技術,一個是凍結BN。這兩個tricks到底作用有多大,也就是ImageNet的結果提升有多少是senet帶來的,有多少是這些tricks帶來的。尤其這兩個tricks很有意思

Senet是個非常好的工作,但是要用好還是要向作者和大家學習一下


網路的思路挺好的,兩位作者剛公布思路後,組內同事就做了相關介紹和分析,就等著源碼和論文了;在CVPR上的PPT已經很清楚地介紹了其中的功能,我的粗略理解是:訓練時,利用新結構的1xc的sigmoid輸出,自適應對h x w x c的feature maps賦予不同的權重,可以認為是不同的feature map對最終分類的貢獻不同;

基於caffe源碼也已經公布:hujie-frank/SENet,有空了好好研究下論文和源碼;

楊博 @Shicai Yang 提供的prototxt裡面有對SE block的描述;截圖如下:

最左邊相當於一個殘差操作的identity mapping,最右邊就是SE block,獲取1x2048的sigmoide輸出,scale5_2完成conv5_2/x3/scale與sigm5-2/gate做合併,再與最左邊的主幹網完成殘差操作;

作者的ppt講的還是很淺顯易懂的,最喜歡這種類型的講解了,一看就懂,省時省事兒。


還沒仔細看論文,有個問題,global pooling之後不同通道大小的rank跟fc後的rank近似嗎?如果近似的話,在pretain model上加SE是不是可以global pool之後加個sigmoid直接乘回去?


SEblock就是給不同通道賦不同的權重,具體操作是對U做squeeze(average global pooling,size=W*H),得到一維向量(長度為C),然後做excitation(類似RNN中的門機制,學習參數W來建立通道相關性),得到的結果作為U中C個channel的權重做scale。其目的是學習每個通道的重要程度,增強有用的特徵抑制無用的特徵。


如果網路非常強大的話,是不需要做這些額外操作的。 CNN 中的卷積( 3D 卷積 ) 是考慮了各 channel 之間的權重的,而且是針對每個 channel 上每個 pixel 的權重。

但是現階段所設計的網路不夠強大,訓練的數據集大小不是理想上的無窮大,所以會出現有很多雜訊的情況,SENet 的設計可以盡量減少雜訊 channel 的影響。實際上,卷積層的輸出的 feature map 是輸入的 feature map 的一種組合(比如人是由上半身和下半身組合的),如果輸入的 channel 中雜訊太多,輸出肯定不理想。 SENet 讓強的 feature map 更強,弱的 feature map 更弱,有效的抑制了雜訊。

現階段這麼做是合情合理的,但這畢竟不是主流方向。根本要解決的還是怎麼花最少的力氣來讓網路有更大的表達能力,而不是非要顯性的去加強。


實測效果不錯,不過不知道是不是我實現的問題,正常的初始化直接訓練好像還沒有原始網路高,但是如果訓練好的模型額外加SEBlock,可以有明顯提升。


推薦閱讀:

Weight Normalization 相比batch Normalization 有什麼優點呢?
有沒有好理解的關於神經網路的書推薦?
機器學習怎麼系統的入門?
為何總感覺人工智慧和神經科學(神經網路)被綁在一起?
深度學習(如100層)為什麼不過擬合?

TAG:計算機視覺 | 神經網路 | 深度學習DeepLearning | 卷積神經網路CNN |