卷積神經網路

深度可分離卷積

深度可分離卷積把一個普通卷積拆解成兩個更便宜的步驟,藉由把「在哪裡」與「是什麼」分開。首先,深度(depthwise)步驟用各自的小型 2D 卷積核,分別對每個輸入通道單獨濾波——它看空間鄰域,但從不混合通道。接著,逐點(pointwise,即 1x1)步驟在每個位置混合通道,但不看任何鄰域。標準卷積在一個昂貴的運算中同時做這兩件事;把它們拆開能以一小部分的成本,保留幾乎相同的建模能力。

精確地說,一個從 C_in 到 C_out 通道的標準 kxk 卷積,耗費 H*W*C_in*C_out*k*k 次乘加與 C_in*C_out*k*k 個參數。深度步驟耗費 H*W*C_in*k*k(每個輸入通道一個 k x k 卷積核、不混合通道);逐點步驟耗費 H*W*C_in*C_out。因此可分離與標準的成本比為 1/C_out + 1/k^2——對一個輸出 256 通道的 3x3 卷積,這約為 1/256 + 1/9,在浮點運算量與參數量上都大約減少 9 倍,而準確率損失很小。

這個分解是行動端與嵌入式視覺的引擎。MobileNet(Howard 等人,2017)幾乎完全由深度可分離區塊構成,而 Xception(Chollet,2017)把 Inception 詮釋為將這種分離推到極致,主張空間相關性與跨通道相關性足夠獨立、可以分開學習。同樣的想法可推廣——分組卷積(grouped convolution)是「完整」與「深度」之間的折衷、EfficientNet 縮放深度可分離骨幹、而 ConvNeXt 重新採用大卷積核的深度卷積來匹敵視覺 Transformer。其取捨是較低的算術強度(arithmetic intensity):深度卷積浮點運算少,卻受記憶體頻寬所限,因此在特定加速器上的實際時間加速,往往不如浮點運算量的減少所暗示的那麼多。

在 14x14 特徵圖上把一個 3x3 卷積(256->256)替換掉:標準需 256*256*9 = 589,824 個參數;可分離需 256*9(深度)+ 256*256(逐點)= 2,304 + 65,536 = 67,840 個參數——約少 8.7 倍。

陷阱:理論上約 9 倍的浮點運算節省,在 GPU 上很少能轉化為約 9 倍的速度,因為深度卷積的算術強度低(每載入一個位元組只做很少運算),會變成受記憶體頻寬所限。請務必在目標硬體上實測真實延遲,而不要只相信參數量或浮點運算量。

又稱
DSConvseparable conv