微軟原WizardLM團隊:程式碼大模型WarriorCoder,效能新SOTA
机器之心發表於2025-03-02
AIxiv專欄是機器之心釋出學術、技術內容的欄目。過去數年,機器之心AIxiv專欄接收報導了2000多篇內容,覆蓋全球各大高校與企業的頂級實驗室,有效促進了學術交流與傳播。如果您有優秀的工作想要分享,歡迎投稿或者聯絡報導。投稿郵箱:liyazhou@jiqizhixin.com;zhaoyunfeng@jiqizhixin.com

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