特徵提取模型系列之CNN設計
引言與一些定義
對看過的一些關於CNN(卷積神經網路)的論文的一個總結,看的論文不多所以內容可能沒多少,以後有新的內容會不斷加上去,有不正確之處或不同看法之處歡迎指出。
為了方便下面說明,先定義一些名詞:
層:像卷積層,全連線層,批歸一化層等等就叫做CNN的 層
模組:由一種或多種層的若干數量的堆砌,比如像Inception
CNN的微觀結構與巨集觀結構:CNN的設計可以看作是先設計基本的模組,然後將各種模組以一定結構堆砌連線,模組內部的設計叫做微觀結構(microarchitecture),比如決定模組內部的各種層的選擇和堆砌順序等;如何用模組來組成CNN的整體結構的設計叫做巨集觀結構(macroarchitecture),比如像模組如何連線,網路的深度等。
CNN的微觀結構
VGG模組:
主要想法是儘量用3x3的卷積核,具體做法是用兩個連續的3x3的卷及核去代替1個5x5的卷積核,同理也可以用3個3x3的卷積核去代替1個7x7的卷積核,如此類推。這樣子做的好處是有相同的感受野的同時卻只需要更少的計算和引數,而且還有更多的非線性性。bottleneck(圖片來自https://zhuanlan.zhihu.com/p/28749411):
如上圖中第二種所示,先用1x1的卷積層降維,然後3x3的卷積,然後再用1x1的卷積升維。比起單個3x3的卷積層,感受野是一樣大的,但用的超引數少了,非線性性多了,但由於第一層有降維操作,可能會對結果有影響。這種模組不適合在一開始就用,比較適合在CNN的中間部分用。同樣可以在兩個1x1的卷積層中間使用2個3x3的卷積層來代替VGG模組。Inception(圖片來自googLenet的幾篇論文,不寫具體連結了,一百度應該就有一堆):
引入更多的分支,分支作用在於加入各種不同的感受野。引數更少,感受野更多,非線性性更多。用1xn和nx1的卷積核去代替nxn的卷積核的想法也很奇妙。壓縮模組(圖片來自論文:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size):
類似於是inception和bottleneck的結合(壓縮層->bottleneck,擴充套件層->inception),先用了1x1的conv降維(壓縮層),再分不同的感受野分支(擴充套件層),相對而言增加了非線性性,擴充套件層的不同分支中1x1的卷積層佔了較大一部分,因而引數也會相對較少。
位敏得分模組(圖片來自論文:R-FCN: Object Detection via Region-based Fully Convolutional Networks )
卷積層是具有平移不變性的,但在某些應用中比如物體檢測中,是需要卷積層具有平移變換性的,位敏得分模組的存在強調了對位置資訊的關注。SE模組(圖片來自論文:Squeeze-and-Excitation Networks)
傳統的卷積對特徵圖的每一個通道都是等同看待的,而SE模組對不同通道賦予不同的權重。深度可分離卷積模組(圖片來自論文:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Appilcation)
傳統的卷積都是感受域和深度同時進行,而深度可分離卷積將這兩部分分開進行,先進行感受域的卷積,這也就意味著輸入的資料深度有多少就有多少個卷積核,然後再對它們得到的結果用1x1的卷積核進行卷積(也就是進行深度的卷積),這樣子的好處是能大大減少引數。
CNN的巨集觀結構
旁路結構:
是指一個模組的輸入可以連線到另一個模組的輸出,旁路可以簡單(直接就一條線),也可以複雜(旁路上有一些卷積層)。比如像殘差結構用的就是簡單的旁路。
旁路結構一種直觀上的理解是能讓資訊更靈活地流動,前向傳播時低層的特徵能通過旁路與高層的特徵一起被利用,反向傳播時梯度也能從高層通過旁路直接流到低層,使得低層獲取到的梯度不會太小,從而讓引數的學習得以進行。
旁路結構的另一個比較合適的解釋是來自論文:Residual Networks are Exponential Ensembles of relative shallow network(圖片來自論文,裡面是針對殘差網路來解釋的)
論文提出了幾個比較重要的看法:(1)殘差網路並不是一個單一的深度網路,而是由指數級數量的網路的整合 ;(2)這些整合的網路中真正起作用是一些淺層網路。對於(1),論文作者通過在刪除網路的部分模組以及重組部分模組來驗證想法,對於(2),論文作者通過統計各種網路貢獻的梯度以及訓練時只訓練淺層網路的方法來驗證想法。
類比著,我個人覺得旁路結構的存在也類似地為網路增加了潛在的整合性,而整合性的存在一是有利於資訊(e.g.梯度)的流動,二是能夠緩解過擬合。
旁路結構多種多樣,比如像:
<1>殘差網路
<2>密集網路(圖片來自論文:Densely Connected Convolutional Networks)
分層結構(圖片來自論文:FractalNet: Ultra-Deep Neural Networks without Residuals):
旁路結構隱式地增加了網路的整合性,而分層結構則是顯示地將整合性表達出來,應該可以說旁路結構是分層結構的特殊情況。
分層結構的存在能讓CNN的效果會隨著網路深度的加深而不斷變好(整合的角度看)。與drop-path相結合可以讓學到的特徵更具有魯棒性。關於深度和卷積核的通道數那些在下面的設計模式裡有涉及,這裡就不再說了。還有就是不管是Incenption裡的多分支還是旁路結構以及分層結構裡的整合觀點,都是分支,有分支就有彙總,彙總的方式主要有求和(resnet)|求平均(fractal net)|級聯(googLenet)|求最大值 etc,下面的設計模式裡有涉及這些方法的討論。
啟發式的設計模式
(論文:Deep Convolutional Neural Network Design Patterns)
這篇論文裡講的主要是設計CNN時的規律和經驗法則,我根據自己的理解把裡面講的14條設計模式分為 設計前要考慮的,微觀結構相關的,巨集觀結構相關的 三部分。
設計前要考慮的
Architectural Structure follows the Application: 結構遵循應用
對有某些任務,一些特定的網路結構可能會效果更好,因此要先考慮應用場景是如何,是否有哪些網路結構在這些任務上能夠表現地更好。over-train:在一個更難的問題上訓練從而提高泛化能力
e.g.
正則化:在要求訓練誤差低的同時還要求模型儘可能簡單
噪音的使用:理想的資料中沒有噪音,但現實中的資料中往往存在噪音,往樣本中加入適度的噪音(e.g.dropout)會讓任務更加難,但最後效果會更加好cover the problem space:覆蓋問題空間
儘量讓訓練樣本在總體的所有可能取值的地方都有采樣到。
e.g.資料增強
微觀結構相關的
Proliferate Paths:擴增路徑
e.g.
inception:多種感受野相結合
fractal:多種深度相結合Summation Joining:求和式連線
連線多分支時採用求和或者求平均。Down-sampling Transition:下采樣轉換
對於會下采樣的層,用級聯來連結各分支從而達到增加輸出數量會更合適Maxout for Competition:用maxout來連線分支從而有競爭的作用
when each branch is composed of different sized kernels, Maxout is useful for incorporating scale invariance in an analogous way to how max pooling enables translation invariance.(論文中的原話)
巨集觀結構相關的
Strive for Simplicit:儘量簡潔
使用盡量少的模組和讓網路整體結構儘可能簡單Increase Symmetry:增加對稱性
對稱性認為是漂亮和質量的特徵Pyramid Shape:金字塔形狀
最大化表徵能力和消除冗餘與非判別資訊 之間的權衡
e.g. downsample的同時增加輸出通道數Incremental Feature Construction:增量式特徵構造
e.g 加入旁路Normalize Layer Inputs:標準化層輸入
e.g. batch normalizationInput Transition:輸入轉換
將第一層的輸出加倍到3的倍數Available Resources Guide Layer Widths:可用的資源決定層數的深度和寬度
根據記憶體和計算資源以及想要的準確率來選擇第一層的輸出數量 ,CNN的深度等
總結
總結一下,不管是CNN的巨集觀結構還是微觀結構,可以把它們分成兩大類,一是提升模型效果的,二是壓縮模型(減少引數)。
提升模型效果的有:VGG模組,Inception,位敏得分模組,SE模組,旁路結構,分層結構
壓縮模型的有:VGG模組,Inception,bottleneck,壓縮模組,深度可分離卷積模組