原文:https://cloud.tencent.com/developer/article/1038802
git
CNN從2012年的AlexNet發展至今,科學家們發明出各類各樣的CNN模型,一個比一個深,一個比一個準確,一個比一個輕量。我下面會對近幾年一些具備變革性的工做進行簡單盤點,從這些充滿革新性的工做中探討往後的CNN變革方向。github
注:水平所限,下面的看法或許有誤差,望大牛指正。另外只介紹其中具備表明性的模型,一些著名的模型因爲原理相同將不做介紹,如有遺漏也歡迎指出。網絡
1、卷積只能在同一組進行嗎?-- Group convolution架構
Group convolution 分組卷積,最先在AlexNet中出現,因爲當時的硬件資源有限,訓練AlexNet時卷積操做不能所有放在同一個GPU處理,所以做者把feature maps分給多個GPU分別進行處理,最後把多個GPU的結果進行融合。性能
alexnet學習
分組卷積的思想影響比較深遠,當前一些輕量級的SOTA(State Of The Art)網絡,都用到了分組卷積的操做,以節省計算量。但題主有個疑問是,若是分組卷積是分在不一樣GPU上的話,每一個GPU的計算量就下降到 1/groups,但若是依然在同一個GPU上計算,最終總體的計算量是否不變?找了pytorch上有關組卷積操做的介紹,望讀者解答個人疑問。.net
pytroch github3d
EDIT:orm
關於這個問題,知乎用戶朋友 @蔡冠羽 提出了他的看法:blog
我感受group conv自己應該就大大減小了參數,好比當input channel爲256,output channel也爲256,kernel size爲3*3,不作group conv參數爲256*3*3*256,若group爲8,每一個group的input channel和output channel均爲32,參數爲8*32*3*3*32,是原來的八分之一。這是個人理解。
個人理解是分組卷積最後每一組輸出的feature maps應該是以concatenate的方式組合,而不是element-wise add,因此每組輸出的channel是 input channels / #groups,這樣參數量就大大減小了。
AlexNet中用到了一些很是大的卷積核,好比11×十一、5×5卷積核,以前人們的觀念是,卷積核越大,receptive field(感覺野)越大,看到的圖片信息越多,所以得到的特徵越好。雖然說如此,可是大的卷積核會致使計算量的暴增,不利於模型深度的增長,計算性能也會下降。因而在VGG(最先使用)、Inception網絡中,利用2個3×3卷積核的組合比1個5×5卷積核的效果更佳,同時參數量(3×3×2+1 VS 5×5×1+1)被下降,所以後來3×3卷積核被普遍應用在各類模型中。
傳統的層疊式網絡,基本上都是一個個卷積層的堆疊,每層只用一個尺寸的卷積核,例如VGG結構中使用了大量的3×3卷積層。事實上,同一層feature map能夠分別使用多個不一樣尺寸的卷積核,以得到不一樣尺度的特徵,再把這些特徵結合起來,獲得的特徵每每比使用單一卷積核的要好,谷歌的GoogleNet,或者說Inception系列的網絡,就使用了多個卷積核的結構:
最第一版本的Inception結構
如上圖所示,一個輸入的feature map分別同時通過1×一、3×三、5×5的卷積核的處理,得出的特徵再組合起來,得到更佳的特徵。但這個結構會存在一個嚴重的問題:參數量比單個卷積核要多不少,如此龐大的計算量會使得模型效率低下。這就引出了一個新的結構:
發明GoogleNet的團隊發現,若是僅僅引入多個尺寸的卷積核,會帶來大量的額外的參數,受到Network In Network中1×1卷積核的啓發,爲了解決這個問題,他們往Inception結構中加入了一些1×1的卷積核,如圖所示:
加入1×1卷積核的Inception結構
根據上圖,咱們來作個對比計算,假設輸入feature map的維度爲256維,要求輸出維度也是256維。有如下兩種操做:
1×1卷積核也被認爲是影響深遠的操做,日後大型的網絡爲了下降參數量都會應用上1×1卷積核。
ResNet skip connection
傳統的卷積層層疊網絡會遇到一個問題,當層數加深時,網絡的表現愈來愈差,很大程度上的緣由是由於當層數加深時,梯度消散得愈來愈嚴重,以致於反向傳播很難訓練到淺層的網絡。爲了解決這個問題,何凱明大神想出了一個「殘差網絡」,使得梯度更容易地流動到淺層的網絡當中去,並且這種「skip connection」能帶來更多的好處,這裏能夠參考一個PPT:極深網絡(ResNet/DenseNet): Skip Connection爲什麼有效及其它(http://blog.csdn.net/malefactor/article/details/67637785) ,以及個人一篇文章:爲何ResNet和DenseNet能夠這麼深?一文詳解殘差塊爲什麼能解決梯度彌散問題(https://zhuanlan.zhihu.com/p/28124810?group_id=883267168542789632),你們能夠結合下面的評論進行思考。
標準的卷積過程能夠看上圖,一個2×2的卷積核在卷積時,對應圖像區域中的全部通道均被同時考慮,問題在於,爲何必定要同時考慮圖像區域和通道?咱們爲何不能把通道和空間區域分開考慮?
Xception網絡就是基於以上的問題發明而來。咱們首先對每個通道進行各自的卷積操做,有多少個通道就有多少個過濾器。獲得新的通道feature maps以後,這時再對這批新的通道feature maps進行標準的1×1跨通道卷積操做。這種操做被稱爲 「DepthWise convolution」 ,縮寫「DW」。
這種操做是至關有效的,在imagenet 1000類分類任務中已經超過了InceptionV3的表現,並且也同時減小了大量的參數,咱們來算一算,假設輸入通道數爲3,要求輸出通道數爲256,兩種作法:
所以,一個depthwise操做比標準的卷積操做下降很多的參數量,同時論文中指出這個模型獲得了更好的分類效果。
本文在發出12小時後,一位知乎用戶私信了我,向我介紹了Depthwise和Pointwise的歷史工做,而Xception和Mobilenet也引用了他們16年的工做,就是Min Wang et al 的Factorized Convolutional Neural Networks(https://arxiv.org/pdf/1608.04337v1.pdf),這篇論文的Depthwise中,每一通道輸出的feature map(稱爲「基層」)能夠不止一個,而Xception中的Depthwise separable Convolution, 正是這篇工做中「單一基層」的狀況。推薦有興趣的讀者關注下他們的工做,這裏有篇介紹博文:【深度學習】卷積層提速Factorized Convolutional Neural Networks(http://blog.csdn.net/shenxiaolu1984/article/details/52266391)而最先關於separable convolution的介紹,Xception做者提到,應該追溯到Lau- rent Sifre 2014年的工做 Rigid-Motion Scattering For Image Classification 6.2章節(http://www.di.ens.fr/data/publications/papers/phd_sifre.pdf)。
在AlexNet的Group Convolution當中,特徵的通道被平均分到不一樣組裏面,最後再經過兩個全鏈接層來融合特徵,這樣一來,就只能在最後時刻才融合不一樣組之間的特徵,對模型的泛化性是至關不利的。爲了解決這個問題,ShuffleNet在每一次層疊這種Group conv層前,都進行一次channel shuffle,shuffle過的通道被分配到不一樣組當中。進行完一次group conv以後,再一次channel shuffle,而後分到下一層組卷積當中,以此循環。
來自ShuffleNet論文
通過channel shuffle以後,Group conv輸出的特徵能考慮到更多通道,輸出的特徵天然表明性就更高。另外,AlexNet的分組卷積,其實是標準卷積操做,而在ShuffleNet裏面的分組卷積操做是depthwise卷積,所以結合了通道洗牌和分組depthwise卷積的ShuffleNet,能獲得超少許的參數以及超越mobilenet、媲美AlexNet的準確率!
另外值得一提的是,微軟亞洲研究院MSRA最近也有相似的工做,他們提出了一個IGC單元(Interleaved Group Convolution),即通用卷積神經網絡交錯組卷積,形式上相似進行了兩次組卷積,Xception 模塊能夠看做交錯組卷積的一個特例,特別推薦看看這篇文章:王井東詳解ICCV 2017入選論文:通用卷積神經網絡交錯組卷積。
要注意的是,Group conv是一種channel分組的方式,Depthwise +Pointwise是卷積的方式,只是ShuffleNet裏面把二者應用起來了。所以Group conv和Depthwise +Pointwise並不能劃等號。
不管是在Inception、DenseNet或者ShuffleNet裏面,咱們對全部通道產生的特徵都是不分權重直接結合的,那爲何要認爲全部通道的特徵對模型的做用就是相等的呢? 這是一個好問題,因而,ImageNet2017 冠軍SEnet就出來了。
SEnet 結構
一組特徵在上一層被輸出,這時候分兩條路線,第一條直接經過,第二條首先進行Squeeze操做(Global Average Pooling),把每一個通道2維的特徵壓縮成一個1維,從而獲得一個特徵通道向量(每一個數字表明對應通道的特徵)。而後進行Excitation操做,把這一列特徵通道向量輸入兩個全鏈接層和sigmoid,建模出特徵通道間的相關性,獲得的輸出其實就是每一個通道對應的權重,把這些權重經過Scale乘法通道加權到原來的特徵上(第一條路),這樣就完成了特徵通道的權重分配。做者詳細解釋能夠看這篇文章:專欄 | Momenta詳解ImageNet 2017奪冠架構SENet。
標準的3×3卷積核只能看到對應區域3×3的大小,可是爲了能讓卷積核看到更大的範圍,dilated conv使其成爲了可能。dilated conv原論文中的結構如圖所示:
上圖b能夠理解爲卷積核大小依然是3×3,可是每一個卷積點之間有1個空洞,也就是在綠色7×7區域裏面,只有9個紅色點位置做了卷積處理,其他點權重爲0。這樣即便卷積核大小不變,但它看到的區域變得更大了。詳細解釋能夠看知乎回答:如何理解空洞卷積(dilated convolution)?
圖來自微軟亞洲研究院公衆號
傳統的卷積核通常都是長方形或正方形,但MSRA提出了一個至關反直覺的看法,認爲卷積核的形狀能夠是變化的,變形的卷積核能讓它只看感興趣的圖像區域 ,這樣識別出來的特徵更佳。
圖來自微軟亞洲研究院公衆號要作到這個操做,能夠直接在原來的過濾器前面再加一層過濾器,這層過濾器學習的是下一層卷積核的位置偏移量(offset),這樣只是增長了一層過濾器,或者直接把原網絡中的某一層過濾器當成學習offset的過濾器,這樣實際增長的計算量是至關少的,但能實現可變形卷積核,識別特徵的效果更好。詳細MSRA的解讀能夠看這個連接:可變形卷積網絡:計算機新「視」界(https://weibo.com/ttarticle/p/show?id=2309404116774126794221)。
如今愈來愈多的CNN模型從巨型網絡到輕量化網絡一步步演變,模型準確率也愈來愈高。如今工業界追求的重點已經不是準確率的提高(由於都已經很高了),都聚焦於速度與準確率的trade off,都但願模型又快又準。所以從原來AlexNet、VGGnet,到體積小一點的Inception、Resnet系列,到目前能移植到移動端的mobilenet、ShuffleNet(體積能下降到0.5mb!),咱們能夠看到這樣一些趨勢:
卷積核方面:
卷積層通道方面:
卷積層鏈接方面:
啓發
類比到通道加權操做,卷積層跨層鏈接可否也進行加權處理?bottleneck + Group conv + channel shuffle + depthwise的結合會不會成爲之後下降參數量的標準配置?