釋疑:為什麼要用1×1的卷積核?

釋疑:為什麼要用1×1的卷積核?

左:3×3卷積核;右:1×1卷積核

剛開始接觸CNN時,我曾向某人提問:這個1×1的卷積核的卷積核是用來幹嘛的?它不是多餘的嗎?而那人只丟給我兩個字:

降維!

就頭也不回地走了。我留在原地恍然大悟:對啊!如果原先這是一個200×200×50的圖像,那我們用20個1×1卷積核過濾特徵後,它的大小就只有200×200×20了!雖然沒有改變寬和高,但卷積核確實減少了圖像的維數(通道數)。

但這又引出了第二個問題,使用這麼多1×1卷積核真的是CNN裡最好的降維方式嗎?它的效率和效能究竟如何?

讓我們圍繞上述幾個問題,一起分析其中的深層次原因。

更復雜的答案

特徵轉換

雖然我們把1×1卷積核看做“特徵池化”的一種工具,但它做的不僅僅是對特定層的各種通道/特徵映射進行特徵彙總。它在filter空間中起到了類似座標依賴變換的作用。理論上來說,這種變換是線性的,但在大多數應用中,它卻在ReLU等非線性激活層中表現出色。因為這種轉換是通過(隨機)梯度下降來學習的。

這也並不是說1×1卷積核就相當於SGD,它們的區別很大,其中最主要的是由於核很小,1×1卷積核幾乎不會受過擬合影響。

更深的網絡

我們第一次接觸1×1卷積核這個概念是在Network In Network這篇論文裡。在文章中,作者希望能在不堆疊額外卷積層的前提下構建一個更深的神經網絡,於是他把一些filter改成了小型感知器,也就是我們熟悉的1×1卷積核和3×3卷積核。

確切地說,他這樣做其實是把神經網絡變得更廣了,而不是更深了,但這確實增加了縱向厚度。而且在機器學習術語中,“變廣”更多時候意味著增加訓練數據,容易讓人誤解。從數學角度看,使用多個1×1卷積核就相當於使用多層感知器。

在GoogLeNet架構中,1×1卷積核的作用主要有以下幾點:

  • 通過添加inception模塊加深網絡;
  • 降低inception模塊內部維度;
  • 通過在每個1×1卷積核後計算ReLU,增加更多非線性。
釋疑:為什麼要用1×1的卷積核?

GoogLeNet中的1x1卷積核

從右側的圖像可以看出,1×1卷積核(黃色)作用於3×3和5×5卷積核前,第一時間對圖像進行降維。理論上來說,當兩個卷積核串聯時,它們可以合起來計算,但這在GoogLeNet中是不允許的,因為每個卷積核後都跟了一個激活函數做非線性化,箭頭輸出的不再是線性運算符,也就不能再組合計算了。

而且如果要設計這樣一個網絡,我們必須確保第一個卷積層的大小要大於1×1,以便它有足夠大的感受野去捕捉空間信息。正如Network In Network這篇論文中所說的:“這種跨通道的參數池化結構有利於跨通道信息的複雜、可學習交互”,1×1卷積核也可以被看做是跨通道參數池化層。

“跨通道信息學習”——這個詞聽起來有點晦澀,讀起來也很拗口,但理解起來其實不難。它其實是受生物啟發的一種思路,當觀察目標的方位發生變化後,人的視覺皮層可以通過自動調諧感受野來獲得信息,如下圖所示:

釋疑:為什麼要用1×1的卷積核?

更多用途

  • 1×1卷積核可以和最大池化層結合
釋疑:為什麼要用1×1的卷積核?

用1×1卷積核池化

  • 使用更大步長的1×1卷積核可以通過降低分辨率縮小圖像,同時儘可能地保留空間信息
釋疑:為什麼要用1×1的卷積核?

更大步長的1×1卷積核

  • 用1×1卷積核代替全連接層

Yann LeCun:在CNN中,沒有“全連接層”這種東西,有的只是包含1×1卷積核的卷積層和一個完整的連接表。


分享到:


相關文章: