搜尋課程與筆記

搜尋筆記

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

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

    L4.4 18 分鐘閱讀 2026年10月

    L4.4 要看哪裡,能不能由內容決定,而不是由位置決定?

    鄰居是誰,可以事後才知道嗎

    前幾篇用局部運算傳遞資訊。但讀「小明把書交給小華,因為他明天要用」時,理解「他」要參考前面的名字與語意,不一定只看旁邊幾個字。能不能先看內容,再決定要參考誰? 卷積的支援範圍由位置預先決定,attention 則直接學內容間的配對。

    對影像,這個決定大致是對的——相鄰的像素通常屬於同一個東西。但很多問題不是這樣:

    • 「它」這個代名詞指的是哪個名詞?可能在三個字之前,也可能在三十個字之前。
    • 這個像素屬於哪個物件?和它同色、同紋理的像素可能離它很遠。
    • 這個分子裡的兩個原子會不會交互作用?取決於它們的種類,不是它們在序列裡的編號。

    這些問題有一個共同的形狀:要看哪裡,必須先看過內容才知道。而一個事先畫好的鄰域,在定義上做不到這件事。

    卷積的鄰域是寫程式的時候就畫好的,
    可是「該看哪裡」常常要看過內容才知道——
    能不能讓模型自己決定要看誰?

    課堂提問Q1

    造一個「由內容決定要看誰」的層。要求三件事:一,每個位置的輸出是所有位置的加權平均;二,權重由內容決定;三,權重非負且和為一(這樣輸出才和輸入在同一個尺度上)。寫出來之後,檢查它保留了什麼、丟掉了什麼。

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

    Vaswani 等人 [1] 使用 scaled dot-product attention 實現這些要求;它是一種選擇,不是唯一被要求逼出的公式。

    要「權重由內容決定」,就要有一個函數把一對位置 (i,j)(i,j) 的內容映到一個分數。最省的做法是先各自做一次線性投影,再取內積:

    sij=(xiWQ)⋅(xjWK)d.s_{ij}=\frac{(x_iW_Q)\cdot(x_jW_K)}{\sqrt d}.

    兩個投影不共用權重,因為「我在找什麼」(query)和「我提供什麼」(key)是兩個不同的角色。分母那個 d\sqrt d 是本篇第三節的主題。

    要「非負且和為一」,就用 softmax:aij=softmaxj(sij)a_{ij}=\mathrm{softmax}_j(s_{ij})。

    最後,被平均的東西不必是 xjx_j 本身——再做一次投影,讓「拿來比對的內容」和「拿來傳遞的內容」分開:

    outi=∑jaij (xjWV).\mathrm{out}_i=\sum_j a_{ij}\,(x_jW_V).

    三個投影、一個內積、一個 softmax,就是自注意力的全部。

    保留了什麼。 每個位置都保留一個輸出,所以位置的數量和對應關係還在——它是一個序列到序列的映射,可以一層層疊。

    丟掉了什麼——而這是這一篇的重點。 式子裡的每一個東西都只依賴 xix_i 和 xjx_j 的內容,沒有任何地方用到 ii 和 jj 這兩個數字。所以如果把所有 token 重新排列,每一個 sijs_{ij}、每一個 aija_{ij} 都只是跟著換編號,輸出也只是跟著換編號:

    Attn(Px)=P Attn(x)對任何置換 P.\mathrm{Attn}(Px)=P\,\mathrm{Attn}(x)\quad\text{對任何置換 }P.

    這叫置換等變,而它比 同一個東西換個位置出現,要怎麼讓模型知道那還是同一個東西? 的平移等變強得多——平移是置換的一個很小的子集。

    這個證明針對沒有位置資訊、沒有固定位置 mask 的完整自注意力。等變是輸出跟著換編號,不是輸出完全不變;再接對稱 pooling 才得到集合函數。causal mask、位置編碼或相對位置項會改變這個對稱性。

    它對位置真的一無所知

    先確認那個對稱性不是「大致成立」。取一個隨機初始化的自注意力層,把 token 的順序用一個固定的排列打亂:

      max |Attn(打亂 x) - 打亂 Attn(x)| = 6.661e-16
      參考:輸出本身的量級 max|Attn(x)| = 3.3553

    10−1610^{-16} 是浮點數的解析度,也就是精確為零。 和 同一個東西換個位置出現,要怎麼讓模型知道那還是同一個東西? 那個 0.000e+000.000\mathrm{e}{+}00 一樣,這是結構性質而不是學出來的近似。

    接一個平均池化之後,等變變成不變:

      max |y(打亂 x) - y(x)| = 1.665e-16

    所以一個不加位置資訊的注意力模型,計算出來的一定是輸入的一個「集合函數」——它看得到有哪些 token,看不到它們的順序。

    這值多少錢? 造一個必須知道順序的任務:L=8L=8 個 token,每個是一個 1616 維的隨機向量,標籤是「第 0 個位置的 token 的第 0 維是正還是負」。模型是一個學出來的 query 對這 88 個 token 做一次注意力池化,再接一個線性輸出。

    先算一個可達到的基準:用平均值的符號預測,Gaussian 下正確率為 12+1πarcsin⁡(1/8)=0.6150\tfrac12+\tfrac1\pi\arcsin(1/\sqrt8)=0.6150。這不是所有集合函數的上限。

    若只能看到多重集,原本第 0 個 token 等可能是其中任何一個。令 rr 是正值的個數,條件正標籤機率就是 r/8r/8;最佳分類選多數符號。因此 r∼Binomial⁡(8,1/2)r\sim\operatorname{Binomial}(8,1/2) 時,最佳正確率為

    E[max⁡(r,8−r)8]=1256∑r=08(8r)max⁡(r,8−r)8=0.63671875.\mathbb E\left[\frac{\max(r,8-r)}8\right] =\frac1{256}\sum_{r=0}^{8}\binom8r\frac{\max(r,8-r)}8 =0.63671875.
      平均值符號的基準                             0.6150
      此 iid 任務的置換不變 Bayes 上限              0.6367
    
      無位置編碼            訓練 0.640   測試 0.580
      正弦位置編碼 ×1        訓練 0.698   測試 0.671
      正弦位置編碼 ×3        訓練 0.927   測試 0.932

    無位置資訊的模型仍低於 Bayes 上限,不能說它已把所有能做的事都做完。有限測試準確率也會上下波動,上限限制的是母體正確率。

    第三列是加了位置編碼之後:0.9320.932。同一個架構、同一份資料、同一個訓練預算,差別只在輸入上加了一組和位置有關的常數向量。

    而第二列是這張表最實用的一行。 標準的正弦編碼直接加上去,只到 0.6710.671——比沒有好,但離 0.9320.932 還很遠。把同一組編碼乘以三倍才真的有用。

    理由是信噪比:注意力的 logit 是 (xi+pi)WQ⋅(xj+pj)WK(x_i+p_i)W_Q\cdot(x_j+p_j)W_K,裡面同時有位置的成分和內容的成分。內容是 N(0,1)\mathcal N(0,1) 的隨機向量,位置編碼的每個分量在 [−1,1][-1,1] 之間——兩者量級相當,於是位置訊號被內容的噪聲蓋掉。放大三倍之後它才壓得過。

    位置編碼不是「加上去就有」,它要大聲到能在 logit 裡被聽見。

    這件事在 同一台機器要依指令做不同的事,指令從哪裡餵進去? 已經以另一個形式出現過:一個純量 tt 直接當成輸入的一維時,網路學不好(0.00180.0018 對正弦嵌入的 0.00040.0004)。兩次都是同一個教訓——要讓網路用到某個訊息,光是「有把它放進去」不夠,還要讓它在那一層的運算裡有足夠的份量。

    打亂順序,注意力毫無感覺

    圖說: 完整、無位置 mask 的 attention 對置換等變;編碼方式與尺度如何影響訓練,需另用實驗比較。

    那個 1/d1/\sqrt d 在防什麼

    Q1 的式子裡有一個沒有解釋的分母。它看起來像一個美觀問題,實際上是一個會讓訓練整個停住的東西。

    qq 和 kk 是 dd 維的向量。如果它們的分量大致獨立、大致是 N(0,1)\mathcal N(0,1),那麼 q⋅kq\cdot k 是 dd 個獨立項的和,標準差是 d\sqrt d。維度越高,logit 的散佈越大,而 softmax 對輸入的散佈極度敏感。

    實測(每個 query 對 1616 個 key,均勻分布的熵是 ln⁡16=2.7726\ln 16=2.7726 nats):

      d=   4  不縮放   logit 標準差  1.779   注意力熵 1.8090   最大權重 0.4222
      d=   4  除以 √d  logit 標準差  0.889   注意力熵 2.4237   最大權重 0.2298
      d=  16  不縮放   logit 標準差  4.101   注意力熵 0.8689   最大權重 0.6956
      d=  16  除以 √d  logit 標準差  1.025   注意力熵 2.3428   最大權重 0.2483
      d=  64  不縮放   logit 標準差  7.759   注意力熵 0.4317   最大權重 0.8367
      d=  64  除以 √d  logit 標準差  0.970   注意力熵 2.3808   最大權重 0.2373
      d= 256  不縮放   logit 標準差 15.789   注意力熵 0.2051   最大權重 0.9177
      d= 256  除以 √d  logit 標準差  0.987   注意力熵 2.3692   最大權重 0.2426
      d=1024  不縮放   logit 標準差 32.126   注意力熵 0.0886   最大權重 0.9639
      d=1024  除以 √d  logit 標準差  1.004   注意力熵 2.3571   最大權重 0.2453

    不縮放的那幾列,logit 標準差就是 d\sqrt d(4.101≈44.101\approx4、7.759≈87.759\approx8、15.789≈1615.789\approx16、32.126≈3232.126\approx32)。而後果是注意力塌掉:d=1024d=1024 時熵只剩 0.08860.0886 nats(均勻是 2.77262.7726),最大權重 0.96390.9639——在隨機初始化時,每個 query 就已經幾乎只看一個 key 了。

    softmax 的 Jacobian 是 diag⁡(a)−aa⊤\operatorname{diag}(a)-aa^\top。接近 one-hot 時,這個 Jacobian 很小,透過權重分配傳回的梯度可能變弱;但有限 logit 不是精確零梯度,也不能保證整個模型永遠卡住。縮放是為了減少初始化時過度集中的風險。

    除以 d\sqrt d 之後,右邊三欄在五個數量級的 dd 上幾乎不動(標準差 0.8890.889–1.0251.025、熵 2.342.34–2.422.42、最大權重 0.230.23–0.250.25)。這正是一個好的縮放該有的樣子:它讓一個設計選擇(維度)不再影響另一個東西(初始的注意力有多集中)。

    補充這也解釋了多頭為什麼要把維度切開

    多頭注意力把 dd 維切成 hh 個 d/hd/h 維的頭,各自做一次注意力再串接。常見的解釋是「不同的頭可以關注不同的東西」,那是對的但不完整。

    多個頭各自學 Q、K、V,容許同時使用不同配對模式;較小維度是否更容易訓練,不能單靠隨機 logit 表證明。

    固定總維度時,點積與 value 聚合的主要乘加量約相同,但通常有 hh 張 L×LL\times L 權重矩陣;softmax、儲存與實作開銷並沒有免費消失。不同頭也不保證一定學到不同功能。

    要注意的是這三個理由都不保證「不同的頭真的學到不同的東西」。實務上有相當比例的頭是冗餘的,而那是另一個獨立的觀察。

    代價:長度的二次式

    注意力買到的是路徑長度。任意兩個位置在一層之內就互相看得到,不管它們相隔多遠。對照 一張圖裡同時有紋理、物件和整個場景,一個固定大小的核怎麼辦? 那張接受域的表:

      要讓相隔 d 個位置互相影響:
        d =   16    卷積(K=5) 需要    4 層     自注意力 1 層
        d =   64    卷積(K=5) 需要   16 層     自注意力 1 層
        d =  256    卷積(K=5) 需要   64 層     自注意力 1 層
        d = 1024    卷積(K=5) 需要  256 層     自注意力 1 層

    (降取樣可以把左欄降到對數,代價是 一張圖裡同時有紋理、物件和整個場景,一個固定大小的核怎麼辦? 量過的高頻損失。)

    而賣掉的是計算量。 注意力要算出 L×LL\times L 個分數,所以它的成本是長度的二次式。實測(單頭、d=64d=64、batch =4=4):

      L =   64     0.88 ms     相對 1.0     (純 L² 的預測 1.0)
      L =  128     2.34 ms     相對 2.6     (4.0)
      L =  256     7.36 ms     相對 8.3     (16.0)
      L =  512    33.29 ms     相對 37.6    (64.0)
      L = 1024   105.15 ms     相對 118.8   (256.0)
      L = 2048   348.42 ms     相對 393.8   (1024.0)

    每把長度加倍,時間大約乘以 3.33.3 倍(純線性是 22 倍,純二次是 44 倍)。落在中間是因為有兩項成本:三個投影是 L⋅d2L\cdot d^2,注意力本身是 L2⋅dL^2\cdot d。在 L≈dL\approx d 附近兩者相當,LL 再大時二次項才主導——這也是為什麼「注意力太貴」這個問題在短序列上根本感覺不到,而在長序列上會突然變成唯一的瓶頸。

    這條曲線決定了很多架構決定。 為什麼影像要先切成 16×1616\times16 的 patch 再送進 Transformer?因為 224×224=50176224\times224=50176 個像素的注意力矩陣有 2.5×1092.5\times10^9 個元素,而切成 patch 之後 L=196L=196。切 patch 不是一個細節,它是讓這條曲線落在可負擔的區間裡的必要條件。

    卷積用層數換距離,注意力用計算量換距離;哪一個划算,完全取決於你的 LL 和你需要的距離。

    內容決定看誰,位置另外餵

    互動 demo:按「打亂順序」看置換等變誤差停在 10⁻¹⁶;關掉 1/√d 再把 d 拉大,熵一路掉向 0。

    它其實是這個 class 裡假設最少的架構

    把 L4 的四個架構按「宣告了多少關於資料的事」排一次:

    架構宣告
    卷積有用的模式是局部的;一個模式在哪裡出現都算數
    U-Net以上,加上「資料有多個尺度,而細節要能繞過瓶頸」
    自注意力位置完全不重要(然後被位置編碼部分撤回)
    MLP沒有任何關於輸入座標的宣告

    強的對稱性其實是更多限制:對所有置換等變的函數,必須同時對其中的平移等變,反過來不成立。但 attention 的全域連接又不同於局部卷積;不能只依對稱性替完整架構排一條表達能力大小的順序。

    補充Attention 怎麼放進 Transformer?

    一個 block 還有逐 token 的前饋網路、殘差與正規化。attention 交換位置間的資訊,前饋網路做共享的非線性轉換,殘差與正規化影響資訊與梯度如何通過多層。它們功能不同,不能把整個 Transformer 當成一次加權平均。

    而 什麼都能擬合,那為什麼還需要別的架構? 已經說過這件事的另一面:在有限資料下,沒有偏置不是中性,是缺點。 候選函數越多,資料越難把它們分開,所以這正是 背考古題的學生:過擬合與欠擬合 那條 U 形右半邊的來源。

    這解釋了一個常見的觀察:在中小規模的影像資料上,卷積網路通常勝過純 Transformer;資料規模夠大之後,順序才反過來。這不是誰「比較先進」的問題,它就是 bias–variance 換一個外衣——卷積用一個(大致正確的)假設換掉一部分需要用資料去學的東西,而那個交換在資料少的時候划算、在資料多的時候變成束縛。

    這一切依賴什麼。

    一,位置資訊要被真的餵進去而且夠大聲。第二節那個 0.6710.671 對 0.9320.932 就是「餵了但不夠大聲」的樣子,而這在自己的專案上是可以量的:把位置編碼的強度掃一遍,看指標有沒有平台。

    二,LL 要在可負擔的範圍。第四節那條曲線是硬的;超過之後所有的變通(切 patch、稀疏注意力、線性近似)都在恢復某種局部性——也就是把卷積放棄掉的那個假設部分地加回來。

    三,資料量要對得起這個假設空間的大小。這一點沒有捷徑,而 該收資料、換模型,還是多訓幾輪:學習曲線 那條曲線是判斷它的工具:如果學習曲線還在陡降,加資料比換架構有用;如果已經平了,換一個假設更強的架構才是對的方向。

    檢查理解

    想一想

    沒有位置編碼時,測試準確率是 0.5800.580。關於前面兩個理論基準,哪個理解正確?

    想一想

    第三節的表裡,d=1024d=1024 不縮放時注意力熵是 0.08860.0886 nats、最大權重 0.96390.9639。這在訓練上的後果是:

    想一想

    第四節的實測中,LL 從 6464 加倍到 20482048,時間的倍數是 1.0/2.6/8.3/37.6/118.8/393.81.0/2.6/8.3/37.6/118.8/393.8,而純 L2L^2 的預測是 1/4/16/64/256/10241/4/16/64/256/1024。最準確的解讀是:

    想一想

    下列哪一句不對?

    參考文獻

    1. Vaswani, A. et al. Attention Is All You Need. NeurIPS 2017.(自注意力、多頭、1/d1/\sqrt d 縮放與正弦位置編碼的出處。)
    2. Dosovitskiy, A. et al. An Image is Worth 16x16 Words. ICLR 2021.(把影像切成 patch 的理由,以及「資料量夠大之前卷積的歸納偏置仍然划算」的實證。)
    3. Tay, Y., Dehghani, M., Bahri, D. & Metzler, D. Efficient Transformers: A Survey. ACM Computing Surveys 55(6), 2022.(各種降低 L2L^2 成本的做法,以及它們各自恢復了哪一種局部性。)