〈Stanford CS329A Self-Improving AI Agents〉-EP-Part 9 | Future Research Areas

https://www.youtube.com/watch?v=AyO6wyu4DEg

自我改進的迴路要一直轉下去,卡住它的通常不是模型不夠大,而是三件事:推理鏈不夠多元、驗證不夠可靠,還有要練什麼題目仍然得靠人挑。

這是 Stanford CS329A 最後一堂課的收法。前面八講把「自我改進的 Agent」拆成一堆零件,最後一講先把整季收回來,再把上面那三件事各自對到一篇論文,最後換一個尺度問同一個問題:這些 intelligence 要用多少瓦去換。講者在開頭就半開玩笑說,這個領域動得太快,也許下次開課,這三篇論文就各自變成一份講義了。

一季的課,收在一個迴圈上

課是從 LLM 開始的。過去這一年,test-time scaling 跟 train-time scaling 靠的是自我改進:迴圈由 verifier 跟 feedback 驅動,跑 verifier 拿到 reward,再用 RL、甚至 search algorithm,讓模型在數學跟程式這類題目上往山上爬。這是課程前半段的重心。

再往下走是 evolutionary strategies,有一整堂課在講 open-endedness。這裡的迴圈不只用 reward 拉;如果探索空間定義得出來,也可以讓模型自己去探索,課上談的是 Alpha Evolve 這類做法。

然後是 paradigm 的轉換:用 tool use 組出 end-to-end 的 workflow。模型跟環境、工具互動,整段流程就能自己跑;任務要跨好幾步,就得去看知識庫,於是需要 retrieval 跟 memory。越靠近真實世界的工作,planning 跟 multi-step reasoning 就越吃重。客座講者補上 post-training、multimodal agents、robotics、reasoning 這幾塊;另一位講者講了 symbolic techniques,它歸在 tool use 這把傘底下,也可以餵進 synthetic data,而這是另一個正在發生的趨勢。

把這些拼起來,就是這門課名裡的 Agent。它有自己的 goal,會去跟環境互動、收 feedback,再用 feedback 修正自己的步驟;它是指揮自己流程、會用工具、把目標完成的系統。課名取作 self-improving agents,重點不只在 LLM,也在 Agent 這一面。現在這個階段,LLM 本身常常還不夠力一個人走到終點,所以人會把系統手寫成 workflow,去編排 LLM 跟工具;coding agent 這一類已經看得到 agentic workflow 自己在跑。workflow 裡編排的東西包括 LLM、verifier(通常需要一個 reward 的來源,verifier 常常就是 LLM 當 judge)、tool call、search algorithm,也可以是平行的 LLM 呼叫一起去搜。因為整條 workflow 在追一個目標,它需要 planning、需要跨多步的 reasoning、走錯方向時要修正,而且整體能力要一直往上。self-improvement 就是在這裡進來的。

同一顆模型生出來的推理鏈太像

第一篇論文處理的是多元性,方法叫 multi-agent fine-tuning。

先看它想解的難題。pre-training 的算力花在壓縮網路規模的資料上;instruction tuning 往往要真人資料,需要人的偏好來判斷哪個回應好、哪個回應爛。替代方案是用 LLM 生成的資料,也就是 synthetic data,做成 iterative fine-tuning:讓模型生出可能的解答,把錯的濾掉,這叫 rejection sampling,然後只拿對的那批去微調。變化型不少,STaR 就是課上講過的,也可以把 reasoning chain 一起塞進這個過程。

問題出在:生成資料的如果是同一顆 LLM,它生出來的解答會非常像,效能往往幾輪、或幾十輪之後就停住。根因是缺乏多元性。pre-training 規模的資料之所以雜,是因為那是人在很長時間裡累積出來的;同一顆 LLM 對同一批 prompt 生成的輸出,溫度開高也多元不起來。

所以這篇的答案是找多個有專精的 Agent。generation agent 負責生出多樣的初始解,critic agent 負責評估跟修正,兩種都是訓練出來的。流程是這樣:N 個 generation agent 先各出一個答案,接著對這批答案做一次摘要(可以另一顆模型來摘要,也可以直接接起來),critic 對更新後的答案下評論,評論再塞回輸入。第二輪所有 generation agent 生出更新版答案,取多數決,再摘要,可以一路當成辯論打下去。

一般做法是針對單一 Agent 的回應下評論,這裡評的是多個 Agent 的回應先專精、摘要之後的版本。好處是在 critique 之前,差異就已經在裡面了;多數決等於是免費拿到的,前提是這些 Agent 訓練得不太一樣。generation model 都是從同一個 base model 微調出來的,目標是給定問題時產出好答案;每一輪把輸出跟多數決比對,符合的留下,用這些 prompt-response 對做 SFT。最陽春的版本是直接換不同模型來生,實務上也有人這樣做,講者稱它是窮人版的多模型生成。critic model 也是微調過的,輸入是題目跟更新後的答案,工作是把最好的挑出來;它的訓練資料混了「答案一開始是對的,後來在辯論中被修正」這類軌跡,學的是對比對與錯的答案。

結果要看兩張圖。橫軸是微調迭代次數,縱軸一個是 negative log likelihood,當效能的代理,另一個是 embedding dissimilarity,數值越高代表越多元。兩個開源模型在多 Agent 微調下,效能可以繼續往上,Llama 3 對這個方法反應特別好。右邊那張圖更有意思:整個過程裡回應一直維持相當多元,資料集是數學。三個開源模型都看到同一件事,多 Agent 的做法撐過好幾輪微調還在進步,單一 Agent 微調的準確率則會崩掉或不再往上。因為要微調,能測的只有開源模型。這是有點舊的工作,數字不算高,但連 GSM8K 這種鄰近領域都拿到比較高的表現,代表它不只在自己那份 in-domain 資料上有用。

回到大圖:要自我改進,餵進去的 reasoning chain 本身要夠多元,靠多顆模型或多個 Agent 去生,是其中一種做法。

答案對,推理鏈不一定對

第二個瓶頸是驗證,這個題目課程前幾講就碰過。

通常的做法是只看結果。數學題或定理證明,你看的是最後答案,用 outcome reward model 判斷有沒有對上 ground truth,對上就算驗證過。課上討論過兩個問題:如果推理鏈是錯的,會不會把模型帶歪、最後造成效能落差?以及 process reward model 為什麼那麼難做?

DeepSeek-MathV2 是最近出來的論文,想證明至少在定理證明這個領域,自動化的 self-verification loop 做得起來。

它要打破的假設是這樣:現在 RL 的前提是最終答案要對上 ground truth,這就是 reward 的來源,也讓 AIME 之類的數學 benchmark 一個一個飽和。但有正確答案不代表推理是對的;要模型在定理證明上真的變強,需要嚴謹的逐步推導,最終輸出給不了這個。麻煩在於 LLM 大多是在定量推理的資料上訓練出來的,生出來的證明在數學上可能根本無效,你叫它自己驗,它會說錯的證明是對的,LLM-as-a-judge 在這裡不太管用。懂這個領域的專家一看就知道問題在哪:這一步接不上前一步,或是在引用的地方有推理斷層。

DeepSeek-MathV2 除了 reward model 之外,還訓練 verifier,再在上面加一層 meta-verifier。一開始先讓真人指出證明裡的問題,而且不給參考解;用這批資料訓練 LLM 去辨認證明裡的問題、並且改進,最後就得到一顆能自己批判證明的模型。

架構上,generator 加 verifier 是 train-time scaling 的標準配置,一顆模型生證明,另一顆指出問題。多出來的是 meta-verifier:它會去看 verifier 的分析合不合理、對這份證明的判斷有沒有問題;verifier 則被訓練成根據這些問題替證明打分,分數落在 0.5 到 1 之間。verifier 再去改進 generator,generator 生出更難的證明,回頭再改進 verifier,形成一個迴圈。另一個重點是標註可以自動化:一旦有了找錯證明的種子資料,meta-verifier 把這件事學會之後,就不必一直靠人來標。

meta-verification 這個概念本身也值得記著。verifier 有可能在推理鏈是錯的時候給出正確的分數,例如它自己編出根本不存在的錯誤。meta-verification 問的正是:verifier 指出來的問題真的存在嗎?分數有從那些問題推出來嗎?也就是在評估「verifier 做得好不好」。他們讓專家標註這個評估的品質,只加上這一個 block,品質就往上。原本是 reasoning chain 上面有一層 verifier,現在 verifier 上面再問一句「這個評估對不對」。

結果的部分:RL 迴圈一般蓋在 GRPO 上,這篇蓋在 DeepSeek V3 的 base model 上。驗證與生成的迴圈在 IMO 題跟 CNML 題上跑 benchmark,這組題先前有客座講者講過 Gemini 版本,這篇是最近開源的版本。八輪迭代下來,只算 pass@1,proof score 就一路往上;換成 best@32,也就是從 32 份生成的證明裡挑最好的,在 IMO 2024 shortlist 上幾乎到 42%。當成一種 hill climbing 技術看,這相當有潛力,意思是只要你能指出推理鏈的問題,把模型往修掉這些問題的方向推,就有東西可以爬。

洞見收在這裡:最好的證明會拿到比較高的驗證分數,generator 也學得會分辨高品質跟有瑕疵的證明,self-verification 於是有比較好的改進迴圈。驗證可以是瓶頸,這是打破它的一條路。要搬到別的領域,需要的條件講者列得很清楚:LLM-based verifier 要在沒有參考解的情況下指出問題;要有 meta-verification 這層額外的 block,降低 verifier 幻覺出問題的機率;還要給 generator 額外的誘因,讓它靠刻意的推理把品質最大化。當然,這套還是受限在驗證相對容易的領域。

題目也讓模型自己出

第三個問題是:該練哪些資料、哪些 prompt?這篇論文還沒看到太多人用,但講者覺得很有意思:讓模型自己提出一批剛好落在「學過的邊緣」的任務。

現在的訓練堆疊是這樣:supervised learning 階段用人整理好的 reasoning trace;到了 RL with verifiable rewards,要靠專家整理問答對。做數學要數學專家,做 IMO 題要 IMO 專家,寫程式要強的軟體工程師。當模型能力繼續超過人,要找到更多專家、更多這種題目,就會開始卡住。

這篇的提議是讓同一顆模型既出題、也解題,等於走到另一個極端:不需要外部資料來源,也不需要人寫的 prompt。這件事在某些領域可行,他們挑了程式。題目分成三種:abduction、deduction、induction。

proposer 出題的方式,基本上就是幾種程式題的 paradigm。deduction 是生出程式跟 input,環境執行之後得到 output。abduction 類似,一樣生程式跟 input,環境算 output。induction 不一樣,它抽一個現成的程式,替它生新的 input,再加一段自然語言描述這個函式在做什麼,環境執行完再判斷這是不是往對的方向走。proposer 會 conditioned on 過去生成的例子,這些例子會明確寫進 prompt,作用是增加多樣性。

題目怎麼選?用難度。每一道生出來的題目都會送給 solver,成功率是 0,proposer 拿 0 分;成功率不是 0,就拿 1 減掉平均成功率。他們想選的是不 trivial、也不 impossible 的題,也就是 solver 有時成功、有時失敗的中等難度,這樣才有東西可學。proposer 的目標是在當前權重下生出最佳難度的題目;模型變強,它就要學會出更難的題。

有效性也要顧。在程式的抽象下,可以跑程式完整性檢查,真的執行看有沒有錯;可以做安全檢查;也可以確認同一組 input 跑很多次會拿到完全一樣的 output,這件事在程式裡做得到。提議的題目進訓練管線之前都會先驗過,這樣 proposer 沒辦法靠 hack 生出垃圾題。另外有一個 buffer:每一組 seed triplet(identifier、input、output、program)都會進 task buffer,proposer 可以從裡面抽參考,同時記著模型在這題上成功或失敗過幾次。累積下來就是一個隨時間演化的 curriculum。

結果是在 coding benchmark 上拿到 SOTA,而且 prompt 那一側完全沒有人整理過的資料,表現還贏過用數萬筆專家範例訓練出來的模型。出現的行為包括:複雜度指標隨時間往上,這在 proposer 一直加難度的情況下可以預期;迴圈設定正確的話,程式跟答案的多樣性也變好;proposer 隨著訓練進行,出的題越來越難。proposer 跟 solver 有一點對抗的味道,像賽局,但整體是把對方推上去。

這裡的 takeaway:任務選擇不該卡在人的資料上,前提是有某種形式的驗證,而且要有做 curriculum learning 的能力。雖然只在模型自己出的程式題上 hill climb,coding 跟 math benchmark 上都有強表現,math 也變好是比較意外的事,用領域裡其他結果可以解釋一部分。還有一個規律:模型越大,相對小模型拿到的增益越大。

另一位講者補了 Swirl 的結果,說兩邊看到的東西很像。在 Swirl 裡,模型自己生成訓練資料,不只讓它在生成資料的那個任務上變好,還會有 transfer。Swirl 做的任務是帶 retrieval 的 multi-hop 問答,但隨著 synthetic data 越生越多、RL 越做越多,模型在別的工具呼叫上也變好,例如呼叫 Python 解數學題,反過來也一樣。這裡有一個重複出現的趨勢:模型自己生成資料,跟泛化是綁在一起的。另一件有趣的事是,比較大的模型更會吸收這種 data flywheel、也更容易從中泛化,至少在 Swirl 的 RL 最佳化這一側是這樣。

講者把三個瓶頸收在一起,順便給出下一個研究方向。要真正的泛化跟推理,reasoning chain 的多樣性是關鍵,而怎麼做到還是開放問題;驗證要更好,越能打破驗證迴圈、不被人力或只有專家驗得動的題目卡住越好;第三是資料選擇,人能整理的 prompt 有限,打破這道牆對下一代的自我改進模型很重要。另一位講者補的方向是:如果只在「可以驗證、可以生 synthetic data」的領域把自我改進推到極限,把這些能力帶回多樣的 verifiable 任務,效能能被推到多高?能不能讓模型在驗得動的領域越來越聰明,同時把不可驗證領域對標註資料的需求降到最低?他補了一句,這會是很吃算力的實驗。

驗不動的領域怎麼辦

課堂上有人問,哪些應用不落在 verifiable 問題裡。答案是驗證很慢的那些:科學發現;chip design 裡跑一次要好幾天的模擬,跑完才收到一個 reward 訊號;或是化學實驗,得進 wet lab 跑完才知道品質好不好。這些領域難,是因為 RL 微調或 test-time scaling 需要 verifier 幾乎是即時的。等一下可以,幾分鐘可以,一小時或許也行,但 RL 訓練要跑幾百幾千步,不能等好幾天,也不能讓人進迴圈替它收 reward。真正不可驗證的還包括創意,或任何帶主觀性的指標。creative writing 就是:設計一個精確的 reward function 很難;當然可以把它建模出來,但模型只要稍微偏掉,RL 或 Agent 就會去 reward hacking。

現在有人怎麼解?訓練一顆另外的 reward model 去預測模擬的結果。不要真的跑那些昂貴的模擬或實驗,先在線下收一大堆資料,訓練 reward model:給定 input,預測 output 的品質,然後拿它當 RL 最佳化裡的驗證對象。但 reward model 的泛化能力取決於資料量,也可能不準,不準就會出事。

講者另外補了自己領域的例子。不用講到 chip design,光 Stanford 跟 Yale 做過的 kernel bench,編譯器執行就能給訊號,看有沒有生對程式,也有些指標可以量。但有個課堂專案要讀 performance profile,事情一複雜就難了:簡單的東西或許能設計出最佳化過的 kernel,但把這些東西全部串起來、要做 performance profiling、還要改掉沒最佳化的部分,整體上就是更難的問題。常見的解法是把問題拆成子問題,讓模型一個一個看,再放一些參考解在知識庫裡讓它查。講者說他描述的其實就是那個課堂專案,重點是問題本身難、模型能力又還沒到,所以往往要靠拆解,拆成模型現在做得到的樣子。

每一瓦能換到多少 intelligence

前半段講的是怎麼讓模型更會自我改進,後半段換一個角度:這些 intelligence 要花多少電。

這是跟 Professor Ray、Professor John Hennessy 及一大群合作者一起做的工作。他們看模型端跟硬體加速器端的趨勢,想知道未來的 AI 推論工作負載會長什麼樣,模型多大,需要什麼樣的加速器來服務。

現在的處境,講者用一個詞形容:mainframe 時代。ChatGPT、Gemini 這些大模型都跑在雲端,不跑本地,因為模型大;有些是專有的,根本拿不到;就算是開源的大模型,也還是在雲上跑。同時算力需求在爆炸。Google Cloud 過去十二到二十個月,服務的算力成長大約 1200 倍;Nvidia 有過年增 10 倍的年份。這些數字明確是被 AI 拉出來的。要滿足這個需求,資料中心要的電力大約是 250 gigawatt 這個量級,而且還在往上,所以能源供應只會更吃緊。Google 那邊處理的 token 數,去年二月是 160 兆,今年十月是 1.3 quadrillion,也就是 1300 兆。這是歷史上最快的算力需求成長之一。

但看一下工作負載長什麼樣。從一份很大規模的 ChatGPT 使用者資料集看,大約 77% 的請求是實用指引、找資訊、寫東西這類任務。很多這類任務不需要最強的前沿模型,小一點的本地模型就能處理。使用者當然會隨著 chatbot 變強、問越來越難的問題,但絕大多數查詢還是落在複雜度比較簡單的那一側,小的模型就接得住,不必動到大顆的專有模型。

另一邊,本地推論加速器在進步。2012 年到現在,本地加速器的 GPU 記憶體大約成長 126 倍;現在筆電、MacBook 可以有 100GB 這個量級的記憶體,再加上 8-bit 量化,某些最大的模型也能塞進本地跑。所以問題變成:本地推論可以在重新分配推論需求這件事上扮演什麼角色?現在幾乎所有流量都進雲端,進 H100、TPU、GP200、GP300 這些加速器。

為了系統性地看,他們先定義一個指標,intelligence per watt,簡稱 IPW。能力這一側看的是模型能處理多少比例的查詢,針對單輪跟推理型的查詢;這份研究裡把本地模型定義成 active parameters 20B 以下。效率這一側看的是在本地硬體上跑這些模型,每一瓦能換到多少有用的算力。定義寫下來是平均任務準確率除以平均功耗。

他們看的範圍:二十多顆本地模型,包含 Qwen、GPT-OSS 這類;企業級跟本地加速器都看;工作負載是一百萬筆來自 ChatGPT 的查詢,加上 natural reasoning、MMLU Pro、Super GPQA 這類推理 benchmark;指標有準確率、能源、延遲、算力使用等。這批資料拿來理解趨勢,不同模型與硬體組合下的各種指標也開源出來。

三個發現。本地模型已經很不錯,進步的趨勢更值得注意:2023 年以來,它們在準確率、或說能解決的 chat 查詢比例上成長 3.1 倍,而這只花了兩年;現在能處理前面那批查詢裡大約 88.7%。本地加速器的效率還落後企業級晶片,Apple M4 Max 的 IPW 比 B200 低 1.5 倍;原因是 B200 極度針對語言模型工作負載最佳化,M4 還要顧其他種類的工作負載,而且當初設計這些晶片時並不預期 LLM 會跑在本地,所以晶片設計者的重心大多放在雲端規模。最後一個觀察是 IPW 這個指標在過去兩年大約改善 5.3 倍,其中 3.1 倍來自模型變好,另外 1.7 倍來自硬體變有效率。

兩條趨勢擺在一起看:本地模型越來越強,能解以前解不了的題,速度還很快;同時模型效率跟硬體效率都在變好。這指向一個未來:越來越多流量可以由跑在 edge device 上的模型處理,筆電或手機都算。

還沒解完的幾件事

講者把幾個沒解完的方向列出來。一個是 test-time scaling 的基礎原理。現在的做法是透過 RL、收資料、然後微調模型,但這裡顯然還有更多東西。比如:為什麼會有這種性質?一直對模型問同一個問題、靠 test-time scaling 讓正確答案冒出來,這件事對模型來說代表什麼?把成功的軌跡 distill 回模型的最佳做法又是什麼?這些都還是開放問題。從 synthetic data flywheel 這個現象,可以很清楚接到 continual learning。

continual learning 的落差是這樣:人解任務、學東西,腦子是一直在進步的;模型大多是離線流程,某個 Agent 收了經驗,過一段時間才微調一次。人的行為跟模型的行為之間有落差,continual learning 這個概念有可能處理它。講者想問的是,什麼新的做法可以把正向經驗、從負面經驗學到的東西、還有模型解題的過程,用更自然的方式放回模型裡,不要走現在這種非同步的「生資料、再微調」。

還有一塊是 infra:high throughput、low latency 的 test-time scaling。test-time scaling 的做法,不管是重複取樣、對前幾輪的結果來回更新、還是工具呼叫,都跟現在主流的 chatbot 用法差很多,後者大多是單輪來回。這代表系統與推論最佳化有很大空間。講者的實驗室做過 Hydrogen、Tokasaurus 這類工作,這些方法變成主流之後會更重要,需要特定的做法去最佳化系統跟底層算力。

課程那張總圖上,pre-training 那一塊也有很多有意思的工作,這門課碰得比較少,重心放在 post-training 跟 test-time scaling。而現在衝出來的是 synthetic data flywheel 跟 continual learning,它們長在 fine-tuning、online learning 跟 test-time scaling 的接縫上。回到 IPW,下一步也很清楚:如果推論真的從全部在雲端,變成很大一部分在本地,那會需要 hybrid 的 inference serving engine,能在本地與雲端的模型跟加速器之間順順地分流,看需求跟資源的複雜度決定。另一個方向是新的模型架構與 kernel,特別是為本地加速器做能源效率,這塊比雲端加速器少人做很多。能源會是接下來最珍貴的資源;IPW 這類指標,以及更好的方式去理解與量測能源、瓦數、功耗,並且據此最佳化,會很重要。現在它還不是主流的目標函數,但預期會越來越普遍。

學生問的問題

第一個問題是:continual learning 是記憶系統的事,還是 LLM 本身的事?講者說,long-term memory system 確實是人類的類比。但在那之前,光是在 multi-step reasoning 裡從成功與失敗學習,讓模型把這套技能留下來,把權重、或一部分權重用有用的方式更新,就已經是個重要能力,而我們基本上還沒有。能不能學會一個新技能?能不能學會怎麼學?他舉機器人當例子:能不能看影片就學會一件事怎麼做,而不是被餵一大堆任務示範。

另一位講者補了其他把知識帶進來的路。in-context learning 是一種。想像有一個無限長的 context,模型可以完美取用裡面每一塊、並且從中學習;我們沒有這個,但如果有的話,那也許就是 continual learning 的一種解:把所有正面與負面的東西都放進 context,模型同時記得、同時對它推理。現在做不到,就算到一百萬、幾百萬,模型對 in-context 資料的推理能力還是會衰減。另一條路是課上講過的 Cartridge:不動權重、不微調,把東西放進 activation,或說 KV cache,來實現長 context 與 in-context learning。所以 continual learning 不一定只等於微調,把有效 context 長度大幅拉長也是一種想法。

追問是實作面的:一直更新權重,還是更新一個記憶庫,哪個比較容易?講者說看應用。如果那是知識庫,更新記憶庫容易,最簡單的版本就是留一個資料庫讓 LLM 學著去查,要更新就更新資料庫。但你真正想教 LLM 的是對新領域推理的能力,外掛一個記憶系統做不到這件事,這時候更新權重就做得比較好。他舉機器人為例:不管加多少記憶系統,如果沒有更新 LLM 的權重,cross-embodiment generalization 不會發生,那比較是技能轉移的問題。

另一個問題來自課堂,問到 Absolute Zero 那篇:環境好像就是 post-training 用的資料,那有沒有論文是讓 Agent 自己生出環境的?講者回,在只有窄域智能的世界裡,遊戲可以做出模擬,拿來當玩具任務的環境。這一代環境之所以重要,是因為它們是真實世界任務的代理。所以重點不在「有沒有讓 Agent 自己生環境的論文」,問題其實是:你想代表的是哪一組任務,如果它容易模擬,用 Agent 生或用軟體生差不多。真正要問的是,它是不是模型跟真實世界互動、拿 feedback 的合理代理。遊戲的探索空間有限,比較容易用程式表示,也比較容易做模擬。

課結束的地方

講者在最後謝謝這班學生,說教這門課、準備這些內容是很享受的事。這個領域在動,現在教的東西,等下次開課就開始變成歷史,但學到的基礎技術長期都有價值,因為新東西大多還是長在這些基礎上;他也期待看到大家的專案與 poster。

另一位講者補的是自己的角度:他們在做投影片、備課的過程也學到很多,因為很多題目就是這麼新。謝謝學生一起走這段,希望大家學到新技能、被新的方向啟發,也希望這只是開始。