2024 年代的區塊,逐件拆解
現代 Transformer 區塊是一份小而有主見的配方:正規化、注意、加上殘差、再正規化、跑一個前饋區塊(feed-forward block)、加上殘差。兩項改良把 Llama 年代的區塊和 2017 原版區分開來。第一,正規化移到每個子層之前(前置正規化, pre-norm),並從 LayerNorm 換成 RMSNorm。第二,前饋區塊改用閘控的 SwiGLU 非線性。兩者紙上看來都小,實務上影響都大。
Transformer 区块示意图,显示归一化、注意力、残差连接和前馈子层。
記住這個預算會有幫助:在稠密 Transformer 中,前饋子層約佔三分之二的參數。注意力搶了版面,但前饋區塊才是模型大部分事實容量的所在——這也正是為什麼讓它稀疏化,是擴展時槓桿最大的做法。
RMSNorm:丟掉均值,留下尺度
第一卷的 LayerNorm 對啟動向量做兩件事:減去均值(重新置中)並除以標準差(重新縮放)。RMSNorm只保留第二件:它除以向量的均方根(root-mean-square),完全略過減均值。經驗上,重新置中對穩定性貢獻不大,因此丟掉它幾乎不損品質。
RMSNorm 仅用均方根做缩放——不减去均值,只保留可学习的增益 g。
何必如此?為了速度與簡潔。RMSNorm 運算更少,也不需要在特徵維度上做均值約簡,這在一個很深的模型裡每層要正規化兩次時就有意義。它是那種每次呼叫看起來像捨入誤差、在規模上卻累積成實打實訓練時間節省的改動——而且它已成為近乎每個近期開源 LLM 的預設。
# LayerNorm: y = g * (x - mean(x)) / std(x) + b # RMSNorm: y = g * x / sqrt(mean(x*x) + eps) # note: no mean subtraction, no bias term -> fewer ops per call
SwiGLU:閘控的前饋
經典的前饋區塊是:向上投影、套用非線性、向下投影。SwiGLU把向上投影拆成兩條路徑:一條通過平滑的 SiLU 啟動並充當閘門,另一條是數值,兩者在向下投影前逐元素相乘。閘門讓網路以乘法調變每個數值通道,而非像裸 ReLU 那樣只做門檻切斷。
ReLU、sigmoid 和 tanh 的激活曲线。
閘控多了一個矩陣,因此實作會縮小隱藏寬度(常縮到約三分之二)以維持參數量不變。即使在參數相當的條件下,SwiGLU 仍穩定地把損失改善到優於樸素區塊——這是少見的近乎純收益的升級,也是它在 Llama、Mistral 與 PaLM 系列中成為標準的原因。
稀疏專家混合:更多參數,相同浮點運算量
重頭戲在此。第一卷介紹了專家混合(mixture-of-experts)的想法;現代的實現是稀疏 MoE 區塊。把單一前饋區塊換成 N 個獨立的專家區塊外加一個小型路由器網路。對每個詞元,路由器只挑出前 k 個專家(常 k=2),且只有那些會執行。模型如今擁有 N 倍的前饋參數,但每個詞元只為其中 k 個花費計算——容量與成本就此解耦。
稀疏 MoE:softmax 路由器选出前 k 个专家并只混合它们的输出,因此总参数增长时 FLOPs 保持不变。
難處在於負載平衡。若路由器愛上少數幾個專家,其餘的就閒置,有效容量隨之崩潰,因此 MoE 訓練會加上一個輔助損失,把詞元推向均勻散佈。Switch Transformer簡化了這條脈絡,把每個詞元路由到單一專家(top-1),證明了激進的稀疏化能穩定訓練、擴展到兆級參數,同時維持每詞元計算量不變。
詞元選專家的路由只能寄望平衡、再用損失修補。專家選擇路由(expert-choice routing)把方向反過來:每個專家選取固定配額、它最想要的那些詞元。平衡成了構造本身的性質,而非靠正則化哄出來的東西——沒有詞元擠爆某個專家,也沒有專家挨餓——代價是讓某些詞元被比別的詞元更多的專家處理。