CNN 為什麼自然適合看地圖與影像?
「Invariance and Equivariance」系列第 2 篇。上一篇用兩個手機視角分清楚語意不變與座標跟著變;這一篇把視角放到 pixel grid 上,看 CNN 的第一個 symmetry:translation equivariance。
假設你在手機上滑動台北市地圖。台大總圖從畫面中央跑到左下角,羅斯福路的位置跟著移動,捷運站標記也換了 pixel 座標。可是你不會希望模型因此重新學一套「左下角版本的道路偵測器」。
如果一個 filter 能在畫面中央認出道路邊界,它也應該能在畫面左下角認出同樣的道路邊界。這句話聽起來很樸素,卻是 CNN 最重要的 inductive bias。
這篇只處理一個問題:
Convolution layer 給你的不是 classification invariance,而是 feature map 的 translation equivariance。真正的 invariance 通常是後面的 pooling 或 readout 逐步做出來的。
如果把這兩件事混在一起,就會誤以為 CNN 中間層「忽略位置」。實際上它剛好相反:CNN 中間層很在乎位置,只是位置會用一致的方式跟著輸入平移。
先把道路偵測器滑過整張圖
一般 fully connected layer 對每個位置都有自己的參數。這就像你在地圖上每個街區都雇一個不同的人來辨識道路:台大附近的人只看台大附近,公館附近的人只看公館附近。這不只是浪費,也錯過了影像任務裡最重要的共同結構。
Convolution 的想法比較像:同一個小偵測器沿著整張地圖滑動。它在每個位置看一個局部 patch,問同一個問題:
- 這裡像不像道路邊界?
- 這裡像不像路口?
- 這裡有沒有建築物輪廓?
- 這裡的紋理是不是水面、草地或屋頂?
這個「同一個偵測器到處用」就是 weight sharing。它不只省參數,也把一個幾何假設寫進模型:局部 pattern 的意義不應取決於它出現在第幾個 pixel。
下面的 toy demo 把輸入地圖平移,並把簡化的 edge feature 畫在旁邊。打開 global pool 後,空間位置被聚合成一個數值;這正好把 layer-level equivariance 和 classification-level invariance 分開。
現在把滑動寫成公式
先用離散 2D cross-correlation 寫出深度學習框架常稱作 convolution 的運算。影像是 ,filter 是 :
令 表示把影像平移 。對一個理想的 convolution layer,我們希望
意思是:先平移影像再做 convolution,和先做 convolution 再平移 feature map,結果應該一致。
這是 translation equivariance。如果輸入裡的道路往左下角移,feature map 裡偵測到的道路也往左下角移。Feature 沒有消失,也沒有被平均掉;它只是被放到新的位置。
用上一篇的記號,這裡的 是平移 ,輸入上的作用是 ,輸出 feature map 上的 representation 也是把 feature map 平移:
這正是 的最熟悉版本。
這個交換關係可以直接從定義看出來。若 ,則
左邊是「先平移、再做 filter」,右邊是「先做 filter、再平移 feature map」。兩條路到同一個結果,所以 convolution 與 translation commute。這是理想無限 grid 或相容邊界條件下的正式事實;有限影像的 caveat 留到後面。
Classification 和 segmentation 的差別
現在回到手機地圖任務。
如果任務是 classification:「這張手機畫面是否包含台大?」最後輸出是一個 scalar label。台大從中央移到左下角,答案仍然可以是 yes。這時最後輸出希望 invariant。
如果任務是 segmentation:「哪些 pixel 是建築物?」輸出是一張 mask。台大建築物往左下角移,mask 也要往左下角移。這時輸出希望 equivariant。
所以 CNN 不是天生只會分類。更準確的說法是:
- convolutional feature maps 通常保留 spatial layout,因此對平移等變;
- segmentation、detection、keypoint localization 需要這種 spatially aligned output;
- classification head 常透過 pooling、flattening、global average pooling 或 attention readout,把 equivariant features 壓成比較 invariant 的全局表示。
這也是為什麼同一個 backbone 可以接不同 head。前面學局部且帶位置的表示,後面由任務決定要保留位置,還是丟掉位置。
從會跟著走,到最後不再看位置
很多教材會說 pooling 讓 CNN 對平移更 robust。這句話方向大致對,但容易讓人誤會成「pooling 保證 exact invariance」。
局部 max pooling 做的是在小範圍內取最大值。它可以讓 feature 對小幅度位移比較不敏感,但它不會對任意平移保證完全一樣。Global average pooling 更接近把整張 feature map 聚成一個全局 summary,因此常用在 classification readout。但如果你要的是 segmentation mask,過早 global pooling 會直接丟掉位置資訊。
若 feature map 是 ,global sum pooling 可寫成
在平移只重新排列位置、且沒有邊界遺失的理想情況下,
所以 equivariant feature 經過對位置的 symmetric global readout,可以得到 invariant output。這不是「convolution 自己突然不看位置」,而是最後一步明確把位置聚合掉。
所以要分清楚三層:
- Convolution layer:理想上對平移 equivariant。
- Local pooling / stride:常帶來局部穩定性與降採樣,但可能破壞 exact equivariance。
- Global readout:可以產生 classification 所需的近似或設計上的 invariance。
把這三層混成一句「CNN 平移不變」會漏掉最重要的結構。
理想等式碰到有限畫面
到目前為止,我們講的是乾淨的數學圖像。但實作 CNN 時,exact translation equivariance 很容易被一些看似無害的細節影響。
Boundary effects。 地圖邊界外沒有資料。當 filter 滑到影像邊緣時,你要選擇 padding。Zero padding 會在邊界引入人工訊號:原本只是畫面外未知,卻被填成零。這會讓靠邊界的 feature 和中間不同。
Padding choice。 Valid convolution 不補邊,輸出會變小;same convolution 常補零,維持大小;circular padding 則假設影像左右或上下相接。不同 padding 對 symmetry 的假設不同。台北市地圖顯然不是左右相接的環面,所以 circular padding 只是數學上乾淨,不一定語意合理。
Stride。 Stride 大於 1 時,模型不是每個 pixel 都取樣。輸入平移一個 pixel,輸出可能因為取樣格點對不齊而不是簡單平移。這在分類也許可接受,在 dense prediction 或小物件定位就可能造成問題。
Pooling and downsampling。 Pooling 會把多個位置壓成一個位置。它提供某種局部 tolerance,但也會讓 exact equivariance 變成近似性質。要做 segmentation 時,常需要 decoder、skip connection 或 upsampling 把位置資訊補回來。
這些 caveats 不是要否定 CNN,而是提醒:convolution 的 symmetry 是一個核心設計原理,但完整模型是否保留這個性質,要看整條 pipeline。
幾個容易想歪的地方
這怎麼接到論文?
LeCun et al. (1989) 早期的 convolutional network work 把局部 receptive field、weight sharing 與影像識別任務連在一起;後來的 CNN 發展把這套設計變成電腦視覺的基本工具。這篇關心的不是歷史細節,而是其中的幾何含義:CNN 的 convolution layer 把平移 symmetry 寫進了架構。
Cohen & Welling (2016) 的 Group Equivariant CNNs 則把這句話往前推一步:如果 convolution 可以對平移等變,那能不能對旋轉、反射等更大的 group 也等變?我們會在第 5 篇回到這條影像分支。
實作上,讀 CNN 或 dense prediction 論文時,可以用三個問題快速定位:
- 哪些 layer 保留 spatial equivariance?
- 哪些 operation 開始丟掉位置資訊?
- 這個任務最後需要 classification invariance,還是 pixel-aligned equivariance?
下一步:先把 pixel grid 拿掉
在繼續處理旋轉前,下一篇先換一種資料表示:如果地圖不是 pixel grid,而是建築物、路口與 GPS samples 組成的一堆點,平移 feature map 不再是第一個問題;資料列的順序才是。接著讀 如果地圖不是像素,而是一堆點?。