Billy Tse
HomeRoadmapBlogContact
Playground
Buy me a bug

© 2026 Billy Tse

OnlyFansLinkedInGitHubEmail
Back to Blog
April 1, 2026

乜嘢係 1×1 Convolution?點解佢可以又慳參數又做跨 Channel Mix?

用廣東話拆解 1×1 convolution(pointwise conv):由 Network in Network 到 ResNet bottleneck,再到 MobileNet depthwise separable,講清楚佢點樣做 channel mixing、降/升維同加速。

Computer VisionAI

有啲 layer 睇落好似「冇做嘢」:kernel 只有 1×1,仲唔會望到隔籬像素。 但係,佢其實係 CNN 入面最值錢嘅螺絲釘 — 專門負責「跨 channel」嘅 mixing 同壓縮。

TL;DR

  • 1×1 convolution(又叫 pointwise conv)唔係為咗睇空間(spatial)資訊,而係為咗做 channel mixing:喺同一個像素位置,將 C 個 channel 線性組合成 C' 個 channel。
  • 佢等價於:對每個 pixel 做一次 全連接層(FC),只不過 weight 係全圖共享。
  • 最常見三大用途:
    • 🔻 降維 / 升維(bottleneck)→ 慳參數、慳 FLOPs
    • ⚡ 加 non-linearity(1×1 + ReLU)→ Network in Network
    • 📱 Depthwise Separable Conv 嘅 pointwise stage(MobileNet)→ 大幅減計算

目錄


基本概念:1×1 convolution 到底做緊乜?

假設 input feature map 係 H × W × C。

  • 一個 1×1 conv filter 嘅 shape:1 × 1 × C
  • 如果你有 C' 個 filters,output 就係:H × W × C'

對於每個位置 (h, w),運算等同:

y=Wx+b,W∈RC′×Cy = Wx + b, \quad W \in \mathbb{R}^{C' \times C}y=Wx+b,W∈RC′×C

Loading diagram...

🧩 直覺對比

  • 1×1 conv:「只望自己」→ 但會將所有 channels 線性混合

點解叫「per-pixel FC」?

對每個像素位置,1×1 conv 做嘅嘢等同一個全連接層:

plain同一個 pixel (h, w) 入面: input channels: [ c1 ] output channels: [ o1 ] [ c2 ] [ o2 ] [ c3 ] → W × x + b → [ o3 ] [...] [...] [ cC ] [ oC' ]

但同普通 FC 有一個關鍵分別:

特性普通 FC layer1×1 Conv
適用對象固定大小嘅 flatten vector任意 H×W 嘅 feature map
Weight 共享唔同位置有唔同 weight所有位置共享同一組 weight ✅
輸出形式flat vector仍然係 feature map 形式 ✅
參數量同 input size 正比只跟 C 同 C' 有關 ✅

所以 1×1 conv 係:有 weight sharing 約束嘅 FC,可以無縫接入任何 conv pipeline。


參數量 vs 計算量:慳幾多?

LayerWeight shape參數量FLOPs(每個 pixel)
1×1 convC'×CCC′CC'CC′CC′CC'CC′
3×3 convC'×C×3×39CC′9CC'9CC′9CC′9CC'9CC′
5×5 convC'×C×5×525CC′25CC'25CC′25CC′25CC'25CC′

💰 Rule of thumb:先降維再做大 kernel
用 1×1 先將 channel 壓細(C → C_r),再做 3×3(C_r → C_r),最後 1×1 變返(C_r → C')。

成本由 9CC′9CC'9CC′ 大幅降到 CCr+9Cr2+CrC′CC_r + 9C_r^2 + C_rC'CCr​+9Cr2​+Cr​C′。當 C_r << C 時,慳到好恐怖。


經典用法 1:Network in Network(NiN)— 加 non-linearity

NiN 提出「mlpconv」概念:用多個 1×1 + activation 模擬 per-pixel MLP。

Loading diagram...

點解有用? 純粹係 linear 嘅 1×1 只能做線性組合,加埋 ReLU 之後,同一個 spatial location 入面嘅 channel 交互變成 非線性,表示力(expressiveness)大幅提升。


經典用法 2:ResNet Bottleneck — 降維 → 3×3 → 升維

Loading diagram...

數字對比(H=W=56,C=256)

方案結構參數量省多少
直接 3×3256 → 256589,824—
Bottleneck256→64→64→25669,632~8.5× ✅

拆解 bottleneck 嘅參數:

  • 1×1(256→64):256×64=16,384256 \times 64 = 16{,}384256×64=16,384
  • 3×3(64→64):9×64×64=36,8649 \times 64 \times 64 = 36{,}8649×64×64=36,864
  • 1×1(64→256):64×256=16,38464 \times 256 = 16{,}38464×256=16,384
  • 合計:69,632(vs 直接 3×3 嘅 589,824)

經典用法 3:Depthwise Separable Conv(MobileNet)— 1×1 係主角

Depthwise separable conv 將標準 conv 拆成兩步:

Loading diagram...

計算量對比:

方案FLOPs(per pixel)省多少(C=C'=128)
Standard 3×3 conv9CC′9CC'9CC′—
Depthwise + Pointwise9C+CC′9C + CC'9C+CC′~8× 減少 ✅

📱 喺 MobileNet 入面,depthwise 負責捕捉 spatial pattern,1×1 pointwise 負責 channel mixing。
兩者分工明確,合起來等效於一個完整嘅 standard conv,但計算量細好多。


常見問題:1×1 係咪冇用 spatial 資訊?

係,但呢個正正係佢嘅設計目標。

CNN 入面有兩種根本唔同嘅運算需求:

需求負責嘅 layer點解分開做?
捕捉空間 pattern(邊緣、紋理、形狀)3×3 / 5×5 conv需要睇附近格仔嘅資訊
Channel 之間嘅線性組合 / 壓縮1×1 conv只需要同一位置嘅 channel 資訊

將兩者分開,每種運算都可以做到最輕量 — 呢個係 Depthwise Separable Conv 嘅核心哲學。


實戰建議:幾時加 1×1?

  • Model 太大 / 太慢 → 加 bottleneck(1×1 降維 + 3×3 + 1×1 升維)
  • 用緊 depthwise conv → 一定要配 1×1 做 channel mixing,否則 channels 之間完全冇交流
  • 想提升表示能力但唔想加太多參數 → 1×1 + activation(NiN 風格)
  • Channel 數目唔對 → 1×1 係最平嘅「轉接頭」,調整 channel 數目而唔引入空間運算

總結

1×1 convolution 表面係「最細嘅 conv」,實際係 CNN 入面最靈活嘅 channel operator。

如果你將 CNN 理解成兩條流水線:

  • Spatial stream:3×3 / 5×5 負責睇鄰居、提取空間 pattern
  • Channel stream:1×1 負責溝埋唔同 feature、調整維度、加非線性

咁 1×1 就係第二條流水線嘅核心工具 — 乾淨、平、靈活,同任何架構都可以無縫組合。

🎯 一句話記住:1×1 conv = 對每個 pixel 獨立做一次「channel 重新加權混合」,唔望鄰居,只做 channel-wise 線性變換。

Back to all articles
目錄