搜尋課程與筆記

搜尋筆記

輸入主題、關鍵字或單元編號,例如 Flow Matching、U4。

    按 Esc 關閉 · ⌘ / Ctrl K 開啟搜尋

    G2.0 8 分鐘閱讀 2026年10月

    G2.0 手機轉了,同一個偵測器要怎麼一起轉?

    本篇重用1 篇

    一條道路轉過去,還是同一條道路

    G1 讓偵測器在每個位置重用相同規則。因此道路往右移,偵測結果也往右移。但如果整張地圖轉九十度,原本水平的道路變成垂直,同一個偵測器還會給出對應的答案嗎?

    想像用一把細長的尺找道路:尺可以在任何位置使用,但始終橫著放,就不會自然變成直著放的尺。平移共享解決「在哪裡」,沒有自動解決「朝哪裡」。

    我們用一個具體的 kernel 看,不把這件事只留在比喻裡。令

    kh(−1,0)=−1,kh(1,0)=1,k_h(-1,0)=-1,\qquad k_h(1,0)=1,

    其他位置都是零,則輸出是

    H(x)(u)=x(u+(1,0))−x(u−(1,0)).H(x)(u)=x(u+(1,0))-x(u-(1,0)).

    它比較左右兩邊,是水平方向的差分。把圖片轉過去後,影像裡的左右方向對應到原圖的另一個方向;它不再是在原圖上問相同問題。

    把旋轉代入 convolution

    沿用 [T(R)x](u)=x(R−1u)[T(R)x](u)=x(R^{-1}u)。普通 convolution 是 Ck(x)(u)=∑vk(v)x(u+v)C_k(x)(u)=\sum_v k(v)x(u+v),所以

    Ck(T(R)x)(u)=∑vk(v)x(R−1u+R−1v)=∑wk(Rw)x(R−1u+w).\begin{aligned} C_k(T(R)x)(u) &=\sum_v k(v)x(R^{-1}u+R^{-1}v)\\ &=\sum_w k(Rw)x(R^{-1}u+w). \end{aligned}

    第二行令 w=R−1vw=R^{-1}v;九十度旋轉讓格點一一對應,因此可以換索引。右邊現在使用的是 k(Rw)k(Rw),不是原本的 k(w)k(w)。

    相對地,先計算再只旋轉 feature map,得到

    [T(R)Ck(x)](u)=∑wk(w)x(R−1u+w).[T(R)C_k(x)](u)=\sum_w k(w)x(R^{-1}u+w).

    除非 kernel 本身對這個旋轉不變,兩條路一般不同。khk_h 就不是這種 kernel:轉過去後,它會比較另一組鄰居。

    這個反例說明的是「普通 convolution 不保證旋轉 equivariance」,不是說 CNN 永遠學不出旋轉相關的任務。它可以靠資料學出多個方向的偵測器,只是權重之間沒有被架構要求保持關係。

    我們要保留方向,還是把方向抹掉?

    一個解法是所有 kernel 都做成圓形對稱。但如果任務要知道道路朝哪裡,這樣會先消除需要的方向資訊。

    另一個比較自然的想法是:同一把尺,轉成四個方向一起用。 每個位置除了位置索引 uu,還有方向索引 r∈{0,1,2,3}r\in\{0,1,2,3\}。轉動輸入時,偵測結果不只搬位置,還要把方向 channel 一起重排。

    例如原圖「向右的道路」在新圖變成「向上的道路」,答案應轉到新的方向 channel。只旋轉每張 feature map 的位置、卻不改 channel 的意義,仍會對錯方向。

    Cohen 與 Welling [1] 的 Group Equivariant CNN 把這個想法寫成跨位置與方向的共享。我們先把這四個偵測器做出來,再檢查它們是不是照同一套規則轉動。

    同一把尺,怎麼轉成四個方向?

    前面已經知道:模型不只要偵測道路在哪裡,也要把「哪個方向」一起記住。現在先學一個 kernel kk,其他三個不另外學,直接從它旋轉而來。

    令 RrR_r 是旋轉 r×90∘r\times90^\circ 的矩陣,r=0,1,2,3r=0,1,2,3。在方向 rr 上使用

    kr(v)=k(Rr−1v).k_r(v)=k(R_r^{-1}v).

    這裡新位置 vv 的權重來自原 kernel 的 Rr−1vR_r^{-1}v;和搬動影像時的 inverse action 是同一個機制。將每個 kernel 放到同一個輸入上,

    hx(u,r)=∑vk(Rr−1v)x(u+v).h_x(u,r)=\sum_v k(R_r^{-1}v)x(u+v).

    hx(u,r)h_x(u,r) 告訴我們:在位置 uu,方向 rr 的偵測器看到多少訊號。把原本只有位置的影像,提升成「位置加方向」的 feature,這一層稱為 lifting layer。

    轉一次輸入,四個 channel 會怎麼變?

    假設把輸入轉 q×90∘q\times90^\circ,x′(u)=x(Rq−1u)x'(u)=x(R_q^{-1}u)。我們希望找出 hx′h_{x'} 和 hxh_x 的關係,而不是只說「應該跟著轉」。

    代入 definition:

    hx′(u,r)=∑vk(Rr−1v)x(Rq−1u+Rq−1v).h_{x'}(u,r) =\sum_v k(R_r^{-1}v)x(R_q^{-1}u+R_q^{-1}v).

    令 w=Rq−1vw=R_q^{-1}v,也就是 v=Rqwv=R_qw。四個平面旋轉可用角度相加,所以 Rr−1Rq=Rr−q−1R_r^{-1}R_q=R_{r-q}^{-1}:

    hx′(u,r)=∑wk(Rr−q−1w)x(Rq−1u+w)=hx(Rq−1u,r−q).\begin{aligned} h_{x'}(u,r) &=\sum_w k(R_{r-q}^{-1}w)x(R_q^{-1}u+w)\\ &=h_x(R_q^{-1}u,r-q). \end{aligned}

    方向索引以 modulo 44 計算,例如 r−q=−1r-q=-1 代表方向 33。這一式就是 feature 的 action:

    [T(q)h](u,r)=h(Rq−1u,r−q).[T(q)h](u,r)=h(R_q^{-1}u,r-q).

    位置轉過去,方向索引也移過去。 原本方向 r0r_0 的強響應,在新圖會出現在 r0+qr_0+q。這和看到一條道路從水平變垂直,是同一件事。

    為什麼它不必靠訓練學會?

    推導裡沒有用到 kk 的特殊數值。Kernel 可以還是隨機初始化,只要其他方向真的是它的旋轉版本,兩條路就一致。

    這與「四個 channel 分別學,最後碰巧長得相似」不同。共享約束直接縮小允許的參數集合,使得每一個合法 kernel 都符合 action。

    但少學四套參數,不等於只算一次。輸出仍有四個方向,記憶體與計算量都可能增加。要比較效率,至少分開報告參數量、feature 大小與實際時間;不能只看其中一項就說成本沒有變。

    補充四方向的保證,先固定角度與索引慣例

    九十度旋轉能精確重排正方格點,所以先使用 C4C_4。任意角度還有 interpolation 與裁切問題,不能把四方向的保證當成所有角度的保證。

    方向採逆時針增加;新 channel rr 讀原 channel r−qr-q,因此原本在 r0r_0 的強響應搬到 r0+qr_0+q。程式若採 clockwise 為正,kernel、空間旋轉與 channel shift 都要一起改。

    四個方向共用一個 kernel;輸入旋轉後,偵測位置與方向 channel 都依同一套 action 搬動。
    平移只搬動偵測位置;旋轉還會改變偵測方向,所以位置 action 之外還需要方向 channel 的重排。

    課堂提問

    如果四個方向各自使用獨立學到的 kernel,即使 channel 數量剛好是四,也能保證旋轉後只做 cyclic shift 嗎?

    先想一想,再展開看整理後的答案

    不能。四個 kernel 可能學到毫無關係的圖形。要保證 channel 按旋轉重排,就要讓它們是同一個 kernel 的旋轉版本,並檢查後續 layers 的共享。

    動手看一次

    切換四個旋轉角度,比較普通 channel 與共享四方向的 defect,再看強響應如何循環搬動。共享不是只旋轉位置,還要一起換方向 channel。

    快速回顧一下

    想一想普通 CNN 的共享先解決什麼?

    想一想旋轉 feature map 需要只動位置嗎?

    想一想C4 的精確保證包含 30° 嗎?

    參考文獻

    1. Cohen 與 Welling(2016),Group Equivariant Convolutional Networks