有啲 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),運算等同:
🧩 直覺對比
- 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 layer | 1×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 計算量:慳幾多?
| Layer | Weight shape | 參數量 | FLOPs(每個 pixel) |
|---|---|---|---|
| 1×1 conv | C'×C | ||
| 3×3 conv | C'×C×3×3 | ||
| 5×5 conv | C'×C×5×5 |
💰 Rule of thumb:先降維再做大 kernel
用 1×1 先將 channel 壓細(C → C_r),再做 3×3(C_r → C_r),最後 1×1 變返(C_r → C')。成本由 大幅降到 。當 C_r << C 時,慳到好恐怖。
經典用法 1:Network in Network(NiN)— 加 non-linearity
NiN 提出「mlpconv」概念:用多個 1×1 + activation 模擬 per-pixel MLP。
點解有用? 純粹係 linear 嘅 1×1 只能做線性組合,加埋 ReLU 之後,同一個 spatial location 入面嘅 channel 交互變成 非線性,表示力(expressiveness)大幅提升。
經典用法 2:ResNet Bottleneck — 降維 → 3×3 → 升維
數字對比(H=W=56,C=256)
| 方案 | 結構 | 參數量 | 省多少 |
|---|---|---|---|
| 直接 3×3 | 256 → 256 | 589,824 | — |
| Bottleneck | 256→64→64→256 | 69,632 | ~8.5× ✅ |
拆解 bottleneck 嘅參數:
- 1×1(256→64):
- 3×3(64→64):
- 1×1(64→256):
- 合計:69,632(vs 直接 3×3 嘅 589,824)
經典用法 3:Depthwise Separable Conv(MobileNet)— 1×1 係主角
Depthwise separable conv 將標準 conv 拆成兩步:
計算量對比:
| 方案 | FLOPs(per pixel) | 省多少(C=C'=128) |
|---|---|---|
| Standard 3×3 conv | — | |
| Depthwise + Pointwise | ~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 線性變換。