1×1 卷積
1x1 卷積使用「寬一像素、高一像素」的卷積核。由於沒有空間鄰域可看,它只做一件事:在每個位置獨立地,取該處的通道值向量,並透過一個學出來的線性組合產生一個新向量。換句話說,它是一個被以完全相同方式套用在每個像素上的微型全連接層,混合並重新投影通道,同時保持高與寬不變。可以把它想成把每個像素的特徵向量「重新上色」。
精確地說,一個輸入 C_in、輸出 C_out 通道的 1x1 卷積,持有一個形狀為 (C_out, C_in) 的權重矩陣(外加偏置),並在每個空間位置計算 y = W x,其中 x 是該位置的 C_in 維輸入特徵向量。其成本為 H*W*C_in*C_out 次乘加,參數量為 C_in*C_out——遠比 3x3 便宜,後者的參數與浮點運算量是 9 倍。關鍵在於它能改變通道數:把它縮小(瓶頸)或放大(擴張)。
這讓 1x1 卷積成為高效架構的主力。Network in Network 引入了它;GoogLeNet/Inception 用它在昂貴的 3x3、5x5 分支之前削減通道;ResNet 的瓶頸區塊把一個 3x3 夾在「縮減通道的 1x1」與「還原通道的 1x1」之間,大幅削減運算;而深度可分離卷積則把一個深度空間步驟,與一個負責全部跨通道混合的 1x1 逐點步驟配對。每當你需要調整深度、融合通道資訊,或插入一個便宜且帶非線性的層時,1x1 卷積就是那個工具。
在 56x56 特徵圖上、從 256 通道到 64 通道的 1x1 卷積,耗費 256*64 = 16,384 個參數,把 56*56 個像素各自的 256 維向量降到 64 維——一個 4 倍的通道瓶頸,且不改變空間尺寸。
為何重要:1x1 卷積在數學上等同於「在每個像素都套用同一個全連接層」。正是這個等價關係,讓全卷積網路(fully-convolutional networks)能把分類 head 變成逐像素 head 用於分割——只要把全連接層讀成 1x1 卷積即可。