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