[19.11] CSPNet
半半半插件
CSPNet: A New Backbone that can Enhance Learning Capability of CNN
CSPNet 來自於:「Cross Stage Partial Network」的縮寫。
這篇論文在工業界應用非常廣泛,不僅如此,在 Timm 套件中也有很多相關的實作,例如:cspdarknet53
, cspresnet50
, cspresnext50
等。
定義問題
作者分析目前的神經網路架構,看上了 DenceNet 的特性,但由於 DenceNet 存在著一些問題需要改進,以下歸納了幾點:
-
計算瓶頸:
計算瓶頸是指在一個計算過程中,某些部分或層級的運算資源(如處理單元、記憶體、數據傳輸等)無法有效利用,導致整體效能受限。當計算瓶頸存在時,系統的部分計算資源會閒置,而其他部分會處於過度使用的狀態。
在 CNN 中,不同層負責不同的計算任務。如果某一層需要執行的計算量過大,而其他層的計算量較小,這會導致系統中某些運算單元過度忙碌,而其他單元處於閒置狀態。
-
記憶體使用量高
前一陣子提出的 DenceNet,雖然在學習能力上有所提升,但是記憶體使用量也隨之增加。因為內部存在大量的 Concat 操作,每次拼接就必須複製一份資料,而後改進版本的網路架構,像是 PeleeNet、VoVNet 等,也同樣存在這個問題。
沒看過 DenseNet 的可以參考我們另外一篇論文筆記:
解決問題
模型架構
如上圖,上半部是 DenceNet 的原始設計,簡單來說,這個流程是這樣的:
- 將輸入
x
通過一個卷積層,得到y1
。 - 將
y1
和x
進行拼接,得到y2
。 - 將
y2
通過一個卷積層,得到y3
。 - 將
y3
和x
進行拼接,得到y4
。 - 重複上述步驟。
DenseNet 多層共享相同的梯度資訊,導致重複學習相同的梯度,影響學習效果。
為了降低記憶體的使用量,作者這裡做出的改動就是:「不要使用全部的特徵圖」。
改動後的差異在於幾個地方:
- 增加梯度路徑:通過交叉分割策略,梯度路徑數量增加兩倍,降低特徵圖複製的次數。
- 平衡每層的計算量:為了降低計算瓶頸,部分 dense block 只使用一半的通道數。
- 減少記憶體傳輸量:部分分割的策略可以節省一半的記憶體流量。
整體看來,這個設計保留 DenseNet 的特徵重用優勢,同時透過截斷梯度流動避免重複梯度資訊,提升學習能力。
雖然論文中多次提到「一半」這個字,但其實這個拆分比例是可以設定的。
在後面的消融實驗中作者有針對不同的拆分比例進行了實驗,這裡為了方便說明,我們就直接用「一半」這個比例來說明。