純 SGD 無法訓練 ANDREA
隨機梯度下降,起點
反向傳播為每個參數計算梯度 g。純隨機梯度下降 (SGD) 使用 p -= lr * g 更新每個參數。一個學習率,每步一個方向,無過去梯度記憶。
純 SGD 在大規模下崩潰有兩個原因:
1. 梯度在參數間具有極端不同的幅度。稀有 token 的嵌入大多數步驟收到微小的梯度;layernorm 縮放則收到很大的梯度。一個學習率無法適合兩者。
2. 梯度會振盪。 來自 16 來源語料庫的噪音小批量將參數推向左邊,然後右邊,再左邊。純 SGD 浪費步驟與自身對抗。
Adam (Kingma & Ba, 2015) 使用每個參數的兩個運行平均來修復這兩個問題。
第一矩 & 第二矩
m: 平滑方向
第一矩 m 以指數方式平均最近的梯度:
m = beta1 m + (1 - beta1) g
使用 beta1 = 0.9。經過幾個步驟後,m 攜帶平滑的方向;一個壞的批次幾乎不會改變它。
v:平滑的幅度
第二矩 v 平均最近的平方梯度:
v = beta2 v + (1 - beta2) g^2
使用 beta2 = 0.999。v 追蹤每個參數的梯度通常有多大。梯度大的參數會得到大的 v;梯度小的參數會得到小的 v。
每個參數的自適應學習率
將平滑方向除以平滑幅值的平方根,將每個參數重新縮放到可比較的基礎上:
adam_step = m / sqrt(v + eps)
微小梯度嵌入被放大;大梯度層歸一化被縮小。現在一個全域 lr 適合每個參數。
閱讀 Moments
為什麼早期步驟需要偏差校正
冷啟動偏差
m & v 從零開始。第 1 步後,m = 0.1 g_1 & v = 0.001 g_1^2。兩個估計值都遠低於長期平均值。沒有校正,優化器會謹慎起步並緩慢加速,浪費寶貴的早期步驟,當表示形成時。
校正方法
Adam 將每個估計值按 1 / (1 - beta^t) 進行縮放,其中 t 是步驟編號:
m_hat = m / (1 - beta1^t)
v_hat = v / (1 - beta2^t)
在步驟 1 時,beta1 = 0.9,除數 (1 - 0.9) = 0.1,因此 m_hat = m / 0.1 = 10 * m。偏差校正的估計值與長期平均預測相符。隨著 t 增長,beta^t 趨近於 0,校正值趨近於 1,校正後與未校正的值趨於收斂。
解耦權重衰減(AdamW 的創新)
L2 正則化 vs 權重衰減
經典 L2 正則化會在損失中加入懲罰項:L_total = L_data + (lambda / 2) sum(p^2)。反向傳播將該懲罰視為梯度的一部分:g_total = g_data + lambda p。L2 項會流經 Adam 的 m 和 v 更新,被按參數大小平滑並重新縮放。
Loshchilov & Hutter (2019) 證明了透過 Adam 平滑正則化器會同時破壞兩者。Adam 的自適應縮放會縮小大梯度參數的權重衰減(在這些地方衰減應該最強力對抗過擬合)並放大小梯度參數的衰減。
AdamW:直接應用衰減
AdamW 將權重衰減與梯度分離。衰減在參數更新期間直接應用於每個參數,從不觸及 m 或 v:
p -= lr (m_hat / (sqrt(v_hat) + eps) + weight_decay p)
現在有兩個項驅動每個步驟:
1. Adam 項: m_hat / (sqrt(v_hat) + eps) 根據每個參數的幅度歷史來重新縮放梯度方向。
2. 衰減項: weight_decay * p 將每個參數均勻地向零收縮,而不經過 Adam 的平滑處理。
ANDREA-120M v2 設定 weight_decay = 0.01。每一步,每個參數向零收縮 1%,除了 Adam 項所做的之外。
為什麼解耦很重要
實證證據
v1 崩潰(無權重衰減)
ANDREA-120M v1 使用標準 Adam 訓練 165K 步驟。取樣輸出:
- 步驟 80K:region region region region region region region
- 步驟 110K:''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
- 步驟 140K:games, games, games, games, games, games, games
- 步驟 165K:Budy Budy Budy Budy Budy Budy Budy Budy Budy
損失數字保持在合理範圍(步驟 110K 時 EMA 最低 3.23,與隨機機率 9.04 相比)。單獨看損失會隱藏重複崩潰:一個永遠記憶單一 token 的模型,在該 token 出現的每個步驟上都能達到低交叉熵。
v2 穩定性 (weight_decay = 0.01)
v2 新增 AdamW(加上梯度裁剪、LR 預熱、樣本監控)。在約 112K 步時,產生的樣本:
- 卡羅萊納虎皮鸚鵡於 1939 年被宣告滅絕(事實正確)
- 傅立葉變換將訊號分解為頻率成分(教科書定義)
- Rain's rhythmic refrain, Rivulets on the window, Respite from life's pain(俳句約束滿足)
外部評分將 v2 樣本評為 9.5/10,稱其為「在此規模下令人印象深刻的連貫性與知識保留」。
12M 模型在沒有 AdamW 的情況下存活。為什麼?
ANDREA-12M 使用純粹的 Adam 訓練而沒有崩潰。在 12M 參數規模下,權重矩陣保持足夠小,使得 Adam 的自適應縮放無法將個別權重推入導致重複的失控幅度。在 120M 規模下,權重幅度每步漂移更遠並累積;均勻衰減施加一個朝向零的恆定恢復力。隨著模型規模擴大,解耦權重衰減變得更重要。
選擇 weight_decay = 0.01
相關活動
AdamW 與本課程中的三個姊妹活動相互關聯:
- 活動 11:LR 預熱 + 餘弦衰減。 單獨的 AdamW 無法拯救模型免於在新初始化權重上的即時峰值學習率。預熱在 2000 步內逐步增加 lr,讓 AdamW 的偏差校正與權重衰減有時間穩定表示。
- 活動 12:梯度裁剪。 AdamW 假設梯度具有有界幅度。ANDREA 的 bandit 中來源每 7 到 42 步轉換一次,會產生偶爾的梯度尖峰;裁剪在 AdamW 觸及 m、v 或 p 之前,將其上限設為 L2 範數 1.0。
- 活動 13:FP32 / FP16 / FP8 精度。 AdamW 為每個參數儲存 m 和 v,使記憶體佔用量加倍權重本身。FP16 將其減半;FP8 再減半。精度選擇與優化器穩定性互動。
AdamW、warmup、clipping 和 precision 組成一個四葉草。掉一片葉子,看 ANDREA 崩潰。