從變形卷積核、可分離卷積?卷積神經網絡中十大拍案叫絕的操作。中梳理提取補充.
前提名詞
- feature map: 特征圖, 卷積核的輸入和輸出都被稱為feature map
卷積核技巧
0x01 多個小卷積核代替大卷積核
之前的觀念是越大的卷積核感受野(receptive field)越大, 看到的信息越多, 提取的特征越好, 但存在問題:
- 參數劇增, 計算性能降低
- 不利於模型深度的增加
使用多個小卷積核代替單個大卷積核, 如在vgg和Inception網絡中, 使用兩個\(3\times{3}\)卷積核組合代替一個\(5\times{5}\)卷積核(原來的一層變為兩層). 好處:
- 參數減少: \(5\times{5}\times{1}\)減少為\(3\times{3}\times{2}\), 參數減少, 效率提高.
這種做法有效的原因:
在VGG網絡的論文中, 除開網絡本身, 最大的貢獻來自於對卷積疊加的觀察:
- \(5\times{5}\)卷積核的正則等效於兩個\(3\times{3}\)卷積核, \(7\times{7}\)卷積核的正則等效於三個\(3\times{3}\)卷積核, 如下圖所示
因此, 使用這種小卷積核疊加代替大卷積核有兩個好處:
- 大幅減少參數數量
- 本身帶有正則性質, 更能學習一個具有魯棒性的模型
0x02 多尺寸卷積核代替單尺寸卷積核
傳統的CNN網絡都是層疊式網絡, 每層都只使用一個卷積核. VGG網絡使用了大量的\(3\times{3}\)卷積核. 在Inception網絡中, 對於同一層的feature map, 使用多個不同尺寸的卷積核, 提取出不同的特征, 再將這些特征合並起來(在通道維度上). 不同角度的特征的表現一般比單一卷積核要好.
存在的問題:
- 參數量比單核多很多, 模型訓練效率低下
0x03 Bottleneck, \(1\times{1}\)卷積核
作用: 控制通道數量, 大幅減少神經網絡的參數數量, 加快網絡的訓練.
在Inception網絡中, 由於引入了多種尺寸的卷積核, 參數數量的爆炸, 需要使用\(1\times{1}\)卷積核來減少參數的數量.
以其中一個\(3\times{3}\)卷積核為例, 說明如何減少:
在卷積核之前加入一個\(1\times{1}\)卷積核, 將通道數量由原來的256壓縮到64. 經過\(3\times{3}\)卷積核計算后, 再使用另一個\(1\times{1}\)卷積核將通道數量恢復.
- 原來的\(3\times{3}\)卷積核參數的數量為: \(256\times{3}\times{3}\times{256} = 589824\)
- 使用\(1\times{1}\)卷積核處理后的參數數量為: \(256\times{1}\times{1}\times{64} + 64\times{3}\times{3}\times{64} + 64\times{1}\times{1}\times{256} = 69632\)
參數量降到原來的將近九分之一.
0x04 空洞卷積(Dilated convolution)
標准的\(3\times{3}\)卷積核只能看到\(3\times{3}\)矩形區域的大小, 為了增大卷積核的感受野, 可以在標准的卷積核里注入空洞, 使卷積核擁有更大的范圍, 但卷積點仍然為9個.
上面就是標准卷積核與空洞卷積核的工作方法. 對於空洞卷積核引入了新的超參數: dilation rate. 指的是核中點的間隔數量, 標准卷積核的dilation rate為1.
對於空洞卷積, 這篇文章如何理解空洞卷積中的回答很全面, 下面的內容也是大部分來自於這篇文章, 加以組織.
相關論文:
MULTI-SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS
Understanding Convolution for Semantic Segmentation
Rethinking Atrous Convolution for Semantic Image Segmentation
首先討論空洞卷積核的問題:
-
The Gridding Effect
使用dilation rate為2的\(3\times{3}\)卷積核多次疊加, 這里的疊加指的是多層相同的空洞卷積疊加作用, 則會出現下圖的情況:
上圖是多層\(3\times{3}\)空洞卷積核的疊加, 紅色為中心, 最左側紅色中心由中心和周圍的藍色點卷積得到, 而藍色的每個點, 又由他們本身與周圍的8個點卷積得到, 也就是發散到了中間的圖. 如此繼續疊加, 最終紅色中心的值由周圍若干個點卷積得到, 如右圖. 藍色越深表示卷積權重越大.
可以觀察得到的是, 空洞卷積疊加之后, 等效的卷積核並不連續, 計算每個點的時候, 並不是周圍所有的pixel點都用來計算了, 因此會損失信息的連續性. 這對於某些問題來說是致命的.
-
如何同時處理不同大小的物體關系
空洞卷積核設計的本身是為了獲取大范圍的信息, 但是如果采用大的dilation rate獲取的信息只對大的物體具有分割效果, 對於小的物體可能就采集不到了. 因此, 如何均衡兩者, 是空洞卷積設計的關鍵為題.
然后就是空洞卷積核的設計方法, Hybrid Dilated Convolution:
-
疊加卷積的dilation rate不能有大於1的公約數, 如[2, 4, 6]不是可行的三層卷積, 會出現gridding effect.
-
將dilation rate設計成鋸齒結構, 如 [1, 2, 5, 1, 2, 5] 循環結構.
-
滿足式子\(M_i=\max[M_{i+1}-2r_i, M_{i+1}-2(M_{i+1}-r_i), r_i]\)
其中\(r_i\)是\(i\)層的dilation rate, \(M_i\)是到\(i\)層最大的dilation rate, 對於最后一層\(n\), 就有\(M_n=r_n\), [1, 2, 5]就是一個可行的方案.
鋸齒狀本身的性質就比較好的來同時滿足小物體大物體的分割要求, 小的dilation rate關心近距離信息, 大的dilation rate關心遠距離信息.
一個良好設計的空洞卷積網絡能夠有效的避免gridding effect:
0x05 可變形卷積核(Deformable convolution)
傳統的卷積核都是正方形, 因此只能提取固定范圍, 固定形狀的特征. 可變性卷積核則認為卷積核的形狀是可以變化的, 即卷積核應當聚集於它真正感興趣的圖像區域.
實現這種操作, 需要添加一個新的卷積核, 將這個卷積核作用於輸入的feature map, 目的是學習卷積采樣的位置偏移量(offset). 這個偏移參數如同正常的卷積核參數一樣, 直接通過訓練一起得到, 不需要額外的監督標簽.
假設作用在2D的feature map上, 需要設定的這個偏移量卷積核的通道數應當是feature map通道數的兩倍, 因為每個通道中的每個pixel都需要計算x
方向和y
方向兩個方向上的偏移量.
總結下, deformable convolution由兩步組成:
- 使用偏移量卷積核在輸入的feature map上采樣
- 將采樣值與標准卷積核卷積求和, 輸出新的feature map
由於單純的使用偏移量采樣, 將會產生對不連續位置求導的問題, 使用雙差值方法, 將任何一個位置的輸出轉換為對於輸入的feature map插值計算的結果.
關於可變形卷積核的詳解, 包含差值方法參見Deformable Convolution Networks[譯], 使用keras實現的可變卷積核Layer見kingofoz / deform-conv.
通道技巧
0x01 DepthWise
標准卷積核對輸入的feature map的所有通道都會進行計算. 而DepthWise方法則將圖像區域和通道分開考慮:
- 首先, 對輸入的feature map中的每個通道, 各自進行卷積操作, 有多少個通道就有多少個filter
- 對經過filters處理得到的新的feature map, 使用標准的\(1\times{1}\)卷積核跨通道操作, 得到最后的輸出結果. 輸出通道有多少, 就有多少個\(1\times{1}\)卷積核.
這種操作被稱為DepthWise convolution, 最大的好處就是降低了參數的數量. 因為使用了\(1\times{1}\)卷積核, 所以一般參數量會降為直接使用標准卷積核的九分之一. 而且這種方法在降低參數的同時, 不會拉低模型的表現, 甚至會取得更好的表現.
0x02 ShuffleNet
ShuffleNet其實是兩種技術的結合:
- DepthWise: 上面的方法, ShuffleNet沒有使用傳統的卷積方法.
- Group Convolution: channel分組進行卷積. 即卷積核不是對輸入的feature map中的所有通道進行計算, 而是只選取一部分. 然后把所有分組的結果合並在一起作為卷積最后輸出的結果. 在AlexNet中, 最先被提出.
ShuffleNet在每次對feature map進行分組卷積(Group conv)操作前, 對所有通道進行洗牌隨機分組, 然后每組使用DepthWise的方式進行卷積.
上圖中的(b)就是標准的Group Convolution方法, channels被平均分配到不同組里面, 然后通過全連接層來融合所有組的特征. (c)就是shuffle group conv的方法.
0x03 SEnet(通道加權計算)
標准卷積方法中, 每個卷積核都是對所有的通道進行卷積, 然后直接加和在一起, 即相當於所有通道的權重是平等的. SEnet認為不同的通道, 對模型的貢獻是不同的, 因此有必要引入通道的權重參數.
網絡的整體結構如上圖:
- 對於輸入的feature map即\(X\), 其特征通道數為\(c_1\). 通過正常的卷積變換, 得到的輸出的feature map的通道數量為\(c_2\). 這一步與標准卷積沒有區別.
- 然后就要對當前的輸出結果進行調整. 通過三個操作來實現:
- 首先是Squeeze操作, 對輸出的feature map進行壓縮, 通過Global Average Pooling, 將每個通道壓縮成一個實數, 這樣就得到了長度為\(c_2\)的通道向量. 這個向量某種程度上具有全局的感受野, 表征着在特征通道上響應的全局分布.
- 然后是Excitation操作, 通過參數來為每個特征通道生成權重, 這里的參數是可被學習的, 被學習用來顯式地建模特征通道間的相關性. 論文中把這一列特征通道向量輸入兩個全連接層和sigmoid轉換得到.
- 最后是Reweight操作, 將上一步的輸出的權重, 看作是進過特征選擇后的每個特征通道的重要性, 然后通過乘法逐通道加權到先前的特征上, 完成在通道維度上的對原始特征的重標定.
連接技巧
0x01 ResNet(skip connection)
神經網絡的層數加深時, 網絡表現難以提高, 甚至會降低, 原因即熟悉的梯度消散, 使得反向傳播很難訓練到考前的層中. 殘差網絡(ResNet)通過skip connection技巧, 可以解決這個問題, 使得梯度更容易地流動到淺層的網絡當中去.
至於能夠起作用的原因, 可以參見這篇文章: 對ResNet的理解. 簡單概括如下:
這種skip connection的方式, 可以被分解. 如圖中右側的三層串聯的Residual module, 可以被分解成左側的多種路徑組合的網絡. 因此, 殘差網絡其實是很多並行子網絡的組合, 整個殘差網絡其實相當於一個多人投票系統Ensembling.
0x02 DenseNet
skip connection只連接了上一層的輸出作為本層輸出的一部分, DenseNet中的每一層輸出結果都是前面所有層輸出結果的疊加.
關於DenseNet的細節請閱讀論文Densely Connected Convolutional Networks.