將偏好學(xué)習(xí)引入模型訓(xùn)練,北大李戈團(tuán)隊(duì)新框架,可顯著提升代碼準(zhǔn)確性與執(zhí)行效率
代碼模型SFT對(duì)齊后,缺少進(jìn)一步偏好學(xué)習(xí)的問(wèn)題有解了。
北大李戈教授團(tuán)隊(duì)與字節(jié)合作,在模型訓(xùn)練過(guò)程中引入偏好學(xué)習(xí),提出了一個(gè)全新的代碼生成優(yōu)化框架——CodeDPO。
在部分模型上,相比于單獨(dú)使用SFT,CodeDPO能夠?qū)⒛P偷腍umanEval得分再多提升10個(gè)百分點(diǎn),最高增幅接近1/3。
圖片
監(jiān)督微調(diào)(SFT)等現(xiàn)有訓(xùn)練方法,盡管提升了代碼質(zhì)量,但在代碼生成過(guò)程中存在關(guān)鍵局限——沒(méi)有完全訓(xùn)練模型在正確與錯(cuò)誤解決方案之間做出偏好選擇。
當(dāng)采用SFT方法訓(xùn)練模型時(shí),隨著偏好輸出的可能性增加,生成不理想輸出的概率也隨之上升,導(dǎo)致性能出現(xiàn)瓶頸。
為解決這一問(wèn)題,北京大學(xué)李戈教授團(tuán)隊(duì)與字節(jié)跳動(dòng)合作,CodeDPO因此而生。
該框架將偏好學(xué)習(xí)融入代碼模型訓(xùn)練中,利用代碼自驗(yàn)證機(jī)制,顯著提升代碼生成的準(zhǔn)確性和執(zhí)行效率。
SFT對(duì)代碼生成效果的提升存在局限
代碼生成任務(wù),即根據(jù)自然語(yǔ)言描述自動(dòng)生成代碼,正日益受到廣泛關(guān)注。
大模型在大規(guī)模數(shù)據(jù)集上進(jìn)行了充分的訓(xùn)練,在這一領(lǐng)域展現(xiàn)出強(qiáng)大的能力。
這些代碼大模型通常會(huì)進(jìn)一步通過(guò)指令監(jiān)督微調(diào)(SFT)等方法進(jìn)行微調(diào),以最大限度提升其代碼生成能力。
然而,盡管SFT方法提升了模型的代碼生成效果,但其并未完全訓(xùn)練模型在正確與錯(cuò)誤解決方案之間做出偏好選擇。
以Phi-2-2.7B模型為例,在其后訓(xùn)練過(guò)程中,不同正確性和效率的代碼生成概率的變化情況如下圖所示。
圖片
傳統(tǒng)的SFT策略難以教會(huì)模型更傾向于生成正確解決方案,而非錯(cuò)誤或執(zhí)行緩慢的方案。
因此,在代碼模型的后訓(xùn)練中更新訓(xùn)練策略,對(duì)于改進(jìn)這些代碼模型以應(yīng)對(duì)各種代碼生成任務(wù)至關(guān)重要。
本文提出新型代碼生成優(yōu)化框架CodeDPO,將偏好學(xué)習(xí)融入代碼模型訓(xùn)練中,基于兩個(gè)關(guān)鍵因素——正確性和效率——定義了代碼偏好。
其中,正確性指代碼是否準(zhǔn)確解決問(wèn)題,而效率是指衡量代碼運(yùn)行的速度。
研究團(tuán)隊(duì)期望在代碼模型的訓(xùn)練過(guò)程中,提升模型對(duì)正確、高效代碼的偏好性。
訓(xùn)練代碼模型代碼偏好
如圖所示,CodeDPO方法包含四個(gè)關(guān)鍵步驟:
圖片
- 數(shù)據(jù)種子構(gòu)建:首先從開(kāi)源代碼庫(kù)中收集數(shù)據(jù)種子并生成編程任務(wù)提示;
- 正確性?xún)?yōu)化與自驗(yàn)證評(píng)分:同時(shí)生成代碼與測(cè)試,通過(guò)自驗(yàn)證機(jī)制構(gòu)建用于正確性?xún)?yōu)化的數(shù)據(jù)集;
- 執(zhí)行時(shí)間效率優(yōu)化:研究團(tuán)隊(duì)在選定的可信測(cè)試集上測(cè)量執(zhí)行時(shí)間,以構(gòu)建效率優(yōu)化數(shù)據(jù)集;
- 模型偏好訓(xùn)練:從上述兩個(gè)階段收集數(shù)據(jù)集,并使用DPO方法來(lái)訓(xùn)練多種代碼模型。
其中,自驗(yàn)證評(píng)分根據(jù)生成代碼是否通過(guò)測(cè)試進(jìn)行迭代更新。
(如上圖所示,經(jīng)過(guò)兩次迭代后,代碼-1的評(píng)分從1變?yōu)?.75再至2.7,因其通過(guò)更可靠的測(cè)試并在每次更新中獲得更高評(píng)分,表明其正確的概率更大)
代碼自驗(yàn)證機(jī)制
CodeDPO 通過(guò)自驗(yàn)證機(jī)制從真實(shí)代碼庫(kù)構(gòu)建數(shù)據(jù)集,其中代碼和測(cè)試用例被同時(shí)生成并用于評(píng)估。
團(tuán)隊(duì)假設(shè),能被更多代碼片段執(zhí)行的測(cè)試更為可靠,而通過(guò)更多測(cè)試的代碼則更有可能是正確的。
為此,CodeDPO采用了一套自驗(yàn)證過(guò)程:
每個(gè)代碼片段和測(cè)試用例首先獲得一個(gè)自驗(yàn)證分?jǐn)?shù),隨后使用一套類(lèi)PageRank的算法進(jìn)行迭代更新。
該算法通過(guò)考慮交叉驗(yàn)證中的關(guān)系,來(lái)調(diào)整每個(gè)代碼片段和測(cè)試的可信分?jǐn)?shù),優(yōu)先基于正確性和效率選擇解決方案。
在初始階段,所有代碼片段和測(cè)試用例的自驗(yàn)證得分均設(shè)為1。
隨著驗(yàn)證過(guò)程的進(jìn)行,代碼和測(cè)試用例的得分會(huì)根據(jù)通過(guò)率逐步更新。具體而言,測(cè)試用例被更多的代碼片段通過(guò),它的自驗(yàn)證得分就會(huì)越高;
通過(guò)越多高可信度測(cè)試用例的代碼片段,其自驗(yàn)證得分也越高。自驗(yàn)證得分的更新公式如下:
圖片
其中,d為阻尼因子,Link(c,t)表示代碼片段c是否通過(guò)測(cè)試用例t。
經(jīng)過(guò)多次迭代后,評(píng)分逐步收斂,最終反映了代碼片段和測(cè)試用例的正確性質(zhì)量。
除了代碼正確性,代碼的執(zhí)行效率也是代碼生成模型優(yōu)化的重要指標(biāo)。
在 CodeDPO 中,團(tuán)隊(duì)通過(guò)記錄每個(gè)代碼片段在測(cè)試用例中的執(zhí)行時(shí)間,來(lái)優(yōu)化其執(zhí)行效率。
然而,并非所有測(cè)試用例都能準(zhǔn)確反映代碼的執(zhí)行效率。
為了確保效率評(píng)估的可靠性,該團(tuán)隊(duì)選擇在正確性?xún)?yōu)化階段評(píng)分最高的代碼片段所通過(guò)的測(cè)試用例,作為“可信測(cè)試集”,以此作為效率評(píng)估的標(biāo)準(zhǔn)。
對(duì)于通過(guò)可信測(cè)試集的代碼片段,執(zhí)行時(shí)間越短,其效率評(píng)分越高。
最終,這些效率較高的代碼片段將被用于訓(xùn)練數(shù)據(jù)集中,以進(jìn)一步優(yōu)化模型生成代碼的執(zhí)行效率。
CodeDPO的最終數(shù)據(jù)集,包含了從正確性?xún)?yōu)化與執(zhí)行效率優(yōu)化階段收集到的數(shù)據(jù)。
通過(guò)整合兩方面的數(shù)據(jù)集,確保了模型不僅能生成正確的代碼,還能生成高效的代碼解決方案。
完整的數(shù)據(jù)構(gòu)造流程如下圖所示:
圖片
準(zhǔn)確性與效率均有提升
測(cè)試結(jié)果顯示,經(jīng)過(guò)CodeDPO優(yōu)化后,代碼模型的生成準(zhǔn)確率和效率,都獲得了一定提升。
代碼準(zhǔn)確性實(shí)驗(yàn)
研究團(tuán)隊(duì)在HumanEval(+),MBPP(+)和DS-1000三個(gè)數(shù)據(jù)集上進(jìn)行了廣泛實(shí)驗(yàn),涵蓋8種主流代碼生成模型,包含Base模型和SFT模型。
團(tuán)隊(duì)觀察到CodeDPO在所有模型上均帶來(lái)了顯著提升,無(wú)論其初始性能如何。
特別值得一提的是,在DeepSeekCoder-6.7B的基礎(chǔ)上,配合已有的SFT策略(MagiCoder-S-DS-6.7B),以及本文CodeDPO的增強(qiáng),最終模型在HumanEval上達(dá)到了83.5%的通過(guò)率。
此外,CodeDPO在更具挑戰(zhàn)性的HumanEval+上也展現(xiàn)出顯著進(jìn)步,證明了其在更嚴(yán)格評(píng)估下的魯棒性。
得益于CodeDPO的數(shù)據(jù)構(gòu)建策略,構(gòu)建一個(gè)可靠的偏好數(shù)據(jù)集,幫助模型傾向于高質(zhì)量輸出,從而實(shí)現(xiàn)更可靠的代碼生成。
CodeDPO在代碼模型的后期訓(xùn)練階段發(fā)揮著關(guān)鍵作用,顯著提升了整體性能。
圖片
在DS-1000數(shù)據(jù)集上,該團(tuán)隊(duì)進(jìn)一步評(píng)估了CodeDPO在不同Python庫(kù)中的表現(xiàn)。
需要注意的是,在數(shù)據(jù)構(gòu)建過(guò)程中,并未融入特定Python庫(kù)的先驗(yàn)知識(shí)。
盡管在Torch和TensorFlow下團(tuán)隊(duì)觀察到了輕微的性能下降,可能是由于這些庫(kù)在數(shù)據(jù)集構(gòu)建中的占比較低。
然而,CodeDPO總體上顯示出對(duì)其各自基線模型的性能提升。
DS-1000在數(shù)據(jù)格式和評(píng)估的編程技能方面與HumanEval和MBPP等基準(zhǔn)有所不同,其數(shù)據(jù)構(gòu)造過(guò)程確保其幾乎不被任何模型的訓(xùn)練集所包含,從而使得團(tuán)隊(duì)在DS-1000上觀察到的改進(jìn)具有可靠性。
這些結(jié)果表明,CodeDPO不僅僅適應(yīng)于HumanEval等標(biāo)準(zhǔn)編程基準(zhǔn),也證明了CodeDPO能夠在更復(fù)雜和多樣化的場(chǎng)景中提升模型的編程能力。
圖片
代碼執(zhí)行效率實(shí)驗(yàn)
對(duì)于代碼執(zhí)行效率這一問(wèn)題,該團(tuán)隊(duì)通過(guò)測(cè)量生成代碼的執(zhí)行時(shí)間并計(jì)算加速比來(lái)評(píng)估。
同時(shí)團(tuán)隊(duì)還評(píng)估了應(yīng)用CodeDPO前后代碼優(yōu)化百分比,其中程序若比基線快至少10%則視為已優(yōu)化。
這些指標(biāo)基于在應(yīng)用CodeDPO前后都能被解決的編程問(wèn)題所構(gòu)成的交集上來(lái)進(jìn)行實(shí)驗(yàn)。
團(tuán)隊(duì)選擇HumanEval+和MBPP+進(jìn)行評(píng)估,因其test case的構(gòu)造顯著擴(kuò)展了測(cè)試用例的多樣性,使得這兩個(gè)增強(qiáng)數(shù)據(jù)集涵蓋了各種邊緣情況。
下圖展示了多次實(shí)驗(yàn)結(jié)果的分布情況。
CodeDPO持續(xù)提升代碼性能,使生成的代碼平均加速1.25至1.45倍,約20%-45%的生成代碼解決方案得到了改進(jìn),證實(shí)了其在提升代碼效率方面的有效性。
圖片
消融實(shí)驗(yàn)
進(jìn)一步地,作者探討了CodeDPO提出的自驗(yàn)證機(jī)制得到的排序分?jǐn)?shù),對(duì)于最終代碼生成效果的影響。
實(shí)驗(yàn)中選擇了一些其他的常見(jiàn)排序策略,如:
- 全測(cè)試過(guò)濾,即假設(shè)所有生成的測(cè)試用例均正確,并利用它們來(lái)判斷代碼的正確性;
- 按通過(guò)測(cè)試數(shù)量排序,即統(tǒng)計(jì)所有生成測(cè)試中每段代碼通過(guò)的測(cè)試數(shù)量,以通過(guò)測(cè)試最多和最少的代碼作為偏好對(duì);
- 隨機(jī)選擇,即從生成的代碼中隨機(jī)選取兩個(gè)代碼解決方案作為偏好對(duì)。
實(shí)驗(yàn)結(jié)果表明,本文提出的自驗(yàn)證機(jī)制以及計(jì)算得到的排序分?jǐn)?shù),在確保偏好數(shù)據(jù)集構(gòu)建的正確性和可靠性方面起著至關(guān)重要的作用,顯著提升了CodeDPO框架的性能。
圖片
文章還探討了不同偏好優(yōu)化策略(DPO、KTO和SFT)對(duì)代碼生成模型性能的影響。
SFT訓(xùn)練策略采用構(gòu)建的數(shù)據(jù)集中最佳的代碼解決方案。
在KTO訓(xùn)練策略中,研究團(tuán)隊(duì)在框架中用KTO替代了DPO。
下圖結(jié)果顯示,在這些策略中,DPO表現(xiàn)最佳。
得益于新型的數(shù)據(jù)構(gòu)建方法,團(tuán)隊(duì)能夠獲得分布均衡的正負(fù)偏好對(duì),從而增強(qiáng)了DPO中的對(duì)比機(jī)制。
圖片
CodeDPO的框架不僅驗(yàn)證了自生成、驗(yàn)證機(jī)制和偏好學(xué)習(xí)在代碼生成領(lǐng)域的有效性,還為未來(lái)更大規(guī)模的代碼偏好優(yōu)化奠定了堅(jiān)實(shí)基礎(chǔ)。
CodeDPO的特色在于,不需要有大量?jī)?yōu)質(zhì)的測(cè)試用例,減少了對(duì)外部資源的依賴(lài),使得該框架能夠在高質(zhì)量測(cè)試數(shù)據(jù)可能稀少的現(xiàn)實(shí)場(chǎng)景中優(yōu)化代碼模型。
作者認(rèn)為,隨著技術(shù)的不斷發(fā)展,CodeDPO有望在實(shí)際應(yīng)用中幫助開(kāi)發(fā)團(tuán)隊(duì)生成更優(yōu)質(zhì)、更符合需求的代碼,顯著提升軟件的可靠性與交付質(zhì)量。
作者簡(jiǎn)介
本文的通訊作者是北京大學(xué)計(jì)算機(jī)學(xué)院長(zhǎng)聘教授李戈。
第一作者為李戈教授課題組博士生張克馳,本科畢業(yè)于北京大學(xué)信息科學(xué)技術(shù)學(xué)院,研究方向?yàn)橹悄芑浖こ獭⒋a表示與代碼生成。
他曾以第一作者在自然語(yǔ)言處理、軟件工程等領(lǐng)域的國(guó)際會(huì)議上發(fā)表多篇論文,曾獲得2023年ACM杰出論文獎(jiǎng)(ACM SIGSOFT Distinguished Paper Award in International Conference on Program Comprehension)。