代碼模型自我進化超越GPT-4o蒸餾!UIUC伯克利等提出自對齊方法 | NIPS 2024
LLM作為智能的基座,可以衍生出各種能力。
代碼能力就是其中一種:程序補全、注釋、優化、修bug、測試等等。
而想要充分發揮LLM的巨大潛力,指令調優(Instruction Tuning)是至關重要的一步。
當前,高質量指令數據主要有兩個來源:人工注釋和蒸餾。
前者很貴,后者則受到限制。于是,人們開始另辟蹊徑。
近日,來自UIUC、伯克利等機構的研究人員提出了SelfCodeAlign。
這篇工作首次證明了,可以通過自對齊(Self-Alignment)來獲得強大的代碼模型,不需要人工注釋或者蒸餾,而且效果更好!
論文地址:https://arxiv.org/pdf/2410.24198
SelfCodeAlign在整個數據生成過程中,使用相同的基礎模型進行推理,分為三步:
首先,從高質量的種子片段中提取不同的編碼概念,以生成新任務。
然后,對每個任務的多個響應進行采樣,將每個響應與測試用例配對,并在沙盒環境中對其進行驗證。
最后,選擇驗證通過的示例來進行指令調優。
SelfCodeAlign是第一個完全透明的pipeline,使用純自生成的指令數據對基礎代碼模型進行自對齊。
實驗表明,使用SelfCodeAlign對CodeQwen1.5-7B進行指令微調,在HumanEval+上實現了67.1 pass@1,超過了參數量大10倍的CodeLlama-70B-Instruct。
在全部的三項基準測試(代碼生成、數據科學編程、代碼編輯)中,SelfCodeAlign都戰勝了之前最先進的指令微調方法OctoPack。
此外,在HumanEval+上,SelfCodeAlign的性能超越了基于GPT-3.5-Turbo的蒸餾方法(包括 OSS-Instruct(61.6)和Evol-Instruct(59.1)),甚至打敗了GPT-4o的直接輸出蒸餾(65.9)!
這意味著,從模型自己的數據分布對齊中學習,可能勝于使用強大的teacher模型。
SelfCodeAlign適用于各種規模(從3B到33B)的LLM,比如StarCoder2-Struct就是以此為基礎創建的(base model為StarCoder2-15B)。
自對齊代碼生成
下圖以StarCoder2-15B的指令調優過程為例,展示了SelfCodeAlign的流程:
種子選擇
SelfCodeAlign首先從The Stack V1中收集一組種子代碼片段。
此步驟中,確保種子片段多樣化且高質量至關重要,它們將用作生成說明和響應的起點。
為了收集種子片段,研究人員從The Stack V1中提取所有帶有文檔字符串的Python函數,然后應用一系列過濾規則來確保種子片段的質量。
通過運行Pyright類型檢查器、刪除基準項、過濾掉文檔質量差的函數,以及刪除幾乎重復的函數,總共從5M個函數中過濾出250k個Python函數。
概念生成
收集種子函數后,開始執行Self-OSS-Instruct,對OSS-Instruct的自對齊進行修改,以生成不同的指令。
具體來說,這里采用上下文學習(In-context learning)讓基礎模型從給定的種子代碼片段中自行生成指令。
### System : I - > R
You are an extremely intelligent AI coding assistant . Please provide an accurate and reliable response to each user instruction . After delivering your response , verify its consistency and correctness by writing a series of executable tests .
### System : C - > I
Create a series of independent coding tasks that are original , distinct , diverse , and high - quality , fostering logical thinking . Each task must adhere to specified properties :
- category : the type of task ( e . g . , function implementation , class implementation , or program implementation )
- language : the programming language to be used
- difficulty : the complexity level of the task ( e . g . , easy , medium , or hard )
- concepts : fundamental principles and techniques the task is designed to incorporate , which developers must understand to effectively solve the task
Design the tasks so that the relevant concepts emerge naturally as the most appropriate solutions , without explicitly mentioning that a particular concept should be used .
作者使用了21個精心設計的示例來教模型如何工作:
指令生成過程分為以下兩個步驟:
概念提取:對于每個種子函數,提示基本模型生成函數中存在的代碼概念列表。代碼概念是指編程中使用的基本原則和技術,例如模式匹配和數據類型轉換。
指令生成:提示基本模型根據已識別的代碼概念和兩個附加屬性(難度和類別)自生成編碼任務,隨機抽樣以豐富生成指令的多樣性。
執行篩選
根據Self-OSS-Struct生成的指令,下一步是將每條指令與高質量teacher模型(比如GPT-4)相匹配。
不過,很多強大的商業模型不允許用蒸餾來做這種事,而且,teacher模型也不一定就更加厲害,畢竟老師也會犯錯誤,這時就會起到負作用。
作者建議,明確指示模型在產生與自然語言交錯的響應后,生成用于自我驗證的測試來自對齊基本模型。
具體來說,對于每個指令,基本模型對格式的多個輸出(響應、測試)進行采樣,然后過濾掉那些在沙箱環境中測試失敗的響應。然后,為每個指令隨機選擇一個驗證通過的響應,應用于最終的指令微調數據集。
實驗評估
本文全面評估了SelfCodeAlign在各種編碼任務中的表現,包括:
函數生成:給定自然語言描述,要求LLM生成一個自包含函數,并測試函數的正確性和效率。
類生成:給定一個包含類級和方法級信息的代碼框架,要求LLM生成類及其方法。
數據科學編程:給定數據科學任務的描述和部分代碼片段,要求LLM完成代碼片段以通過相應的測試。
文件級代碼編輯:提供文件內容后,要求模型按照自然語言指令編輯程序。
函數級代碼生成
公平起見,比較對象為類似規模的最先進的開源模型,基準測試選擇LiveCodeBench。
LiveCodeBench是無污染評估的基準,包含2023年5月至2024年2月期間的400項最新Python算法挑戰。這些任務來自Codeforce和LeetCode等網站,每個網站平均有20多個測試用例。
上表報告了在3個特定開始日期之后創建的問題的測試結果(pass@1)。SelfCodeAlign-CQ-7B的性能始終優于大多數基線模型。
此外,將開始日期向前移動對SelfCodeAlign-CQ-7B的影響很小,這表明模型不太可能受到污染。
類級代碼生成
這里使用ClassEval評估類級代碼生成的能力,ClassEval是100個類級Python代碼生成任務的集合,涵蓋100個類和410個方法,平均每個類33個測試,每個方法有8個測試。
作者將最大上下文大小設置為2048個token,測試了三種生成策略中每個模型的最佳類級pass@1(以及相應的方法級pass@1):
1. 整體生成:在給定類框架的情況下生成整個類;
2. 增量生成:將早期生成的方法放在提示符中來迭代生成類方法;
3. 組合生成:獨立生成每個類方法,不查看其他方法。
上表中的類級pass@1需要同時生成正確的類和方法,而方法級pass@1僅檢查生成的方法是否能通過方法級測試。
上表的結果顯示,就類級性能而言,SelfCodeAlign-CQ-7B是表現最好的,不論是相比于開源指令微調模型,還是使用未知或專有指令微調數據的模型。
數據科學
DS-1000包含7個流行的Python數據科學庫中1000個現實數據科學挑戰。在這個基準測試中,模型必須完成部分代碼片段才能解決問題。
上表顯示,盡管SelfCodeAlign-CQ-7B只使用了有限的數據科學代碼進行訓練,但在與一眾模型的比較中仍然表現出色。
代碼編輯
代碼編輯任務選用CanItEdit作為基準測試,該基準測試由三種類型的210個代碼編輯任務(每種類型70個任務)組成:糾正(修復錯誤)、自適應(添加新功能)和完善(改進現有功能)。
對于每個任務,模型需要以原始代碼片段和描述所需代碼更改的自然語言指令作為輸入,生成滿足指令的代碼片段。遵循原始基準測試中的設置,在0.2的溫度下為每個任務進行20次測試。
上表報告了每種類型的pass@1以及所有任務的平均成績。盡管沒有專門針對代碼編輯進行調優,但SelfCodeAlign-CQ-7B在CanItEdit上表現出強大的性能,實現了39.0%的pass@1,優于除CodeQwen1.5-Chat以外的所有模型。