Reactive Optimizers:在訓練過程中即時改寫最佳化器原始碼
Reactive Optimizers: rewrite the optimizer's source code during training
Reactive Optimizers 以代理在訓練過程中即時改寫最佳化器原始碼,並在多個任務上達到或超越傳統靜態最佳化器。
- 零樣本自適應:不需要先前的超引數搜尋,直接在單次訓練中自動調整學習率、最佳化器型別與精度。
本文展示了利用代理在訓練過程中即時改寫最佳化器的可行性,並在多個任務上達到或超越傳統靜態最佳化器,提供一種零樣本自適應最佳化方法。
Xingjian Bai, Jia-Hao Liang, Jayden Teoh, Vincent Sitzmann
2026年10月
TL;DR 我們將一個代理放在最佳化器的核心。它觀察訓練動態,對其做出反應,並在訓練進行時重寫最佳化器的原始碼。當沒有針對某任務調整過配方時,它能匹配或超越市面上最佳配方,涵蓋影像與語言任務。更進一步,我們示範它能自動產生複雜的時間表與精細策略,以防止損失尖峰並避免過擬合。請在自己的訓練跑中嘗試 OPAL package。
X 帖子: x.com/SimulatedAnneal/status/2112936831398375800
靜態最佳化器步驟 0
反應式最佳化器步驟 0
LightningDiT-XL/1 於 ImageNet 上
今日,最佳化深度神經網路的配方通常在訓練開始前就已完全決定。人類在如何進行訓練方面投入了大量創意:自適應步長 [1]、預條件化 [2, 3]、正交化更新 [4, 5]、與訓練步驟相關的時間表 [6, 7],以及隨模型大小調整的學習率 [8]。自動發現 [9, 10, 11, 12] 在多次跑動中搜尋更佳的最佳化器。無論是手工設計還是自動發現,最佳化器在整個訓練過程中保持不變,若有調整也僅根據事先寫好的規則進行。這種範圍留下了以下未解之問:最佳化器如何對突發的損失尖峰或停滯做出回應?如果一個模組的梯度開始振盪,而其他模組仍然平滑改進,該怎麼辦?當一種新型架構在 Adam 或 Muon 下訓練效果差,究竟是架構本身較差,還是尚未遇到合適的最佳化器?
在此貼文中,我們試圖擴充套件傳統最佳化器的範圍,使其對訓練本身具有反應性,從而在單次訓練跑中產生不斷自適應的最佳化器。這種反應式最佳化器即時推理並為每個引數組寫出權重更新規則。直接編寫最佳化程式碼,它擁有實現複雜時間表、對訓練事故做出反應,以及為其所在的單次訓練情節定製最佳化器的自由。基於先前在訓練期間調整最佳化器的嘗試 [12, 13, 14] 與讓模型自行指導微調 [15],此反應式最佳化器完全零射擊,未從重複跑動中學習或保留任何東西,並將整個最佳化器演算法交由重寫。
我們從一個實務情境開始,涵蓋影像生成與語言模型的任務,在這些任務中,反應式最佳化器能比靜態最佳化器表現得更好。接著我們探討反應式最佳化器的新興特性,包括精細的排程、抑制損失尖峰以及避免過擬合。最後,我們討論其成本以及在大規模部署時的實用性。我們預期反應式最佳化器隨著每一代代理的迭代會變得更強,並且在目前尚無既成配方的情境(例如新架構或新資料集)中最為有用,並且是解決深度學習最佳化難題的一步。
目錄
1. 未使用既成配方的訓練
假設一位博士生有一個新想法:自設計的模型,或用於訓練 Transformer 的新資料集。他們只有一天的 GPU 時間和有限的 LLM API 令牌,只能進行一次嚴肅的訓練。學生該怎麼做?最明顯的做法是挑選最標準的訓練配方,或是最近論文中的配方,並接受它可能不適合自己情境、損失波動或停滯等問題。
底層問題更廣泛:在受限於 GPU 時間、研究者時間或實際時鐘時間的情況下,如何在不知道最佳最佳化配方的前提下,將深度學習模型訓練到最佳效能? 新架構、多模態、語言以及科學資料皆屬於此情境,且很少人能在大規模上進行引數掃描。
反應式最佳化器提供另一種使用預算的方式:它以 LLM 令牌代替 GPU/人工工時。透過最佳化器對訓練事件做出反應並自行調整,能大幅減少配方調校的負擔。
結果概覽
我們從 modded-nanogpt 的最佳化軌道(Track 3)開始 [16],這是一個語言模型預訓練任務(在 FineWeb 上訓練 162M GPT),有許多專門為此設定調整的配方。從這個任務,我們建立了兩個略有不同的自然設定: (1) 同一模型在另一語言資料集上訓練(我們選擇中文、泰文和吉爾吉斯文),以及 (2) 原始設定但批次大小減少到四分之一。兩者都沒有針對該設定的配方,因此我們將反應式最佳化器與如果想一次性完成新訓練時可用的自然選項進行比較:採用五個排行榜配方並進行自然調整。在所有這些新設定中,反應式最佳化器的表現超過或與最佳基線相當(Figure 1)。
我們亦將反應式最佳化器直接應用於 Goldfish [17],該系統提出一個包含 350 種語言的資料集,並為每個資料集訓練一個小型 GPT,使用的標準配方並未針對每種語言調整。這使其成為測試最佳化器一次性適應性的理想場景。在 Amharic 資料集上,官方配方在保留的 FLORES‑200 文本上每句 83.48 bits(越低越好);反應式最佳化器以相同配方初始化,單次訓練即可達到 81.11(在 Swahili 上,我們也得到類似的提升)。對標準配方進行學習率掃描可找到一個靜態配方,其結果比反應式最佳化器更好,達 80.89;但以該掃描配方初始化的反應式最佳化器再次領先,達 80.73。
我們亦嘗試將反應式最佳化器應用於影像生成,這是文獻中通常不會掃描最佳化超引數的方向,因為擴散模型設計與最佳化器設計被視為大多相互獨立1。在 LightningDiT‑XL/1 上,它的表現優於官方配方([18];FID‑50K 1.83 對 2.18(帶引導),4.33 對 5.15(不帶引導)),官方配方使用 AdamW;以及在 RAEv2‑B 上(3.19 對 3.39),其配方使用 Muon 變體。
圖 1 顯示這些實驗,每個都以 Claude Opus 5.5 為代理提供動力;我們將反應式最佳化器命名為 OPAL(OPtimizer with an Agent in the Loop)。綜合這些結果表明,在一次性設定下,反應式最佳化器能比遵循預定配方得到更佳解。
modded-nanogpt Track 3
| 任務 | modded-nanogpt 最佳化賽道(Track 3)的 162M GPT,所有設定下的實驗相同:官方 NanoGPT、賽道自有 (FineWeb,官方每次更新 524,288 個 token 的批次);NanoGPT,¼ 批次 (FineWeb,13,000 次更新,每次 131,072 tokens);NanoGPT 在中文、泰文和吉爾吉斯語(1 GB Goldfish 中文、泰文和吉爾吉斯語集,3,000 次更新,每次 524,288 tokens)。 |
|---|---|
| 指標 | 官方 NanoGPT:首次驗證損失達到 3.28,即賽道目標(每 25 次更新驗證一次);¼ 批次:13,000 次更新後的驗證損失;中文、泰文和吉爾吉斯語:3,000 次更新後的驗證損失,#46 及 #36 的 OPAL 以 #46 自己的讀出(最近更新權重的移動平均)為基準,其他紀錄則使用最後一次權重;在中文和泰文中,OPAL 的長條為三次實驗的平均值。損失長條以 c 為起點,c 為距設定最低值至少 0.05 以下、且為 0.1 的最大倍數:3.2(¼ 批次)、4.0(中文)、4.5(泰文)和 3.7(吉爾吉斯語)。 |
| 基準 | 排行榜中的五個紀錄:#46、#30、#21(Shampoo)、#36(調校後的 Muon 基準)以及 #36 的 OPAL。排行榜顯示 #46、#30、#21 和 #36 分別進行了 2,690、2,930、4,100 和 3,250 次更新;#2 在官方 NanoGPT 中的長條對應排行榜的 5,625:我們自己的 #2 實驗在 5,625 次更新後結束,損失為 3.28449,未達到 3.28;在 ¼ 批次下,每個紀錄都以所有學習率 ×¼ 執行。 |
Goldfish, Amharic
| 任務 | 一個 125M GPT 從頭開始在 1 GB Amharic(Goldfish)資料上訓練,10 個 epoch(64,626 次更新) |
|---|---|
| 指標 | FLORES-200(dev + devtest)上的 bits/句 |
| 基準 | the official Goldfish recipe (AdamW, learning rate 1e-4, weight decay 0.01, 10% warmup, then linear decay; gradient clipping at 1.0); nine more static recipes, each for all 10 epochs: AdamW at learning rates 6e-4, 1e-3, 2e-3 and 4e-3 with weight decay 0.1 (a four-value sweep), AdamW at 3e-4 with weight decay 0.1 or 0.01 and at 1e-4 with weight decay 0.1, and Muon on the hidden block matrices in the official recipe and at learning rate 3e-4, weight decay 0.1. OPAL ran twice: from the official recipe (at its defaults, 50 decisions; shown by default) and from the sweep's best point, AdamW at learning rate 2e-3 (200 decisions; shown with the sweep) |
LightningDiT-XL/1
| Task | image generation on ImageNet 256×256 in a VA-VAE latent space; LightningDiT-XL/1, 64 epochs |
|---|---|
| Metric | FID-50K at the end, with and without guidance; the curve shows FID-10K during training |
| Baseline | the official recipe, retrained by us, and the authors' released checkpoint (FID-50K 5.23 without guidance, 2.16 with) |
RAEv2-B
| Task | image generation on ImageNet 256×256 in a representation-autoencoder latent space; RAEv2-B, 20 epochs |
|---|---|
| Metric | FID-50K |
| Baseline | the official recipe, which already trains with GMuon, a Muon variant |
Figure 1. OPAL (OPtimizer with an Agent in the Loop), our reactive optimizer, across different settings. In most settings where optimization hyperparameters are not heavily tuned for, reactive optimizers improve the training loss and test performance upon the canonical choices. In modded-nanogpt, #2 is AdamW, #21 is Shampoo, #36 is a tuned Muon, and #30 and #46 are more elaborate Muon-based recipes.
Beyond the practical benefit, we are intrigued by the spontaneous decisions made by the zero-shot agent, after observing and analyzing the training dynamics in its own way. In the next two sections, we explore what the reactive optimizer chooses to watch and what it changes in response.
1 For example, the standard recipes of DiT and SiT [19] train with AdamW at one constant learning rate. That has begun to change, with Muon and its variants taken up for diffusion transformers (CMuon [20]; Li et al. [21]; RAEv2's GMuon [22]) and a recent controlled benchmark of optimizers for diffusion models [23].
2. Updating with spontaneous analysis
Figure 2 shows how an agent updates the optimizer code on the fly. Concretely, we allow the agent to rewrite a file, updater.py, used in every step of optimization. We use code as the entire interface since this allows the agent to easily alter any part of the optimization. Yet, before the agent can make changes, it must observe, on its own, how training is progressing, leading to the second program it can rewrite, analysis.py.
代理應該使用哪些資訊來做決策?原始訓練狀態不實用:權重、啟用值和梯度會淹沒其上下文。相反地,訓練動態的統計與幾何可能對決策有幫助,例如每個引數組的梯度範數、更新量相對於其變更權重的大小、連續梯度之間的餘弦相似度,以及哪些張量表現出異常大的梯度尖峰。因此,像對於最佳化器一樣,我們給予代理最大的自由:它寫一個程式,analysis.py,從訓練動態中擷取它想知道的一切。它自寫的探測器在整個訓練過程中執行,從訓練狀態中取得代理所要求的資訊並交給代理作為下一步決策。
我們完成了雙向迴圈。透過analysis.py,訓練以代理選擇的任何形式傳遞給代理;透過updater.py,代理的決策影響到訓練的每一步。這兩個程式允許代理在過程中以最大靈活性設計新的最佳化演算法。
3. 在最佳化過程中動態改變的是什麼?
在本節中,我們觀察反應式最佳化器在整個訓練過程中的行為,並檢視這些結果背後的決策。作為總結,圖 3 顯示了每個代理何時、如何以及為何編輯其程式碼。
拖曳至紅色勾選以檢視代理在那裡改變了什麼以及原因。
All decisions that changed a program| Step | File | What changed | Tags |
|---|---|---|---|
| 800 | updater.py + analysis.py | 將注意力與 MLP 權重移至 Muon,196 個矩陣在融合張量拆分後,每一步匹配其 AdamW 大小;將 adaLN 及其餘保持在 AdamW;計畫從 60K 開始的餘弦冷卻。 | 區塊特定 時間步特定 |
| 1,600 | updater.py + analysis.py | 將 Muon 的步長在 1,600–2,000 次更新期間提升至匹配大小的 1.25 倍;新增一個保護機制,當梯度範數超過其平均值的 3 倍時降低步長速率。 | 觀察來源 時間步特定 |
| 2,400 | updater.py + analysis.py | 修正報告錯誤;按矩陣型別和深度拆分其梯度–動量餘弦,並為 AdamW 張量加入此項。 | 僅分析 修正或還原 |
| 3,200 | updater.py | 新增一個控制器,每 100 次更新將每個 AdamW 張量的速率乘以 0.9,當其梯度與動量相反時(降至 0.2) | 小眾實踐 區塊特定 觀察來源 |
| 4,000 | updater.py | 移除該控制器;將 adaLN 權重移至 Muon,每個拆分為六個 1152×1152 片段 | 修正或還原 小眾實踐 區塊特定 觀察來源 |
| 4,800 | updater.py | 將 Muon 的步長在 4,800–5,600 次更新期間提升至注意力與 MLP 匹配大小的 1.5 倍、adaLN 的 1.25 倍 | 區塊特定 觀察來源 時間步特定 |
| 6,400 | updater.py | 將另外三個矩陣移至 Muon:時間步嵌入器的第二層以及最後的 adaLN 的 shift 與 scale | 區塊特定 觀察來源 |
| 13,600 | updater.py | 將原計畫的冷卻改為 54K 到 76K 的 1−√ 下降,至 0.03 倍(原本是 60K 的餘弦冷卻) | 時間步特定 |
| 16,000 | analysis.py | 新增每個張量在區塊外的梯度範數與尖峰日誌;從未應用(其答案到達主機太晚) | 僅分析 觀察來源 |
| 16,800 | analysis.py | 再次撰寫相同的診斷;同樣未應用 | 僅分析 觀察來源 |
| 17,600 | analysis.py | 第三次撰寫它們;這些已執行 | 僅分析 觀察來源 |
| 18,400 | updater.py + analysis.py | 將 spike guard 忽略 timestep embedder 的第一層,其噪聲梯度導致了幾乎所有的裁剪 | 修正或還原 區塊特定 觀察來源 |
| 39,200 | updater.py | 將冷卻開始從 54K 移動到 50K,因為以恆定速率進展幾乎已停止 | 觀察來源 時間步特定 |
小眾實踐區塊特定觀察來源時間步特定修正或還原僅分析
本節其餘部分將逐類檢視這些適應。
3.1 學習率排程
手工設計
DeepSeek-V3
- 學習率
- 一個新階段
來自論文的第 4.2 節 [24].
由 OPAL 設定
SiT-B/2
- 區塊矩陣
- adaLN 調變
- 時間步嵌入器
- patch 與 class 嵌入器
Frontier 訓練跑通常配備複雜的超引數排程,例如 DeepSeek-V3 的五階段學習率排程 ([24]; 圖 4,左),這些排程有時會在訓練過程中由人手寫 [25]。工程師只能做有限的決策,每個決策僅考量有限的訊號。反應式最佳化器可以接管此工作,且無此限制:它頻繁決策,且每次決策時都能存取整個跑的歷史。正如 圖 4 所示,我們的代理所建立的排程相當複雜,為每個引數組別設有獨立的多階段排程,且各跑之間存在差異。其中幾個在跑中期提升學習率,這在現代排程器中罕見,但在許多情境下自然有益 [6, 26]。此外,下列四個例子展示了他們引用的證據。
我們觀察到代理的決策基於 analysis.py 的診斷。舉例來說:模組連續梯度之間的餘弦值作為過度跳躍的指標(見 “由線索推斷” 之下);每幾百次更新進行兩種學習率的 A/B 測試,比較各自損失下降速度(“A-B-A 測試”);試誤法,學習率先升再降再升(“試誤”);以及損失趨勢,使代理在計畫之前更早開始冷卻(“重新規劃冷卻”)。每一次排程變更都涉及對訓練動態的觀察與對該觀察的推理。
代理如何設定學習率:四個例子
由線索推斷
SiT 代理的分析程式測量了每個引數組別連續梯度之間的餘弦值。若為負值,代理會降低學習率:timestep embedder 的學習率降至官方率的 0.3 倍,再降至 0.15 倍,原因如下:
第 7,506 步,決策 6Timestep-embedder 的學習率在第 7506 次更新後從 0.3 倍降至 0.15 倍 (1.5e-5),因其餘弦值仍約為 −0.22。
當餘弦值略為正值時,對於 Muon 矩陣,它提升了學習率。
A-B-A 測試
RAEv2 代理在連續數百次更新的幾個區段(A-B-A)交替使用兩個學習率,並比較各自的訓練損失。經過一次測試後,它於第 3,100 次更新開始切換至 2 倍,原因如下:
Update 3,000, Decision 12A-B-A 測試與我在第 2,750 次更新的臨時判讀相反:2 倍比 1.5 倍帶來更快的實際進展。
試錯
同一代理將每組的學習率設為 1.3 倍,當骨幹的梯度在每一步開始變號時,將骨幹的學習率恢復至 1 倍,並在下一次決策時將每組的學習率提升至 1.5 倍:
Update 1,000, Decision 4我的上次說明錯誤,因此我要將每組的學習率調升至 1.5 倍(3e-4)。
接著它以 2 倍、2.5 倍與 2.75 倍的學習率各執行約 650 次更新,並最終保留 2 倍。以下為其骨幹注意力矩陣的學習率,作為官方率的倍數;兩個深度下降點是以 75 次更新為單位的學習率減少測試。
重新規劃冷卻
在第 190K 步,SiT 代理將其計畫中的冷卻期從 320K 調整至 280K,並將學習率底線從峰值的 0.1 降至 0.05(見圖 4 的 SiT 面板曲折處)。其說明如下:
Step 190,152, Decision 53常速階段現在主要是將權重保持在由學習率設定的噪音底線,而不是取得進展。
RAEv2 代理於第 11,250 次更新開始冷卻,佔整個訓練的 45%,而非原計畫的 75%,原因是損失趨勢以及一篇關於衰減學習率的論文 [27]。
3.2 最佳化器設計
AdamWMuonpartial Muonbfloat16 momentsfloat32 moments
語言模型
影像生成
Goldfish Amharic 64,626 updates
LightningDiT-XL/1 80,000 updates
modded-nanogpt Track 3 3,250 updates
RAEv2-B 25,020 updates
反應式最佳化器也會改變哪條規則更新哪個張量。在我們的實驗中,許多會將最初給定的 AdamW 轉為知名混合型 Muon,用於注意力與 MLP 矩陣,同時其餘張量仍使用 AdamW。之後,它們會進行更具體的調整(見 Figure 5)。
最佳化器也能決定哪些位置需要高精度。在 modded-nanogpt Track 3 上,它測得 token 嵌入的專案大約為 15,且相鄰的 bfloat16 值相差 0.0625,隨著學習率衰減,四捨五入會逐漸丟失每次更新的一部分。從第 1,040 次更新起,它將該矩陣的 Adam 動量保持在 float32,並以補償性四捨五入寫回權重,其他張量則保持不變。
3.3 動量
momentum resetback to best point
最佳 log10(f(x) − f*), 34 個景觀平均 ↓
| 反應式最佳化器 | −11.6 |
| 梯度下降,lr 0.01 | 0.6 |
| Nesterov 0.9,lr 0.01 | −0.5 |
| Adam,lr 0.001 | 1.1 |
| 最佳預設設定 (Adam, lr 0.1) | −2.2 |
step 300
將滑鼠懸停在曲線下方的紅色標記上,即可閱讀代理所見內容以及它為何回到最佳點。
我們研究反應式最佳化器在 2D 玩具景觀上操控動量的能力,並賦予代理新功能:重置動量、返回目前最佳點以及跳到附近隨機點。在這些玩具設定中,標準 OPAL 只需在幾個決策內將預設配方替換為二階方法,即可非常快達到完美表現。因此,我們將 OPAL 限制為 heavy-ball 演算法,同時允許其控制超引數。在圖 6 的景觀上,起點位於近乎平坦的鞍點旁,常用最佳化器在此停滯。反應式最佳化器提升動量以跨越平坦區段,當梯度接近最小值時降低動量,每次超過時返回最佳點並重啟動量,最終在 300 步預算結束時達到最小值。整體 34 個景觀中,它的平均分數為 −11.6(log10(f−f*),分數越低越好),而任何單一靜態設定表現更差:十二種常見配方中的最佳為 −2.2,382,080 種掃描配方中的最佳為 −7.4(圖 6)。
3.4 損失尖峰
| 每次破壞前後的 delta 測試準確率 | ||||
|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |
| OPAL | −50.0 | −66.3 | −12.1 | +0.7 |
| Muon+clip | −74.4 | −73.6 | −75.5 | −28.5 |
| Muon | −73.6 | −77.7 | −69.1 | −37.2 |
| AdamW+clip | −62.7 | −60.0 | −38.1 | −42.0 |
| AdamW | −61.4 | −32.4 | −53.8 | −68.5 |
| Stable-SPAM | −54.0 | −66.3 | −69.8 | −70.7 |
OPALMuon+clipStable-SPAM損失阻尼裁剪批次閘門
在我們的大規模訓練中,OPAL 也透過模組特定裁剪限制梯度尖峰的損害:另一個 SiT 代理追蹤了它記錄到時間步嵌入器的 18 個梯度尖峰中的 17 個,並為每個張量新增了一個裁剪閾值,該閾值由該張量最近的梯度範數決定,這樣嵌入器中的尖峰就不會再切斷其他所有張量的更新;其舊的全域性閾值僅作為後備。這兩項做法都不是標準實踐,但各有先例:對每個張量根據其自身歷史進行裁剪 [28],以及像 GLM-130B 對其嵌入層所做的那樣阻尼尖峰層 [29]。
尖峰也可能來自資料,透過特定批次與模型狀態的互動 [30],而裁剪一般不會保護對抗噪音標籤 [31]。在受控實驗中,我們將四段隨機影像與標籤插入 CIFAR-10,並用 OPAL 訓練 ResNet-18,OPAL 未被告知此破壞,並使用靜態最佳化器 (Figure 7)。前兩段使 OPAL 減少測試準確度 50 和 66 點,與基線相近。之後加入損失衰減,改為裁剪,並寫了一個門控,阻止損失遠高於近期乾淨樣本的批次。調整門控後,第三段只減少 12 點,第四段無損失,而裁剪的基線和 Stable-SPAM [32] 每段仍損失 28 至 76 點。
3.5 過擬合
CIFAR-10 10% 標籤錯誤訓練影像的測試損失
OPALAdamW,起始的配方早停最佳化器變更
Setting一個在 CIFAR-10 上訓練 120 個 epoch、未使用資料增強的 ResNet-18。 在 50,000 張訓練影像中,10% 被保留作為開發集,且標籤正確;其餘影像中,10% 會被隨機分配一個錯誤標籤(從錯誤類別中均勻抽取),且在整個實驗中固定不變。代理觀測到訓練統計、開發集損失與準確率;但未被告知此特定設定(部分標籤錯誤),且從未看到測試表現。我們讓網路將 logits 正規化(LogitNorm 的中心化形式,[33]),以防止損失作弊行為。AdamW 的學習率為 3e-3,亦為反應性最佳化器的起始配方。
在錯誤標籤資料上訓練是測試過擬合的標準方式 [34]。我們設計此設定(詳見 Figure 8 下方),並詢問最佳化器是否能自行克服過擬合,回應訓練集與開發集的訊號。直接訓練,AdamW 基線的測試損失為 2.49,準確率 73.5%(在開發集上早停時,損失 1.01、準確率 72.9%;將權重平均並選擇那裡的平均值時,損失 0.83、準確率 77.5%)。反應性最佳化器的損失為 0.69,準確率 78.6%。作為記憶度的直接測量,當要求分類 4,500 張標籤錯誤的訓練影像時,基線對所有影像都給出其訓練時的錯誤標籤,早停版本對 19% 給出,權重平均版本對 14% 給出。相對地,反應性最佳化器僅對 4% 給出錯誤標籤,對 78% 給出真實標籤。其策略結合逐步提高的學習率與權重平均,並在開發集上選擇最終平均值,該值被其自身分析程式稱為"extended SWA"[35]。將滑鼠懸停於 Figure 8 的刻度上,即可檢視其具體決策。
分析摘要
上面我們展示了反應式最佳化器能夠根據資料集、單獨模組以及每一次訓練的行為來調整其配方,這是傳統最佳化器所未見的特徵。這種自訂化與自適應性使其能夠設計複雜的訓練時程並駕馭複雜的訓練景觀。
然而,調整超引數、抑制損失峰值、以及防止過擬合仍是人類專家可以做到的事,儘管不那麼方便且成本更高。隨著代理變得更聰明,擁有數百篇論文作為記憶、數千個 token 作為思考鏈、數百萬個訓練訊號作為上下文,並掌握每一步,我們相信反應式最佳化器只會變得更好,在訓練過程中開發出比此處示範更深奧的機制,超越人類專家手動調校的範圍。這些機制可能包括追蹤損失景觀的二階曲率、審核每個資料批次訊號的變異、或實作前所未見的最佳化方案。
4. 實際可行性
反應式最佳化器實際可行嗎?最先的顧慮是等待推理決策所花費的時間。在最簡單的設計中,訓練在代理推理時會停止,造成顯著的開銷。在我們的 OPAL 實作中,我們提供了一個選項,允許訓練在代理思考時繼續進行,並在稍後的更新中(例如在 Goldfish 上中位數 65 次更新後)替換進入代理的編輯。這對效能影響不大,因為大多數最佳化器決策並非特別時間敏感。有了這個選項,Figure 9 中的跑法僅在靜態跑上增加少量時間(1.01× 到 1.14×)。在更大規模下,當前實作仍需改進以支援分片訓練和最佳化器編譯;我們將這些實務問題留待後續工作。
無代理 訓練不等待代理 等待代理
相對於無代理的實際時間 ↓
將 API token 與 GPU 小時比較時,反應式最佳化器的推理成本相對於訓練算力而言很低。在單一訓練跑中約 100 次決策,LightningDiT 代理在 Claude Opus 5.5 列價下成本為 6.42 美元,外加約 74 H100 小時的訓練(約 510 美元,按 AWS 目前的按需價格計算);在更大規模的訓練中裝備它只會使此相對成本更小。坦率地說,按 FLOPs 計算,任何反應式最佳化器在前沿代理的規模下都會不切實際。這裡我們僅想指出,對於大多數研究人員而言,GPU 小時與對封閉源模型的 token 訪問是兩種不同的商品,隨著前沿不斷進步,特定功能的價格將繼續下降。
另一個限制是反應式最佳化器需要空間來觀察與反應;其收益在執行時間短且配方已微調時會縮小。modded‑nanogpt 跟蹤就是這種設定:3,250 次更新的配方,許多人已為幾乎完全相同的任務調校;我們在那裡的收益比我們嘗試的其他任務小,後者訓練的更新數大約是 8 到 120 倍。此外,反應式行為帶來另一個不確定性來源,可能使訓練重現性降低。本文的大多數實驗只跑一次,少數跑三次;釋出的套件重跑可在 OPAL repository。
微調平臺正將訓練帶給所有人。Tinker [36] 與 Prime Intellect 的 Hosted Training [37] 讓使用者可以在不管理 GPU 的情況下,為自己的應用微調開放權重模型。然而,在這些平臺上,一份優秀訓練配方的心理負擔仍由人承擔。反應式最佳化器自然地搭載在這些平臺之上,將負擔交給代理,並協助每位使用者將模型個性化以符合其需求。
5. 結論
迄今為止,最佳化器都是在訓練之前編寫的。代理作為一種成本低、具備長上下文視窗與專家知識的推理器,使得新的可能性成為可能:一個在網路訓練時不斷決策、並對最佳化事件做出反應的最佳化器。我們已經證明,這種反應式最佳化器會觀察訓練動態,並在訓練展開時為不同引數組別重新編寫自己的程式碼,於其認為適當的步驟。無論是玩具實驗還是擴大規模實驗,這些跑多數在起始配方之前就結束。
我們設計的分析與更新機制旨在盡可能簡單且通用。它包裝了一個標準最佳化器,對模型、資料或訓練動態不作任何假設。如今,在尚無配方的情況下,它都非常有用。例如,生物學或其他科學資料集上的模型、尚未撰寫配方的架構,或尚無人調校配方的語言,都是此類反應式最佳化器的絕佳使用案例。原因在於最佳化器的代理在無數訓練步驟中扮演人類專家的角色,而人類專家從未有時間坐下來,對跑中的事件做出類似決策。以此觀點看,反應式最佳化器是一件自然的建造物,其優於靜態最佳化器的收益是可以預期的。此外,訓練跑持有遠超人類可用的資訊,幾乎所有資訊今日都被忽略。反應式最佳化器能觸及所有這些資訊。想像一個沒有單塊最佳化器概念的世界;取而代之的是一種能適應每一次特定跑的最佳化智慧,可能不是基於梯度,而是零階 [38]、基於語言或其他。也許,在未來,我們應將最佳化決策委派給代理,而非人類。
在過去十年中,深度學習模型透過訓練獲得了不合理的強大能力。然而,它們構建的核心——最佳化器——仍然是機械式的。我們的文章試圖將訓練賦予的魔力注入訓練本身的核心,形成一個迴圈,我們希望它能在未來創造更多能力。
程式碼 repository
pip install opal-optimizerimport torch
import opal
opt = torch.optim.AdamW(model.parameters(), lr=3e-4)
sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=steps)
opt = opal.wrap(opt, model, scheduler=sched, total_steps=steps,
goal="...", max_cost_usd=20)
for step in range(steps):
loss = criterion(model(x), y)
loss.backward()
opt.step(loss=loss)
opt.zero_grad()
sched.step()致謝
我們衷心感謝 George Cazenavette、David Charatan、Shivam Duggal、Jyo Pari 及 Qianwei Jia 在此篇寫作中提供寶貴建議;亦感謝 Zhenting Qi 與 Zeqing Yuan 的討論。更感謝 Phillip Isola 教授及 Isola lab 在先前版本中提供的深入回饋。
引用
@misc{bai2026reactive,
title = {Reactive Optimizers},
author = {Bai, Xingjian and Liang, Jia-Hao and Teoh, Jayden and Sitzmann, Vincent},
year = {2026},
month = {oct},
url = {https://xingjianbai.com/reactive-optimizers/},
note = {Blog post}
}參考文獻
- Kingma 和 Ba. Adam:一種隨機最佳化方法。ICLR 2015。arXiv:1412.6980.
- Gupta、Koren 與 Singer. Shampoo:預條件化隨機張量最佳化。ICML 2018。arXiv:1802.09568.
- Vyas 等. SOAP:使用 Adam 改進並穩定 Shampoo。arXiv:2409.11321,2024。
- Jordan 等. Muon:用於神經網路隱藏層的最佳化器。部落格文章,2024。
- Liu 等. Muon 適用於大規模語言模型訓練。arXiv:2502.16982,2025。
- Loshchilov 與 Hutter. SGDR:帶熱重啟的隨機梯度下降。ICLR 2017。arXiv:1608.03983.
- Hägele 等. 擴充套件規律與計算最佳化訓練超越固定訓練時長。NeurIPS 2024。arXiv:2405.18392.
- Yang 等. Tensor Programs V:透過零樣本超引數轉移調優大型神經網路。arXiv:2203.03466,2022。
- Lu 等. The AI Scientist:邁向全自動開放式科學發現。arXiv:2408.06292,2024。
- Prime Intellect。 Autonomous Speedrunning Experiment。GitHub,2026。
- Chen 等. Symbolic Discovery of Optimization Algorithms。arXiv:2302.06675,2023。
- Metz 等. VeLO:透過擴充訓練多功能學習最佳化器。arXiv:2211.09760,2022。
- Daniel、Taylor 與 Nowozin. Learning Step Size Controllers for Robust Neural Network Training。AAAI 2016。doi:10.1609/aaai.v30i1.10187。
- Jaderberg 等. Population Based Training of Neural Networks。arXiv:1711.09846,2017。
- Zweiger、Pari、Guo、Akyürek、Kim 與 Agrawal. Self-Adapting Language Models。arXiv:2506.10943,2025。
- Jordan。 Modded-NanoGPT Optimization Benchmark。GitHub,2026。
- Chang 等. Goldfish:350 種語言的單語言模型。LREC 2026。arXiv:2408.10441。
- Yao、Yang 與 Wang. Reconstruction vs. Generation:駕馭潛在擴散模型中的最佳化困境。arXiv:2501.01423,2025。
- Ma 等. SiT:探索可擴充套件插值變換器的流與擴散基生成模型。arXiv:2401.08740,2024。
- Chen、Sun 與 Yuan. CMuon:透過分塊動量正交化加速並穩定擴散 Transformer 訓練。ECCV 2026。arXiv:2608.02502。
- Li 等. Scaling Muon for Diffusion Transformers。arXiv:2608.20818,2026。
- Singh、Zheng、Wu、Zhang、Shechtman 與 Xie. Improved Baselines with Representation Autoencoders。arXiv:2605.18324,2026。
- Bolatov 等. Optimizers for Diffusion Models:一個受控基準。arXiv:2609.23055,2026。
- DeepSeek-AI。 DeepSeek-V3 Technical Report。arXiv:2412.19437,2024。
- Zhang 等. OPT:開放式預訓練 Transformer 語言模型。arXiv:2205.01068,2022。
- Smith。 Cyclical Learning Rates for Training Neural Networks。WACV 2017。arXiv:1506.01186。
- Bergsma、Dey、Gosal、Gray、Soboleva 與 Hestness。Straight to Zero:為何將學習率線性衰減至零最適合 LLM?ICLR 2025。arXiv:2502.15938。
- Wang 等人。AdaGC:透過自適應梯度裁剪提升 LLM 預訓練穩定性。ICML 2026。arXiv:2502.11034。
- Zeng 等人。GLM-130B:一個開源雙語預訓練模型。arXiv:2210.02414,2022。
- Chowdhery 等人。PaLM:利用 Pathways 擴充套件語言模型。arXiv:2204.02311,2022。
- Menon、Rawat、Reddi 與 Kumar。梯度裁剪能否減輕標籤噪聲?ICLR 2020。OpenReview,2020。
- Huang 等人。Stable-SPAM:如何以 4 位元比 16 位元 Adam 更穩定地訓練。arXiv:2502.17055v2,2025。
- Wei、Xie、Cheng、Feng、An 與 Li。透過 Logit 正規化降低神經網路過度自信。ICML 2022。arXiv:2205.09310。
- Nakkiran、Kaplun、Bansal、Yang、Barak 與 Sutskever。深度雙降:更大模型與更多資料何時會適得其反?ICLR 2020。arXiv:1912.02292。
- Izmailov、Podoprikhin、Garipov、Vetrov 與 Wilson。權重平均可導致更寬的最適解與更佳的泛化。UAI 2018。arXiv:1803.05407。
- Thinking Machines Lab。發布 Tinker。Blog post,2025。
- Prime Intellect。入門(託管訓練)。Documentation,於 2026 年 10 月 21 日存取。
- Dahal、Mandal、Gülbahar 與 Vegesna。Dust:不使用反向傳播的 Transformer 預訓練。Q Labs,2026。