同一副骨架,更利的器官
每個現代區塊依舊是先混合、再轉換。但最初的零件——絕對位置編碼、LayerNorm、ReLU 前饋——每一個都被悄悄換掉了。這些替換沒有改變運算的形狀;它們改變了每一塊的品質。合起來,這就是為何用同樣資料訓練的 2024 模型,就是比 2020 模型更好。
Transformer 模块示意图:归一化、注意力、残差连接,然后是前馈网络。
RMSNorm:只留縮放
正規化層讓流經深層網路的數值不致漂移得太大或太小。RMSNorm只做能用的最少動作:算出一個 token 向量的均方根並除以它,再對每個維度乘上一個學到的增益(gain)。不減平均、無偏置。這比 LayerNorm 少一次對向量的歸約、每層少幾個參數——每個區塊很小,但乘以 80 個區塊與數兆次前向傳遞,就很實在了。
RMSNorm 做最少的事:把每个向量除以其均方根,再用可学习增益 g 重新缩放——不做减均值。
RoPE:用旋轉,不用相加
注意力對順序視而不見:打亂 token,數學還是一樣,所以必須告訴模型位置。2017 年的把戲是把一個位置編碼向量加到每個 token 上。現代的把戲是 RoPE——旋轉位置嵌入(rotary position embeddings)——在算注意力之前,依位置成比例的角度旋轉每個查詢與鍵向量。
示意图:在词嵌入向量上叠加一个位置编码向量。
美在於自然掉出來的結果:當你旋轉位置 10 的查詢與位置 7 的鍵,它們的內積只取決於差,也就是 3。於是注意力天生看的是相對距離、而非絕對索引——正是語言要的。又因為位置烤進角度裡、而非加一次的輸入,你可以拉伸旋轉頻率去處理遠長於訓練長度的序列,這是多數長上下文技巧的基礎。
# RoPE, in spirit: rotate Q and K by an angle tied to position m q_m = rotate(q, angle = m * freqs) # query at position m k_n = rotate(k, angle = n * freqs) # key at position n score = dot(q_m, k_n) # depends only on (m - n)
SwiGLU:更聰明的前饋
注意力混完 token 後,前饋網路單獨轉換每個 token——而它握著一個模型約三分之二的參數。最初用單一隱藏層配 ReLU。現代模型用 SwiGLU:一個閘控單元,有兩條並行投影,其中一條過平滑的 Swish 激活函數,再與另一條逐元素相乘。這道閘讓網路逐維度學會:要放多少訊號通過。
SwiGLU 用经过 Swish 激活的另一支对一个线性投影进行门控——三个权重矩阵取代旧的两矩阵 ReLU 前馈。
為何偏偏是這幾個替換、而非另外一百個?因為每一個都通過了在這規模下唯一重要的測試:訓練兩個只差一個零件的模型,留下 loss 較低的那個。RMSNorm、RoPE 與 SwiGLU 是在許多實驗室的這類比拼中勝出的選擇——這也是為何彼此競爭的公司,模型內部看起來如此相像。