微軟原WizardLM團(tuán)隊(duì):代碼大模型WarriorCoder,性能新SOTA
- 論文標(biāo)題:WarriorCoder: Learning from Expert Battles to Augment Code Large Language Models
- 論文鏈接:https://arxiv.org/pdf/2412.17395
01 背景
近年來,大型語言模型(LLMs)在代碼相關(guān)的任務(wù)上展現(xiàn)了驚人的表現(xiàn),各種代碼大模型層出不窮。這些成功的案例表明,在大規(guī)模代碼數(shù)據(jù)上進(jìn)行預(yù)訓(xùn)練可以顯著提升模型的核心編程能力。除了預(yù)訓(xùn)練外,一些通過 instruction 數(shù)據(jù)對 LLM 進(jìn)行 post-training 的方法,也使得模型在對指令的理解和回答的質(zhì)量等方面取得了顯著提高。然而,post-training 的效果在很大程度上依賴于可用的高質(zhì)量數(shù)據(jù),但是數(shù)據(jù)的收集和注釋存在著不小的挑戰(zhàn)。
為了解決上述挑戰(zhàn),一些方法設(shè)計(jì)了各種數(shù)據(jù)飛輪來生成 instruction 數(shù)據(jù),如 Self-Instruct,Evol-Instruct 等。這些方法通過多種數(shù)據(jù)增強(qiáng)手段來構(gòu)建 instruction 數(shù)據(jù),在這些數(shù)據(jù)上進(jìn)行訓(xùn)練可以有效提升模型的代碼生成能力。然而,如圖 1 所示,這些方法仍然依賴于對現(xiàn)存數(shù)據(jù)集進(jìn)行擴(kuò)展并需要調(diào)用私有 LLM(如 GPT-3.5、GPT-4 等),使得數(shù)據(jù)收集成本較高。此外,有限的數(shù)據(jù)來源和用于注釋的 LLM 也限制了數(shù)據(jù)的多樣性,并繼承了有限的私有 LLM 本身固有的系統(tǒng)偏見。
圖 1
本文提出了 WarriorCoder,一種全新的代碼大模型的數(shù)據(jù)飛輪訓(xùn)練范式,模型通過學(xué)習(xí)專家對抗的方式來集成各個(gè)代碼專家大模型的優(yōu)點(diǎn)。如圖 1 所示,各個(gè)代碼專家大模型兩兩對戰(zhàn),攻擊者在其自身的專業(yè)領(lǐng)域內(nèi)挑戰(zhàn)對手,目標(biāo)模型則向這些對戰(zhàn)中的勝者學(xué)習(xí)。與之前的方法不同,之前的方法大多都依賴現(xiàn)有開源數(shù)據(jù)集,將這些數(shù)據(jù)集做為種子數(shù)據(jù)去合成和增強(qiáng),而 warriorCoder 是從 0 到 1 的生成數(shù)據(jù)不需要種子數(shù)據(jù),并且該方法可以融合多個(gè)代碼專家大模型的優(yōu)勢,而不是僅僅蒸餾個(gè)別模型的優(yōu)勢。此外,本文提出的方法消除了在數(shù)據(jù)收集過程中對人工參與和私有 LLM 的依賴,可以以極低成本收集高質(zhì)量、多樣化的訓(xùn)練數(shù)據(jù)。實(shí)驗(yàn)結(jié)果表明,warriorCoder 不僅僅是在代碼生成任務(wù)中達(dá)到了當(dāng)前的 SOTA,還在 code reasoning 和 libraries using 等 benchmark 上也取得了卓越的成績,可謂是代碼六邊形戰(zhàn)士。
02 方法
本文構(gòu)建了一個(gè)代碼大模型的競技場。在這里,最先進(jìn)的代碼專家大模型相互對抗,每個(gè)模型利用其已經(jīng)掌握的知識挑戰(zhàn)其他模型,而其余模型則擔(dān)任裁判評估對抗結(jié)果。目標(biāo)模型隨后從這些對抗中的勝者學(xué)習(xí),逐步整合所有競爭者的優(yōu)勢。本文將參賽者(代碼專家大模型)視為一個(gè)組,通過組內(nèi)相對優(yōu)勢答案來優(yōu)化模型,這一點(diǎn)與 GRPO 有著異曲同工之妙。
圖 2
2.1 Competitors Setting
參賽者的能力決定了 WarriorCoder 的最終表現(xiàn)。理論上,從更大、更強(qiáng)的參賽者池中獲得的訓(xùn)練數(shù)據(jù)多樣性更強(qiáng)、質(zhì)量更高,最終訓(xùn)練出來的模型的性能也就越好。在每一輪競技場中,只有一對代碼專家被選為競爭者,其他的則作為裁判。本文從 BigCodeBench 排行榜中選取了五個(gè) 75B 以內(nèi)的先進(jìn)大模型 ——Athene-V2-Chat、DeepSeek-Coder-V2-Lite-Instruct、Llama-3.3-70B-Instruct、Qwen2.5-72B-Instruct 和 QwQ-32B-Preview。值得注意的是,這五個(gè)大模型均為開源大模型,WarriorCoder 僅基于這些開源大模型的對抗就得到了優(yōu)異的性能。當(dāng)然,WarriorCoder 也能夠從強(qiáng)大的私有大模型中學(xué)習(xí)。
2.2 Instruction Mining from Scratch
對于一對對手 ——A 和 B(其中 A 為攻擊者,B 為防守者),對抗的第一步是在 A 擅長的領(lǐng)域挑戰(zhàn) B,這就需要了解 A 在訓(xùn)練過程中學(xué)到了什么。然而,幾乎當(dāng)前所有的開源大模型都未公布其核心訓(xùn)練數(shù)據(jù),這使得攻擊者擅長的知識變得極為困難。受 Magpie 的啟發(fā),本文設(shè)計(jì)了一種基于對話補(bǔ)全的方式來挖掘大模型已掌握的能力。以 Qwen2.5 為例,如果要其生成一個(gè)快速排序算法,則完整的 prompt 格式如圖 3 所示。Prompt 應(yīng)包括 system content、user content 以及與格式有關(guān)的特殊 token,如 “<|im_start|>”、“<|im_end|>” 等。
圖 3
而如果僅將前綴部分(本身無任何具體意義,如圖 4 所示)輸入模型,利用模型的補(bǔ)全能力就可以得到用戶指令(user content)。
圖 4
通過這種方式,在不同的生成參數(shù)配置下(例如不同的溫度值和 top-p 值)就可以收集到模型已經(jīng)學(xué)習(xí)到的 instruction 數(shù)據(jù)。與傳統(tǒng)的數(shù)據(jù)合成不同,本文收集的 instruction 數(shù)據(jù)不是由模型合成的,而是直接從模型的分布中進(jìn)行采樣得到的,這避免了模式過擬合、輸出分布偏移等問題。然而,這些指令可能會(huì)重復(fù)、有歧義、不清晰或過于簡單。為了解決這些問題,我們對數(shù)據(jù)進(jìn)行去重,并采用裁判模型來評估其難度。本文將難度分為四個(gè)等級:Excellent、Good、Average、Poor。最終僅使用 Excellent 和 Good 兩個(gè)等級的指令,并使用 KcenterGreedy 算法對 instruction 數(shù)據(jù)進(jìn)行進(jìn)一步的壓縮。
2.3 Win-Loss Decision
挑戰(zhàn)者和防御者都要根據(jù) instruction 數(shù)據(jù)生成回答,并由裁判(剩余的模型)投票決定輸贏:
然而,僅依賴于 \textit {局部得分} 來選擇獲勝者可能會(huì)帶來偶然性問題。由于投票會(huì)受到隨機(jī)性或評審者偏見等因素的影響,在某些指令下較弱的模型可能會(huì)比較強(qiáng)的模型獲得更多的投票,即便其回答并沒有真正比較強(qiáng)的模型更好。
為了解決這一問題,本文在決策過程中同時(shí)考慮局部偶然性和全局一致性。本文引入了全局得分的概念 ——Elo 評級。它能更全面地反映模型相對表現(xiàn)的變化,涵蓋不同時(shí)間和多次評估中的表現(xiàn)。通過引入 Elo 評級,可以在評估過程中同時(shí)考慮模型在單場比賽中的局部表現(xiàn)和在多輪比賽中的全局表現(xiàn),從而提供一個(gè)更為穩(wěn)健和準(zhǔn)確的模型綜合能力度量,這有助于降低較弱模型由于偶然的、不具代表性的投票而獲勝的風(fēng)險(xiǎn)。
最后的 response 分?jǐn)?shù)由 Elo 評級和裁判投票加權(quán)得到:
每一個(gè) response 都要和所有對手的 response 比較,因此該分?jǐn)?shù)代表了當(dāng)前 response 的組內(nèi)相對優(yōu)勢。
2.4 Final Training
本文得到的數(shù)據(jù)格式為 instruction、來自于各個(gè)參賽者的 response、各 response 對應(yīng)的分?jǐn)?shù)。這種數(shù)據(jù)格式可以支持多種 post-training 方法,比如 SFT、DPO、KTO 等等。本文采用 SFT,將組內(nèi)分?jǐn)?shù)最高的 response 作為 gold output,使得 WarriorCoder 在訓(xùn)練中可以融合各個(gè)參賽者的優(yōu)勢,集百家之長。
03 實(shí)驗(yàn)
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ù)指標(biāo)上表現(xiàn)最優(yōu),甚至超越了 15B 和 34B 等更大量級的模型。這也證明了本文提出的方法具有良好的泛化性,可以讓模型從多個(gè)代碼專家大模型處獲得多種不同的能力。
表 2
表 3
3.2 數(shù)據(jù)分析
本文還對所構(gòu)造的訓(xùn)練數(shù)據(jù)進(jìn)行了分析,從 Dependence、Diversity、Difficulty 三個(gè)角度進(jìn)行研究。
Dependence
此前的工作往往會(huì)基于一些現(xiàn)有的代碼數(shù)據(jù)集(如)進(jìn)行擴(kuò)展、數(shù)據(jù)增強(qiáng),而本文則是完全從零開始構(gòu)造全新的數(shù)據(jù)。如圖 5 所示,作者計(jì)算了訓(xùn)練數(shù)據(jù)與兩個(gè)常用代碼數(shù)據(jù)集的重疊程度(rouge 指標(biāo)),絕大多數(shù)指令與 codealpaca 和 codeultrafeedback 的 ROUGE 得分低于 0.3,表明它們與現(xiàn)有數(shù)據(jù)集中的指令在內(nèi)容上存在較大差異。值得注意的是,挖掘出的指令中沒有任何一項(xiàng) ROUGE 指標(biāo)超過 0.6,這進(jìn)一步證明了這些指令來源于專家大模型的內(nèi)部分布,而非現(xiàn)有訓(xùn)練數(shù)據(jù)的簡單復(fù)制或擴(kuò)展。因此,這些指令更新穎、具有更高的獨(dú)立性,這對于訓(xùn)練尤為寶貴。
圖 5
Diversity
表 4 展示了訓(xùn)練數(shù)據(jù)的構(gòu)成,涵蓋了 7 種不同的 code 任務(wù),這也是為什么 WarriorCoder 能夠在多個(gè) benchmark 上表現(xiàn)優(yōu)異的原因。值得注意的是 code reasoning 僅占比 2.9% 就使得 WarriorCoder 在相關(guān) benchmark 上具有驚人表現(xiàn),這說明了本文提出的方法具有很大潛力,如果針對模型的弱點(diǎn)定向挖掘數(shù)據(jù)可以讓模型能力更上一層樓。此外,圖 6 的熱力圖也展示了參賽者對抗結(jié)果,即便是再強(qiáng)的模型也終究有表現(xiàn)不好的時(shí)候,而 WarriorCoder 僅向當(dāng)前指令下分?jǐn)?shù)最高的 winner response 學(xué)習(xí)。
表 4
圖 6
Difficulty
圖 7 展示了不同模型產(chǎn)生的指令的難度比例。大多數(shù)指令的難度處于 good 等級,得分在 6 到 8 之間。被評為 excellent(得分 9-10)的指令僅占數(shù)據(jù)集的一小部分,表明高度復(fù)雜或高級的任務(wù)相對較為稀少。作者將得分低于 6 的指令被排除在訓(xùn)練集之外,因?yàn)樗鼈兺催^于簡單,要么過于模糊,這樣的指令會(huì)對訓(xùn)練階段有害,甚至可能削弱模型的性能和泛化能力。
圖 7
04 相關(guān)資源
雖然作者當(dāng)前并未開源模型,但是我們發(fā)現(xiàn)已經(jīng)有人復(fù)現(xiàn)了作者的工作,地址如下:
項(xiàng)目鏈接:https://huggingface.co/HuggingMicah/warriorcoder_reproduce