代碼模型自我進(jìn)化超越GPT-4o蒸餾!UIUC伯克利等提出自對(duì)齊方法 | NIPS 2024
LLM作為智能的基座,可以衍生出各種能力。
代碼能力就是其中一種:程序補(bǔ)全、注釋、優(yōu)化、修bug、測(cè)試等等。
而想要充分發(fā)揮LLM的巨大潛力,指令調(diào)優(yōu)(Instruction Tuning)是至關(guān)重要的一步。
當(dāng)前,高質(zhì)量指令數(shù)據(jù)主要有兩個(gè)來(lái)源:人工注釋和蒸餾。
前者很貴,后者則受到限制。于是,人們開(kāi)始另辟蹊徑。
近日,來(lái)自UIUC、伯克利等機(jī)構(gòu)的研究人員提出了SelfCodeAlign。
這篇工作首次證明了,可以通過(guò)自對(duì)齊(Self-Alignment)來(lái)獲得強(qiáng)大的代碼模型,不需要人工注釋或者蒸餾,而且效果更好!
論文地址:https://arxiv.org/pdf/2410.24198
SelfCodeAlign在整個(gè)數(shù)據(jù)生成過(guò)程中,使用相同的基礎(chǔ)模型進(jìn)行推理,分為三步:
首先,從高質(zhì)量的種子片段中提取不同的編碼概念,以生成新任務(wù)。
然后,對(duì)每個(gè)任務(wù)的多個(gè)響應(yīng)進(jìn)行采樣,將每個(gè)響應(yīng)與測(cè)試用例配對(duì),并在沙盒環(huán)境中對(duì)其進(jìn)行驗(yàn)證。
最后,選擇驗(yàn)證通過(guò)的示例來(lái)進(jìn)行指令調(diào)優(yōu)。
SelfCodeAlign是第一個(gè)完全透明的pipeline,使用純自生成的指令數(shù)據(jù)對(duì)基礎(chǔ)代碼模型進(jìn)行自對(duì)齊。
實(shí)驗(yàn)表明,使用SelfCodeAlign對(duì)CodeQwen1.5-7B進(jìn)行指令微調(diào),在HumanEval+上實(shí)現(xiàn)了67.1 pass@1,超過(guò)了參數(shù)量大10倍的CodeLlama-70B-Instruct。
在全部的三項(xiàng)基準(zhǔn)測(cè)試(代碼生成、數(shù)據(jù)科學(xué)編程、代碼編輯)中,SelfCodeAlign都戰(zhàn)勝了之前最先進(jìn)的指令微調(diào)方法OctoPack。
此外,在HumanEval+上,SelfCodeAlign的性能超越了基于GPT-3.5-Turbo的蒸餾方法(包括 OSS-Instruct(61.6)和Evol-Instruct(59.1)),甚至打敗了GPT-4o的直接輸出蒸餾(65.9)!
這意味著,從模型自己的數(shù)據(jù)分布對(duì)齊中學(xué)習(xí),可能勝于使用強(qiáng)大的teacher模型。
SelfCodeAlign適用于各種規(guī)模(從3B到33B)的LLM,比如StarCoder2-Struct就是以此為基礎(chǔ)創(chuàng)建的(base model為StarCoder2-15B)。
自對(duì)齊代碼生成
下圖以StarCoder2-15B的指令調(diào)優(yōu)過(guò)程為例,展示了SelfCodeAlign的流程:
種子選擇
SelfCodeAlign首先從The Stack V1中收集一組種子代碼片段。
此步驟中,確保種子片段多樣化且高質(zhì)量至關(guān)重要,它們將用作生成說(shuō)明和響應(yīng)的起點(diǎn)。
為了收集種子片段,研究人員從The Stack V1中提取所有帶有文檔字符串的Python函數(shù),然后應(yīng)用一系列過(guò)濾規(guī)則來(lái)確保種子片段的質(zhì)量。
通過(guò)運(yùn)行Pyright類型檢查器、刪除基準(zhǔn)項(xiàng)、過(guò)濾掉文檔質(zhì)量差的函數(shù),以及刪除幾乎重復(fù)的函數(shù),總共從5M個(gè)函數(shù)中過(guò)濾出250k個(gè)Python函數(shù)。
概念生成
收集種子函數(shù)后,開(kāi)始執(zhí)行Self-OSS-Instruct,對(duì)OSS-Instruct的自對(duì)齊進(jìn)行修改,以生成不同的指令。
具體來(lái)說(shuō),這里采用上下文學(xué)習(xí)(In-context learning)讓基礎(chǔ)模型從給定的種子代碼片段中自行生成指令。
### 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個(gè)精心設(shè)計(jì)的示例來(lái)教模型如何工作:
指令生成過(guò)程分為以下兩個(gè)步驟:
概念提?。簩?duì)于每個(gè)種子函數(shù),提示基本模型生成函數(shù)中存在的代碼概念列表。代碼概念是指編程中使用的基本原則和技術(shù),例如模式匹配和數(shù)據(jù)類型轉(zhuǎn)換。
指令生成:提示基本模型根據(jù)已識(shí)別的代碼概念和兩個(gè)附加屬性(難度和類別)自生成編碼任務(wù),隨機(jī)抽樣以豐富生成指令的多樣性。
執(zhí)行篩選
根據(jù)Self-OSS-Struct生成的指令,下一步是將每條指令與高質(zhì)量teacher模型(比如GPT-4)相匹配。
不過(guò),很多強(qiáng)大的商業(yè)模型不允許用蒸餾來(lái)做這種事,而且,teacher模型也不一定就更加厲害,畢竟老師也會(huì)犯錯(cuò)誤,這時(shí)就會(huì)起到負(fù)作用。
作者建議,明確指示模型在產(chǎn)生與自然語(yǔ)言交錯(cuò)的響應(yīng)后,生成用于自我驗(yàn)證的測(cè)試來(lái)自對(duì)齊基本模型。
具體來(lái)說(shuō),對(duì)于每個(gè)指令,基本模型對(duì)格式的多個(gè)輸出(響應(yīng)、測(cè)試)進(jìn)行采樣,然后過(guò)濾掉那些在沙箱環(huán)境中測(cè)試失敗的響應(yīng)。然后,為每個(gè)指令隨機(jī)選擇一個(gè)驗(yàn)證通過(guò)的響應(yīng),應(yīng)用于最終的指令微調(diào)數(shù)據(jù)集。
實(shí)驗(yàn)評(píng)估
本文全面評(píng)估了SelfCodeAlign在各種編碼任務(wù)中的表現(xiàn),包括:
函數(shù)生成:給定自然語(yǔ)言描述,要求LLM生成一個(gè)自包含函數(shù),并測(cè)試函數(shù)的正確性和效率。
類生成:給定一個(gè)包含類級(jí)和方法級(jí)信息的代碼框架,要求LLM生成類及其方法。
數(shù)據(jù)科學(xué)編程:給定數(shù)據(jù)科學(xué)任務(wù)的描述和部分代碼片段,要求LLM完成代碼片段以通過(guò)相應(yīng)的測(cè)試。
文件級(jí)代碼編輯:提供文件內(nèi)容后,要求模型按照自然語(yǔ)言指令編輯程序。
函數(shù)級(jí)代碼生成
公平起見(jiàn),比較對(duì)象為類似規(guī)模的最先進(jìn)的開(kāi)源模型,基準(zhǔn)測(cè)試選擇LiveCodeBench。
LiveCodeBench是無(wú)污染評(píng)估的基準(zhǔn),包含2023年5月至2024年2月期間的400項(xiàng)最新Python算法挑戰(zhàn)。這些任務(wù)來(lái)自Codeforce和LeetCode等網(wǎng)站,每個(gè)網(wǎng)站平均有20多個(gè)測(cè)試用例。
上表報(bào)告了在3個(gè)特定開(kāi)始日期之后創(chuàng)建的問(wèn)題的測(cè)試結(jié)果(pass@1)。SelfCodeAlign-CQ-7B的性能始終優(yōu)于大多數(shù)基線模型。
此外,將開(kāi)始日期向前移動(dòng)對(duì)SelfCodeAlign-CQ-7B的影響很小,這表明模型不太可能受到污染。
類級(jí)代碼生成
這里使用ClassEval評(píng)估類級(jí)代碼生成的能力,ClassEval是100個(gè)類級(jí)Python代碼生成任務(wù)的集合,涵蓋100個(gè)類和410個(gè)方法,平均每個(gè)類33個(gè)測(cè)試,每個(gè)方法有8個(gè)測(cè)試。
作者將最大上下文大小設(shè)置為2048個(gè)token,測(cè)試了三種生成策略中每個(gè)模型的最佳類級(jí)pass@1(以及相應(yīng)的方法級(jí)pass@1):
1. 整體生成:在給定類框架的情況下生成整個(gè)類;
2. 增量生成:將早期生成的方法放在提示符中來(lái)迭代生成類方法;
3. 組合生成:獨(dú)立生成每個(gè)類方法,不查看其他方法。
上表中的類級(jí)pass@1需要同時(shí)生成正確的類和方法,而方法級(jí)pass@1僅檢查生成的方法是否能通過(guò)方法級(jí)測(cè)試。
上表的結(jié)果顯示,就類級(jí)性能而言,SelfCodeAlign-CQ-7B是表現(xiàn)最好的,不論是相比于開(kāi)源指令微調(diào)模型,還是使用未知或?qū)S兄噶钗⒄{(diào)數(shù)據(jù)的模型。
數(shù)據(jù)科學(xué)
DS-1000包含7個(gè)流行的Python數(shù)據(jù)科學(xué)庫(kù)中1000個(gè)現(xiàn)實(shí)數(shù)據(jù)科學(xué)挑戰(zhàn)。在這個(gè)基準(zhǔn)測(cè)試中,模型必須完成部分代碼片段才能解決問(wèn)題。
上表顯示,盡管SelfCodeAlign-CQ-7B只使用了有限的數(shù)據(jù)科學(xué)代碼進(jìn)行訓(xùn)練,但在與一眾模型的比較中仍然表現(xiàn)出色。
代碼編輯
代碼編輯任務(wù)選用CanItEdit作為基準(zhǔn)測(cè)試,該基準(zhǔn)測(cè)試由三種類型的210個(gè)代碼編輯任務(wù)(每種類型70個(gè)任務(wù))組成:糾正(修復(fù)錯(cuò)誤)、自適應(yīng)(添加新功能)和完善(改進(jìn)現(xiàn)有功能)。
對(duì)于每個(gè)任務(wù),模型需要以原始代碼片段和描述所需代碼更改的自然語(yǔ)言指令作為輸入,生成滿足指令的代碼片段。遵循原始基準(zhǔn)測(cè)試中的設(shè)置,在0.2的溫度下為每個(gè)任務(wù)進(jìn)行20次測(cè)試。
上表報(bào)告了每種類型的pass@1以及所有任務(wù)的平均成績(jī)。盡管沒(méi)有專門針對(duì)代碼編輯進(jìn)行調(diào)優(yōu),但SelfCodeAlign-CQ-7B在CanItEdit上表現(xiàn)出強(qiáng)大的性能,實(shí)現(xiàn)了39.0%的pass@1,優(yōu)于除CodeQwen1.5-Chat以外的所有模型。