English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

純 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.999v 追蹤每個參數的梯度通常有多大。梯度大的參數會得到大的 v;梯度小的參數會得到小的 v


每個參數的自適應學習率

將平滑方向除以平滑幅值的平方根,將每個參數重新縮放到可比較的基礎上:


adam_step = m / sqrt(v + eps)


微小梯度嵌入被放大;大梯度層歸一化被縮小。現在一個全域 lr 適合每個參數。

閱讀 Moments

兩個參數在本步獲得相同的梯度 `g = 0.1`。參數 A 累積了 `v = 0.0001` 經過多步;參數 B 有 `v = 1.0`。使用 `adam_step = g / sqrt(v + eps)`,哪個參數在本步收到更大的更新,& Adam 為什麼想要這樣?

為什麼早期步驟需要偏差校正

冷啟動偏差

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 的 mv 更新,被按參數大小平滑並重新縮放。


Loshchilov & Hutter (2019) 證明了透過 Adam 平滑正則化器會同時破壞兩者。Adam 的自適應縮放會縮小大梯度參數的權重衰減(在這些地方衰減應該最強力對抗過擬合)並放大小梯度參數的衰減。


AdamW:直接應用衰減

AdamW 將權重衰減與梯度分離。衰減在參數更新期間直接應用於每個參數,從不觸及 mv


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 項所做的之外。


AdamW Optimizer Step

為什麼解耦很重要

ANDREA-120M v1 使用了標準 Adam(無權重衰減),在第 110K 步驟崩潰進入重複循環。v2 使用了 AdamW 搭配 `weight_decay = 0.01`,產生了連貫的多段落文字。解釋 (a) AdamW 中新增了標準 Adam 缺少的特定項是什麼,以及 (b) 為什麼將該項**放在梯度內部**(經典 L2)會比 AdamW 的**解耦放置在外部**更差。

實證證據

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

為什麼 `weight_decay = 0.01` 對 120M 參數模型有效,但 100 倍更大的值 (`weight_decay = 1.0`) 會摧毀訓練?針對更新規則 `p -= lr * (adam_term + weight_decay * p)` 進行推理。選擇一個代表性的 `p`,代入 `weight_decay = 1.0` 進行單一步驟,並描述幾步後 `p` 會發生什麼。

相關活動

AdamW 與本課程中的三個姊妹活動相互關聯:


- 活動 11:LR 預熱 + 餘弦衰減。 單獨的 AdamW 無法拯救模型免於在新初始化權重上的即時峰值學習率。預熱在 2000 步內逐步增加 lr,讓 AdamW 的偏差校正與權重衰減有時間穩定表示。

- 活動 12:梯度裁剪。 AdamW 假設梯度具有有界幅度。ANDREA 的 bandit 中來源每 7 到 42 步轉換一次,會產生偶爾的梯度尖峰;裁剪在 AdamW 觸及 mvp 之前,將其上限設為 L2 範數 1.0。

- 活動 13:FP32 / FP16 / FP8 精度。 AdamW 為每個參數儲存 mv,使記憶體佔用量加倍權重本身。FP16 將其減半;FP8 再減半。精度選擇與優化器穩定性互動。


AdamW、warmup、clipping 和 precision 組成一個四葉草。掉一片葉子,看 ANDREA 崩潰。

優化器反思

選擇一個 ANDREA-120M v1 樣本(例如 `region region region region`)並描述 AdamW 的 `weight_decay * p` 項,從步驟 0 開始每步應用,將如何防止該特定失敗模式。一段話。