代碼模型自我進化超越GPT-4o蒸餾!UIUC伯克利等提出自對齊方法 | NIPS 2024
新智元報道
編輯:alan
【新智元導讀】代碼模型可以自己進化,利用自身生成的數據來進行指令調優,效果超越GPT-4o直接蒸餾!
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)讓基礎模型從給定的種子代碼片段中自行生成指令。
作者使用了21個精心設計的示例來教模型如何工作:
指令生成過程分爲以下兩個步驟:
概念提取:對於每個種子函數,提示基本模型生成函數中存在的代碼概念列表。代碼概念是指編程中使用的基本原則和技術,例如模式匹配和數據類型轉換。
指令生成:提示基本模型根據已識別的代碼概念和兩個附加屬性(難度和類別)自生成編碼任務,隨機抽樣以豐富生成指令的多樣性。
執行篩選
根據Self-OSS-Struct生成的指令,下一步是將每條指令與高質量teacher模型(比如GPT-4)相匹配。
不過,很多強大的商業模型不允許用蒸餾來做這種事,而且,teacher模型也不一定就更加厲害,畢竟老師也會犯錯誤,這時就會起到負作用。
作者建議,明確指示模型在產生與自然語言交錯的響應後,生成用於自我驗證的測試來自對齊基本模型。
具體來說,對於每個指令,基本模型對格式的多個輸出(響應、測試)進行採樣,然後過濾掉那些在沙箱環境中測試失敗的響應。然後,爲每個指令隨機選擇一個驗證通過的響應,應用於最終的指令微調數據集。
實驗評估
本文全面評估了SelfCodeAlign在各種編碼任務中的表現,包括:
函數級代碼生成
公平起見,比較對象爲類似規模的最先進的開源模型,基準測試選擇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):
上表中的類級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以外的所有模型。
參考資料:
https://x.com/YuxiangWei9/status/1852421529897972207