YOLO Backbone 的演進
YOLO 的 backbone 演進,並不是單純「越做越深」,而是一條讓深度可訓練、梯度可流動、計算可控的設計路線。
Classification → Detection Backbones
早期 YOLO 並沒有為 detection 設計專用 backbone,而是直接沿用分類模型。
- YOLOv1–v2
- 使用類分類 CNN(YOLOv1 自建 CNN、YOLOv2 的 Darknet-19)
- 優點是結構簡單、速度快
- 但特徵表達能力有限,難以同時支撐多尺度與精細定位
- 關鍵問題
- 分類 backbone 追求語意抽象
- Detection 需要同時保留 空間細節 + 語意層級
- 這個衝突在小物體與密集場景中特別明顯
![]() | ![]() |
|---|---|
| YOLOv1 Custom CNN | YOLOv2 Darknet-19 |
Residual Backbone:讓深度可用(YOLOv3)
YOLOv3 是第一個真正解決 backbone 深度問題的版本。
- Darknet-53
- 引入 residual connection
- 讓梯度可以穩定傳遞到深層
- 設計意義
- backbone 不再只是「跑得快」
- 而是開始能承載多尺度特徵學習
- 影響
- 為後續 multi-scale prediction、FPN / PAN 打下基礎
- YOLO 開始進入「可長期演化」的架構狀態

問題
但這一代的問題是:深度增加 ≠ 計算效率好。
CSP:不是加深,而是「切開」梯度流
CSP(Cross Stage Partial Network)的提出,不是為了做一個更深的 backbone,而是為了解決深度 CNN 中一個被忽略的問題:
大量重複的梯度資訊,正在浪費計算與學習能力
Residual / Dense 的效率瓶頸
即使是 ResNet 或 DenseNet 這類「梯度友善」的架構,仍存在結構性問題:
- 在 residual / dense 架構中:
- 每一層都會接收到來自所有前層的梯度
- 梯度路徑雖然變短,但資訊高度相關
- 結果是:
- 不同層學到高度重複的梯度資訊
- 造成:
- 不必要的計算
- 記憶體流量(memory traffic)增加
- 訓練與推論效率下降
問題
Residual 解決了「梯度消失」,但沒有解決「梯度重複」。
CSP 的核心假設
CSPNet 明確提出一個假設:
CNN 的效能瓶頸,不只是深度或寬度, 而是「不同層是否真的學到不同的資訊」。
因此 CSP 的目標不是增加 capacity,而是:
- 最大化梯度組合的多樣性(gradient combination diversity)
- 最小化重複梯度造成的無效學習

CSP 的核心做法
不讓所有 feature 都參與所有層的梯度回傳,而是刻意截斷一部分梯度流。
具體作法是:
- 在一個 stage 開始時:
- 將輸入 feature map 沿 channel 切成兩部分
- 兩條路徑:
- Path A:直接 bypass(不進入深層 block)
- Path B:進入完整的 residual / dense block
- 在 stage 結尾:
- 先對 Path B 做 transition(如 conv / pooling)
- 再與 Path A concat
- 刻意選擇「fusion last」策略以截斷梯度重用
![]() | ![]() |
|---|---|
| DenseNet | Cross Stage Partial DenseNet |
為什麼一定要「fusion last」?
相關論文做了非常關鍵的 ablation:
- Fusion first(先 concat 再 transition)
- 梯度仍然高度重複
- 計算下降,但 accuracy 明顯掉
- Fusion last(先 transition 再 concat)
- 梯度流被有效截斷
- 計算量下降 20%
- Top-1 accuracy 幾乎不變(僅 ~0.1%)
![]() | ![]() |
|---|---|
| Fusion Fisrt 和 Fusion Last 的模型架構 | Fusion Last 明顯比 Fusion First 好 |
證實
這證實 CSP 的關鍵不是結構形式,而是 「避免不同路徑學到相同梯度訊號」。





