刷榜「代碼生成」任務(wù)!復(fù)旦等發(fā)布StepCoder框架:從編譯器反饋信號(hào)中強(qiáng)化學(xué)習(xí)
大型語(yǔ)言模型(LLMs)的發(fā)展極大地推動(dòng)了代碼生成領(lǐng)域的發(fā)展,之前有工作將強(qiáng)化學(xué)習(xí)(RL)與編譯器的反饋信號(hào)集成在一起,用于探索LLMs的輸出空間,以提高代碼生成質(zhì)量。
但當(dāng)下還存在兩個(gè)問(wèn)題:
1. 強(qiáng)化學(xué)習(xí)探索很難直接適配到「復(fù)雜的人類需求」,即要求LLMs生成「長(zhǎng)序列代碼」;
2. 由于單元測(cè)試可能無(wú)法覆蓋復(fù)雜的代碼,因此使用未執(zhí)行的代碼片段來(lái)優(yōu)化LLMs是無(wú)效的。
為了解決這些挑戰(zhàn),復(fù)旦大學(xué)、華中科技大學(xué)、皇家理工學(xué)院的研究人員提出了一種用于代碼生成的新型強(qiáng)化學(xué)習(xí)框架StepCoder,由兩個(gè)主要組件組成:
1. CCCS通過(guò)將長(zhǎng)序列代碼生成任務(wù)分解為代碼完成子任務(wù)課程來(lái)解決探索挑戰(zhàn);
2. FGO通過(guò)屏蔽未執(zhí)行的代碼段來(lái)優(yōu)化模型,以提供細(xì)粒度優(yōu)化。
論文鏈接:https://arxiv.org/pdf/2402.01391.pdf
項(xiàng)目鏈接:https://github.com/Ablustrund/APPS_Plus
研究人員還構(gòu)建了用于強(qiáng)化學(xué)習(xí)訓(xùn)練的APPS+數(shù)據(jù)集,手動(dòng)驗(yàn)證以確保單元測(cè)試的正確性。
實(shí)驗(yàn)結(jié)果表明,該方法提高了探索輸出空間的能力,并在相應(yīng)的基準(zhǔn)測(cè)試中優(yōu)于最先進(jìn)的方法。
StepCoder
在代碼生成過(guò)程中,普通的強(qiáng)化學(xué)習(xí)探索(exploration)很難處理「獎(jiǎng)勵(lì)稀疏且延遲的環(huán)境」和涉及「長(zhǎng)序列的復(fù)雜需求」。
在CCCS(Curriculum of Code Completion Subtasks)階段,研究人員將復(fù)雜的探索問(wèn)題分解為一系列子任務(wù)。利用標(biāo)準(zhǔn)解(canonical solution)的一部分作為提示(prompt),LLM可以從簡(jiǎn)單序列開(kāi)始探索。
獎(jiǎng)勵(lì)的計(jì)算只與可執(zhí)行的代碼片段相關(guān),因此用整個(gè)代碼(圖中紅色部分)來(lái)優(yōu)化LLM是不精確的(圖中灰色部分)。
在FGO(Fine-Grained Optimization)階段,研究人員對(duì)單元測(cè)試中未執(zhí)行的tokens(紅色部分)進(jìn)行遮罩,只使用已執(zhí)行的tokens(綠色部分)計(jì)算損失函數(shù),從而可以提供細(xì)粒度的優(yōu)化。
預(yù)備知識(shí)
假定是用于代碼生成的訓(xùn)練數(shù)據(jù)集,其中x、y、u分別表示人類需求(即任務(wù)描述)、標(biāo)準(zhǔn)解和單元測(cè)試樣本。
是通過(guò)自動(dòng)分析標(biāo)準(zhǔn)解yi的抽象語(yǔ)法樹(shù)得出的條件語(yǔ)句列表,其中st和en分別表示語(yǔ)句的起始位置和結(jié)束位置。
對(duì)于人類需求x,其標(biāo)準(zhǔn)解y可表示為;在代碼生成階段,給定人類需求x,最終狀態(tài)是通過(guò)單元測(cè)試u的代碼集合。
方法細(xì)節(jié)
StepCoder集成了兩個(gè)關(guān)鍵組件:CCCS和FGO,其中CCCS的目的是將代碼生成任務(wù)分解為代碼完成子任務(wù)的課程,可以減輕RL中的探索挑戰(zhàn);FGO專為代碼生成任務(wù)而設(shè)計(jì),通過(guò)只計(jì)算已執(zhí)行代碼片段的損失來(lái)提供細(xì)粒度優(yōu)化。
CCCS
在代碼生成過(guò)程中,要解決復(fù)雜的人類需求,通常需要策略模型采取較長(zhǎng)的動(dòng)作序列。同時(shí),編譯器的反饋是延遲和稀疏的,也就是說(shuō),策略模型只有在生成整個(gè)代碼后才會(huì)收到獎(jiǎng)勵(lì)。在這種情況下,探索非常困難。
該方法的核心是將這樣一長(zhǎng)串探索問(wèn)題分解為一系列簡(jiǎn)短、易于探索的子任務(wù),研究人員將代碼生成簡(jiǎn)化為代碼補(bǔ)全子任務(wù),其中子任務(wù)由訓(xùn)練數(shù)據(jù)集中的典型解決方案自動(dòng)構(gòu)建。
對(duì)于人類需求x,在CCCS的早期訓(xùn)練階段,探索的起點(diǎn)s*是最終狀態(tài)附近的狀態(tài)。
具體來(lái)說(shuō),研究人員提供人類需求x和標(biāo)準(zhǔn)解的前半部分,并訓(xùn)練策略模型來(lái)根據(jù)x'=(x, xp)完成代碼。
假定y^是xp和輸出軌跡τ的組合序列,即y?=(xp,τ),獎(jiǎng)勵(lì)模型根據(jù)以y^為輸入的代碼片段τ的正確性提供獎(jiǎng)勵(lì)r。
研究人員使用近端策略優(yōu)化(PPO)算法,通過(guò)利用獎(jiǎng)勵(lì)r和軌跡τ來(lái)優(yōu)化策略模型πθ 。
在優(yōu)化階段,用于提供提示的規(guī)范解代碼段xp將被屏蔽,這樣它就不會(huì)對(duì)策略模型πθ更新的梯度產(chǎn)生影響。
CCCS通過(guò)最大化反對(duì)函數(shù)來(lái)優(yōu)化策略模型πθ,其中π^ref是PPO中的參考模型,由SFT模型初始化。
隨著訓(xùn)練的進(jìn)行,探索的起點(diǎn)s*會(huì)逐漸向標(biāo)準(zhǔn)解的起點(diǎn)移動(dòng),具體來(lái)說(shuō),為每個(gè)訓(xùn)練樣本設(shè)置一個(gè)閾值ρ,每當(dāng)πθ生成的代碼段的累計(jì)正確率大于ρ時(shí),就將starting point向beginning移動(dòng)。
在訓(xùn)練的后期階段,該方法的探索過(guò)程等同于原始強(qiáng)化學(xué)習(xí)的探索過(guò)程,即s*=0,策略模型僅以人類需求為輸入生成代碼。
在條件語(yǔ)句的起始位置對(duì)初識(shí)點(diǎn)s*進(jìn)行采樣,以完成剩余的未寫代碼段。
具體來(lái)說(shuō),條件語(yǔ)句越多,程序的獨(dú)立路徑就越多,邏輯復(fù)雜度也就越高,復(fù)雜性要求更頻繁地采樣以提高訓(xùn)練質(zhì)量,而條件語(yǔ)句較少的程序則不需要那么頻繁地采樣。
這種采樣方法可以均衡地抽取具有代表性的代碼結(jié)構(gòu),同時(shí)兼顧訓(xùn)練數(shù)據(jù)集中復(fù)雜和簡(jiǎn)單的語(yǔ)義結(jié)構(gòu)。
為了加速訓(xùn)練階段,研究人員將第i個(gè)樣本的課程數(shù)量設(shè)置為,其中Ei是其條件語(yǔ)句的數(shù)量。第i個(gè)樣本的訓(xùn)練課程跨度為
,而不是1。
CCCS的主要觀點(diǎn)可歸納如下:
1. 從接近目標(biāo)的狀態(tài)(即最終狀態(tài))開(kāi)始探索很容易;
2. 從距離目標(biāo)較遠(yuǎn)的狀態(tài)開(kāi)始探索具有挑戰(zhàn)性,但如果能利用已經(jīng)學(xué)會(huì)如何達(dá)到目標(biāo)的狀態(tài),探索就會(huì)變得容易。
FGO
代碼生成中獎(jiǎng)勵(lì)與行動(dòng)之間的關(guān)系不同于其他強(qiáng)化學(xué)習(xí)任務(wù)(如Atari),在代碼生成中,可以排除一組與計(jì)算生成代碼中的獎(jiǎng)勵(lì)無(wú)關(guān)的動(dòng)作。
具體來(lái)說(shuō),對(duì)于單元測(cè)試,編譯器的反饋只與執(zhí)行的代碼片段,然而,在普通RL優(yōu)化目標(biāo)中,軌跡上的所有動(dòng)作都會(huì)參與到梯度計(jì)算中,而梯度計(jì)算是不精確的。
為了提高優(yōu)化精度,研究人員屏蔽了單元測(cè)試中未執(zhí)行的行動(dòng)(即tokens),策略模型的損失。
實(shí)驗(yàn)部分
APPS+數(shù)據(jù)集
強(qiáng)化學(xué)習(xí)需要大量高質(zhì)量的訓(xùn)練數(shù)據(jù),在調(diào)研過(guò)程中,研究人員發(fā)現(xiàn)在目前可用的開(kāi)源數(shù)據(jù)集中,只有APPS符合這一要求。
但APPS中存在一些不正確的實(shí)例,例如缺少輸入、輸出或標(biāo)準(zhǔn)解,其中標(biāo)準(zhǔn)解可能無(wú)法編譯或無(wú)法執(zhí)行,或者執(zhí)行輸出存在差異。
為了完善APPS數(shù)據(jù)集,研究人員過(guò)濾掉了缺少輸入、輸出或標(biāo)準(zhǔn)解的實(shí)例,然后對(duì)輸入和輸出的格式進(jìn)行了標(biāo)準(zhǔn)化,以方便單元測(cè)試的執(zhí)行和比較;然后對(duì)每個(gè)實(shí)例進(jìn)行了單元測(cè)試和人工分析,剔除了代碼不完整或不相關(guān)、語(yǔ)法錯(cuò)誤、API誤用或缺少庫(kù)依賴關(guān)系的實(shí)例。
對(duì)于輸出中的差異,研究人員會(huì)手動(dòng)審核問(wèn)題描述,糾正預(yù)期輸出或消除實(shí)例。
最后構(gòu)建了得到APPS+數(shù)據(jù)集,包含了7456個(gè)實(shí)例,每個(gè)實(shí)例包括編程問(wèn)題描述、標(biāo)準(zhǔn)解決方案、函數(shù)名稱、單元測(cè)試(即輸入和輸出)和啟動(dòng)代碼(即標(biāo)準(zhǔn)解決方案的開(kāi)頭部分)。
實(shí)驗(yàn)結(jié)果
為了評(píng)估其他LLM和StepCoder在代碼生成方面的性能,研究人員在APPS+數(shù)據(jù)集上進(jìn)行了實(shí)驗(yàn)。
結(jié)果表明,基于RL的模型優(yōu)于其他語(yǔ)言模型,包括基礎(chǔ)模型和SFT模型。
研究人員有理由推斷,強(qiáng)化學(xué)習(xí)可以在編譯器反饋的指導(dǎo)下,更有效地瀏覽模型的輸出空間,從而進(jìn)一步提高代碼生成的質(zhì)量。
此外,StepCoder超越了所有基線模型,包括其他基于RL的方法,獲得了最高分。
具體來(lái)說(shuō),該方法在「入門」(Introductory)、「面試」(Interview)和「競(jìng)賽」(Competition)級(jí)別的測(cè)試題目中分別獲得了59.7%、23.5%和 8.6%的高分。
與其他基于強(qiáng)化學(xué)習(xí)的方法相比,該方法通過(guò)將復(fù)雜的代碼生成任務(wù)簡(jiǎn)化為代碼完成子任務(wù),在探索輸出空間方面表現(xiàn)出色,并且FGO過(guò)程在精確優(yōu)化策略模型方面發(fā)揮了關(guān)鍵作用。
還可以發(fā)現(xiàn),在基于相同架構(gòu)網(wǎng)絡(luò)的APPS+數(shù)據(jù)集上,StepCoder的性能優(yōu)于對(duì)微調(diào)進(jìn)行有監(jiān)督的LLM;與骨干網(wǎng)相比,后者幾乎沒(méi)有提高生成代碼的通過(guò)率,這也直接表明,使用編譯器反饋優(yōu)化模型的方法比代碼生成中的下一個(gè)token預(yù)測(cè)更能提高生成代碼的質(zhì)量。