微軟原WizardLM團隊:代碼大模型WarriorCoder,性能新SOTA

- 論文標題:WarriorCoder: Learning from Expert Battles to Augment Code Large Language Models
- 論文鏈接:https://arxiv.org/pdf/2412.17395
01 背景
近年來,大型語言模型(LLMs)在代碼相關(guān)的任務上展現(xiàn)了驚人的表現(xiàn),各種代碼大模型層出不窮。這些成功的案例表明,在大規(guī)模代碼數(shù)據(jù)上進行預訓練可以顯著提升模型的核心編程能力。除了預訓練外,一些通過 instruction 數(shù)據(jù)對 LLM 進行 post-training 的方法,也使得模型在對指令的理解和回答的質(zhì)量等方面取得了顯著提高。然而,post-training 的效果在很大程度上依賴于可用的高質(zhì)量數(shù)據(jù),但是數(shù)據(jù)的收集和注釋存在著不小的挑戰(zhàn)。
為了解決上述挑戰(zhàn),一些方法設(shè)計了各種數(shù)據(jù)飛輪來生成 instruction 數(shù)據(jù),如 Self-Instruct,Evol-Instruct 等。這些方法通過多種數(shù)據(jù)增強手段來構(gòu)建 instruction 數(shù)據(jù),在這些數(shù)據(jù)上進行訓練可以有效提升模型的代碼生成能力。然而,如圖 1 所示,這些方法仍然依賴于對現(xiàn)存數(shù)據(jù)集進行擴展并需要調(diào)用私有 LLM(如 GPT-3.5、GPT-4 等),使得數(shù)據(jù)收集成本較高。此外,有限的數(shù)據(jù)來源和用于注釋的 LLM 也限制了數(shù)據(jù)的多樣性,并繼承了有限的私有 LLM 本身固有的系統(tǒng)偏見。

圖 1
本文提出了 WarriorCoder,一種全新的代碼大模型的數(shù)據(jù)飛輪訓練范式,模型通過學習專家對抗的方式來集成各個代碼專家大模型的優(yōu)點。如圖 1 所示,各個代碼專家大模型兩兩對戰(zhàn),攻擊者在其自身的專業(yè)領(lǐng)域內(nèi)挑戰(zhàn)對手,目標模型則向這些對戰(zhàn)中的勝者學習。與之前的方法不同,之前的方法大多都依賴現(xiàn)有開源數(shù)據(jù)集,將這些數(shù)據(jù)集做為種子數(shù)據(jù)去合成和增強,而 warriorCoder 是從 0 到 1 的生成數(shù)據(jù)不需要種子數(shù)據(jù),并且該方法可以融合多個代碼專家大模型的優(yōu)勢,而不是僅僅蒸餾個別模型的優(yōu)勢。此外,本文提出的方法消除了在數(shù)據(jù)收集過程中對人工參與和私有 LLM 的依賴,可以以極低成本收集高質(zhì)量、多樣化的訓練數(shù)據(jù)。實驗結(jié)果表明,warriorCoder 不僅僅是在代碼生成任務中達到了當前的 SOTA,還在 code reasoning 和 libraries using 等 benchmark 上也取得了卓越的成績,可謂是代碼六邊形戰(zhàn)士。
02 方法
本文構(gòu)建了一個代碼大模型的競技場。在這里,最先進的代碼專家大模型相互對抗,每個模型利用其已經(jīng)掌握的知識挑戰(zhàn)其他模型,而其余模型則擔任裁判評估對抗結(jié)果。目標模型隨后從這些對抗中的勝者學習,逐步整合所有競爭者的優(yōu)勢。本文將參賽者(代碼專家大模型)視為一個組,通過組內(nèi)相對優(yōu)勢答案來優(yōu)化模型,這一點與 GRPO 有著異曲同工之妙。

圖 2
2.1 Competitors Setting
參賽者的能力決定了 WarriorCoder 的最終表現(xiàn)。理論上,從更大、更強的參賽者池中獲得的訓練數(shù)據(jù)多樣性更強、質(zhì)量更高,最終訓練出來的模型的性能也就越好。在每一輪競技場中,只有一對代碼專家被選為競爭者,其他的則作為裁判。本文從 BigCodeBench 排行榜中選取了五個 75B 以內(nèi)的先進大模型 ——Athene-V2-Chat、DeepSeek-Coder-V2-Lite-Instruct、Llama-3.3-70B-Instruct、Qwen2.5-72B-Instruct 和 QwQ-32B-Preview。值得注意的是,這五個大模型均為開源大模型,WarriorCoder 僅基于這些開源大模型的對抗就得到了優(yōu)異的性能。當然,WarriorCoder 也能夠從強大的私有大模型中學習。
2.2 Instruction Mining from Scratch
對于一對對手 ——A 和 B(其中 A 為攻擊者,B 為防守者),對抗的第一步是在 A 擅長的領(lǐng)域挑戰(zhàn) B,這就需要了解 A 在訓練過程中學到了什么。然而,幾乎當前所有的開源大模型都未公布其核心訓練數(shù)據(jù),這使得攻擊者擅長的知識變得極為困難。受 Magpie 的啟發(fā),本文設(shè)計了一種基于對話補全的方式來挖掘大模型已掌握的能力。以 Qwen2.5 為例,如果要其生成一個快速排序算法,則完整的 prompt 格式如圖 3 所示。Prompt 應包括 system content、user content 以及與格式有關(guān)的特殊 token,如 “<|im_start|>”、“<|im_end|>” 等。

圖 3
而如果僅將前綴部分(本身無任何具體意義,如圖 4 所示)輸入模型,利用模型的補全能力就可以得到用戶指令(user content)。

圖 4
通過這種方式,在不同的生成參數(shù)配置下(例如不同的溫度值和 top-p 值)就可以收集到模型已經(jīng)學習到的 instruction 數(shù)據(jù)。與傳統(tǒng)的數(shù)據(jù)合成不同,本文收集的 instruction 數(shù)據(jù)不是由模型合成的,而是直接從模型的分布中進行采樣得到的,這避免了模式過擬合、輸出分布偏移等問題。然而,這些指令可能會重復、有歧義、不清晰或過于簡單。為了解決這些問題,我們對數(shù)據(jù)進行去重,并采用裁判模型來評估其難度。本文將難度分為四個等級:Excellent、Good、Average、Poor。最終僅使用 Excellent 和 Good 兩個等級的指令,并使用 KcenterGreedy 算法對 instruction 數(shù)據(jù)進行進一步的壓縮。
2.3 Win-Loss Decision
挑戰(zhàn)者和防御者都要根據(jù) instruction 數(shù)據(jù)生成回答,并由裁判(剩余的模型)投票決定輸贏:

然而,僅依賴于 \textit {局部得分} 來選擇獲勝者可能會帶來偶然性問題。由于投票會受到隨機性或評審者偏見等因素的影響,在某些指令下較弱的模型可能會比較強的模型獲得更多的投票,即便其回答并沒有真正比較強的模型更好。
為了解決這一問題,本文在決策過程中同時考慮局部偶然性和全局一致性。本文引入了全局得分的概念 ——Elo 評級。它能更全面地反映模型相對表現(xiàn)的變化,涵蓋不同時間和多次評估中的表現(xiàn)。通過引入 Elo 評級,可以在評估過程中同時考慮模型在單場比賽中的局部表現(xiàn)和在多輪比賽中的全局表現(xiàn),從而提供一個更為穩(wěn)健和準確的模型綜合能力度量,這有助于降低較弱模型由于偶然的、不具代表性的投票而獲勝的風險。


最后的 response 分數(shù)由 Elo 評級和裁判投票加權(quán)得到:

每一個 response 都要和所有對手的 response 比較,因此該分數(shù)代表了當前 response 的組內(nèi)相對優(yōu)勢。
2.4 Final Training
本文得到的數(shù)據(jù)格式為 instruction、來自于各個參賽者的 response、各 response 對應的分數(shù)。這種數(shù)據(jù)格式可以支持多種 post-training 方法,比如 SFT、DPO、KTO 等等。本文采用 SFT,將組內(nèi)分數(shù)最高的 response 作為 gold output,使得 WarriorCoder 在訓練中可以融合各個參賽者的優(yōu)勢,集百家之長。
03 實驗
3.1 主要結(jié)果
表 1 顯示了 WarriorCoder 在 code generation benchmark 上的表現(xiàn)。與同類工作相比,WarriorCoder 在 HumanEval、HumanEval+、MBPP 和 MBPP + 上取得了 SOTA。值得注意的是,WarriorCoder 完全不需要私有大模型(如 GPT-4 等)就取得了驚艷的效果。

表 1
此外在 code reasoning benchmark 和 libraries using benchmark 上,WarriorCoder 也取得了卓越的成績。如表 2 和表 3 所示,WarriorCoder 在絕大多數(shù)指標上表現(xiàn)最優(yōu),甚至超越了 15B 和 34B 等更大量級的模型。這也證明了本文提出的方法具有良好的泛化性,可以讓模型從多個代碼專家大模型處獲得多種不同的能力。

表 2

表 3
3.2 數(shù)據(jù)分析
本文還對所構(gòu)造的訓練數(shù)據(jù)進行了分析,從 Dependence、Diversity、Difficulty 三個角度進行研究。
Dependence
此前的工作往往會基于一些現(xiàn)有的代碼數(shù)據(jù)集(如)進行擴展、數(shù)據(jù)增強,而本文則是完全從零開始構(gòu)造全新的數(shù)據(jù)。如圖 5 所示,作者計算了訓練數(shù)據(jù)與兩個常用代碼數(shù)據(jù)集的重疊程度(rouge 指標),絕大多數(shù)指令與 codealpaca 和 codeultrafeedback 的 ROUGE 得分低于 0.3,表明它們與現(xiàn)有數(shù)據(jù)集中的指令在內(nèi)容上存在較大差異。值得注意的是,挖掘出的指令中沒有任何一項 ROUGE 指標超過 0.6,這進一步證明了這些指令來源于專家大模型的內(nèi)部分布,而非現(xiàn)有訓練數(shù)據(jù)的簡單復制或擴展。因此,這些指令更新穎、具有更高的獨立性,這對于訓練尤為寶貴。

圖 5
Diversity
表 4 展示了訓練數(shù)據(jù)的構(gòu)成,涵蓋了 7 種不同的 code 任務,這也是為什么 WarriorCoder 能夠在多個 benchmark 上表現(xiàn)優(yōu)異的原因。值得注意的是 code reasoning 僅占比 2.9% 就使得 WarriorCoder 在相關(guān) benchmark 上具有驚人表現(xiàn),這說明了本文提出的方法具有很大潛力,如果針對模型的弱點定向挖掘數(shù)據(jù)可以讓模型能力更上一層樓。此外,圖 6 的熱力圖也展示了參賽者對抗結(jié)果,即便是再強的模型也終究有表現(xiàn)不好的時候,而 WarriorCoder 僅向當前指令下分數(shù)最高的 winner response 學習。

表 4

圖 6
Difficulty
圖 7 展示了不同模型產(chǎn)生的指令的難度比例。大多數(shù)指令的難度處于 good 等級,得分在 6 到 8 之間。被評為 excellent(得分 9-10)的指令僅占數(shù)據(jù)集的一小部分,表明高度復雜或高級的任務相對較為稀少。作者將得分低于 6 的指令被排除在訓練集之外,因為它們往往要么過于簡單,要么過于模糊,這樣的指令會對訓練階段有害,甚至可能削弱模型的性能和泛化能力。

圖 7
04 相關(guān)資源
雖然作者當前并未開源模型,但是我們發(fā)現(xiàn)已經(jīng)有人復現(xiàn)了作者的工作,地址如下:
項目鏈接:https://huggingface.co/HuggingMicah/warriorcoder_reproduce



































