Research/·5 min read·OraCore Editors

Parallel-SFT 讓 code RL 更會跨語言

Parallel-SFT 用多語言等價程式做 SFT,想讓後續 code RL 的零樣本跨語言轉移更穩,特別是低資源程式語言。

Share LinkedIn
Parallel-SFT 讓 code RL 更會跨語言

很多 code model 在 Python、C++ 看起來很強,一換到低資源程式語言就掉速。Parallel-SFT: Improving Zero-Shot Cross-Programming-Language Transfer for Code RL 這篇論文想處理的,就是這個落差。作者的判斷不是「程式能力只屬於某一種語言」,而是現有訓練流程沒有把這些能力好好推向可轉移的表示。

它的核心想法很直接:如果模型在 RL 之前,就先看過多種語言寫出的等價程式,或許能先學到比較語言無關的內部表徵。這樣一來,後面的 reinforcement learning 不會只把能力鎖在來源語言,而是更有機會往其他語言擴散。

這篇論文要解的痛點

這篇研究聚焦在 zero-shot cross-programming-language transfer for code RL。白話一點,就是先在某個來源語言上做 code generation 的強化學習,再看模型能不能把 RL 帶來的好處,直接轉到其他目標語言,而且不用再針對目標語言額外做 RL。

Parallel-SFT 讓 code RL 更會跨語言

這件事很重要,因為現實世界的程式語言分布很不平均。常見語言像 Python、C++ 資料多、模型也比較熟;但很多低資源語言資料少,效果通常就差一截。論文把這個問題視為資料與訓練設定的組合問題:模型不是不會寫程式,而是它看到的訓練訊號太偏向少數語言。

作者也指出一個關鍵現象:在 Llama-3.1 上,針對來源程式語言做 RL,並不會自動讓其他目標語言一起變好,甚至可能讓表現退步。也就是說,RL 的收益未必會自然跨語言傳遞,這正是 Parallel-SFT 想修補的缺口。

Parallel-SFT 到底怎麼做

這個方法不是直接改 RL 本身,而是先改 RL 前面的 supervised fine-tuning。作者的假設是:如果 SFT 階段就讓模型建立比較能跨語言泛化的初始化,後面的 RL 才比較容易把能力帶到別的語言。

Parallel-SFT 的做法是把「parallel programs」混進 SFT 資料裡。這些程式在功能上等價,但分別用多種程式語言實作。模型不再只看單一語言版本,而是同時看見同一個任務在不同語法外觀下的對應關係。

這個設計很像在幫模型建立「語意對齊」:不要先把每個語言當成獨立技能,而是先讓模型意識到,底層做的事情其實相同,只是表達方式不同。論文的主張也不是模型因此變成某種通用編譯器式表示,而是這種 SFT 初始化,能讓後續 RL 的轉移性更好。

所以,Parallel-SFT 不是一個新的 RL 演算法。它比較像是前置訓練策略,目標是把模型帶到一個比較適合跨語言轉移的起點,再交給 RL 去放大效果。

論文實際證明了什麼

摘要裡最明確的結果,是方向性的:作者在 Parallel-SFT 模型上做 RL 後,觀察到對未見過的程式語言有更好的泛化,優於基準設定。不過摘要沒有公開完整 benchmark 細節,所以這裡沒有數字可直接對照。

Parallel-SFT 讓 code RL 更會跨語言

論文還做了內部表示分析。作者指出,Parallel-SFT 會讓 latent space 更偏向功能導向,也就是說,不同語言但功能相同的程式,會在表示空間裡更靠近。作者認為,這種更緊密的聚類,可能就是它能提升 RL 後跨語言轉移的原因之一。

這點很值得注意。因為如果改善只是來自某種表面上的微調技巧,那影響可能很脆弱;但如果模型真的開始用「這段程式在做什麼」來組織表示,而不是只看語法長相,那跨語言任務就比較有機會受益。對 code RL 來說,這是很合理的方向。

不過,摘要能支持的證據也就到這裡。它告訴我們方法有效,但沒有交代完整評估任務、提升幅度、涵蓋哪些語言、或不同模型尺寸與 RL 目標是否都一致受益。

對開發者有什麼意義

如果你在做 code model、coding assistant,或是需要多語言支援的 agent,這篇論文的訊息很直接:不要只盯著 RL 配方,SFT 的初始化可能同樣關鍵。很多人會把重點放在 reward、rollout、policy update,但這篇工作提醒你,模型一開始學到的表示方式,會影響後面 RL 的收益能不能跨語言延伸。

對資料資源有限的團隊來說,這也提供一個可操作的思路:如果目標語言資料少,也許可以先用多語言等價程式把共享語意教進去,再進行 RL。這不代表問題就消失,但至少能把來源語言的監督訊號,轉成比較可轉移的形式。

  • 用對齊的多語言實作,教模型共享語意,而不只是記住語法。
  • 不要假設某個語言上的 RL 成果,會自然複製到其他語言。
  • 把 SFT 視為表示塑形,不只是 instruction following。
  • 若要支援長尾程式語言,前置資料設計可能比後段優化更重要。

從工程角度看,這篇論文也在提醒一件事:如果你的系統要跨格式、跨方言、跨語言泛化,先讓模型看見平行樣本,可能比直接把優化火力開大更穩。這種做法不一定最炫,但常常更實用。

限制與還沒回答的問題

這篇摘要的限制也很明顯。它沒有說明用了多少種程式語言,也沒有列出來源語言和目標語言是哪些。各語言家族之間是否都能同樣受益,摘要裡也看不出來。

另一個現實限制是,Parallel programs 本身不容易取得。對低資源語言來說,功能等價、又彼此對齊的程式資料可能比一般訓練資料更稀缺。換句話說,這個方法雖然概念清楚,但資料建置本身可能就是門檻。

此外,作者的表示分析很有說服力,但還不能算鐵證。功能相近的程式在 latent space 更靠近,確實和更好的轉移能力一致,但這不代表已經完全證明因果關係。作者目前的說法比較像是提出一個合理機制,後續還需要更多驗證。

即使如此,這篇工作仍然有一個很實際的提醒:code RL 的成敗,不只看 reward 怎麼設,也不只看 rollout 多漂亮。若你想讓模型真的跨語言,可能得先在 RL 之前,把它的語意表示往「功能」而不是「語法」的方向推。