國內(nèi)團隊提出全新RLTF框架,刷新SOTA!大模型生成代碼質(zhì)量更高bug更少
「程序合成」或「代碼生成」任務(wù)的目標是根據(jù)給定的描述生成可執(zhí)行代碼,最近有越來越多的研究采用強化學(xué)習(xí)(RL)來提高大語言模型(簡稱大模型)(LLM)在代碼方面的性能。
不過,這些RL方法僅使用離線框架,限制了它們對新樣本空間的探索。此外,當前利用單元測試信號的方法相當簡單,沒有考慮到代碼中特定錯誤位置。
而國內(nèi)團隊最近發(fā)布的新型在線RL框架RLTF(即基于單元測試反饋的強化學(xué)習(xí)),可以將代碼的多粒度單元測試反饋結(jié)果用于優(yōu)化code LLM,在訓(xùn)練過程中實時生成數(shù)據(jù),并同時利用細粒度反饋信號引導(dǎo)模型生成更高質(zhì)量的代碼。
有趣的是,小編發(fā)現(xiàn)這篇論文的作者,和曾經(jīng)稱霸王者峽谷的騰訊絕悟AI的作者,有所重疊。
論文地址:https://arxiv.org/pdf/2307.04349.pdf
具體來說,在線框架RLTF通過細粒度的單元測試反饋來增強預(yù)訓(xùn)練的LLM在程序合成任務(wù)中的性能,允許模型在訓(xùn)練過程中實時生成新樣本,并利用單元測試結(jié)果作為反饋信號,從而改善整體模型性能。
此方法使模型能夠?qū)W習(xí)代碼錯誤的具體細節(jié),并相應(yīng)地提高性能。
大語言模型(LLM)在程序合成任務(wù)中表現(xiàn)出色,如Codex、AlphaCode、InCoder等,現(xiàn)有的LLMs在處理更具挑戰(zhàn)性的問題(如程序競賽)方面仍有進展空間且預(yù)訓(xùn)練的代碼模型在生成代碼時可能存在語法和功能上的錯誤。
基于此,研究人員提出了基于強化學(xué)習(xí)(RL)的算法來改進代碼LLMs的性能,如CodeRL和PPOCoder,但現(xiàn)有的RL方法大多是離線的,而在線RL訓(xùn)練更穩(wěn)定,能更好地探索環(huán)境并得到更優(yōu)的策略;
且現(xiàn)有的RL方法對單元測試結(jié)果的反饋信號較為簡單和粗粒度,無法捕捉到代碼中具體錯誤的細節(jié)。
RLTF方法引入了多粒度的單元測試反饋(Fine-grained Feedback根據(jù)代碼的錯誤類型和錯誤具體位置,懲罰代碼中出現(xiàn)錯誤的特定部分,Adaptive Feedback根據(jù)通過的測試用例比例分配不同的懲罰),并通過實時生成樣本和提供多樣化的訓(xùn)練樣本,提高了模型性能。
RLTF在程序合成任務(wù)中取得了APPS和MBPP基準測試的最新成果,并通過消融研究證明了方法的有效性。
方法
論文中提出的任務(wù)可以形式化為一個條件概率優(yōu)化問題,即在給定自然語音描述D和模型可優(yōu)化參數(shù)θ的情況下,最大化正確程序W的概率:
在線RL訓(xùn)練框架
為了更好地探索樣本空間,研究人員使用在線學(xué)習(xí)的方式進行RL訓(xùn)練。
兩個LLM共享權(quán)重,一個負責(zé)梯度回傳更新模型,另一個負責(zé)在線生成訓(xùn)練樣本。
訓(xùn)練樣本經(jīng)過編譯器,分配好標簽,進而更新online buffer中的數(shù)據(jù)。
Online buffer負責(zé)存儲在線訓(xùn)練所用的數(shù)據(jù),它在內(nèi)部維護一個隊列,會刪除過舊的數(shù)據(jù),buffer的更新頻率是50個step。
多粒度反饋的強化學(xué)習(xí)
RL訓(xùn)練的loss可以定義為:
其中,R代表獎勵系數(shù),S和E代表代碼的起點和終點。
研究人員將編譯器的反饋分為3類,eg. Error, Failure, Pass,然后根據(jù)不同的編譯器反饋,制定了不同粒度的模型獎勵。
粗粒度反饋:該反饋的級別建立在上述3類反饋上,和CodeRL,PPoCoder設(shè)置相同;
細粒度反饋:粗粒度的反饋只告訴模型「錯了」,卻沒有將具體「哪里錯了」告知模型。
而細粒度反饋的目的就是為了解決這一問題,使得模型能更加明確錯誤產(chǎn)生的原因和位置。為此,研究人員將Error中不同的錯誤子類型分為U_global,U_line,U_ignore,具體分類見下表;
根據(jù)不同的錯誤子類型,我們有不同的R值和起點終點:
自適應(yīng)反饋:針對未能通過全部測試樣例的數(shù)據(jù),我們根據(jù)其通過的比率設(shè)定了自適應(yīng)的反饋,這一設(shè)置是為了模型能夠生成通過盡可能多的測試樣例的程序。
如下兩個消融實驗也驗證了「在線訓(xùn)練框架 」和「多粒度反饋」的有效性:
實驗
研究人員使用了兩個最先進的基于強化學(xué)習(xí)和code LLMs的方法作為基準,并在相同的基準和設(shè)置下進行評估。作者使用了兩個不同的編程問題數(shù)據(jù)集進行評估,分別是APPS和MBPP。
在APPS數(shù)據(jù)集上,作者使用了RLTF框架對預(yù)訓(xùn)練的CodeT5模型進行微調(diào),并取得了優(yōu)于其他方法的結(jié)果。在MBPP數(shù)據(jù)集上,作者展示了RLTF方法在零樣本設(shè)置下的性能,取得了新的最優(yōu)結(jié)果。
APPS:使用CodeT5 770M作為基礎(chǔ)模型,在APPS數(shù)據(jù)集上進行評估。與其他基于CodeT5的方法(CodeRL、PPOCoder),和其他更大的模型(Codex、AlphaCode、GPT2、GPT3、GPT-Neo等進行了比較)。
結(jié)果表明,RLTF方法在APPS數(shù)據(jù)集上取得了優(yōu)于其他方法的結(jié)果。
MBPP:論文在MBPP數(shù)據(jù)集上評估了CodeT5模型在APPS數(shù)據(jù)集上使用RLTF方法訓(xùn)練的零樣本性能,RLTF方法在MBPP數(shù)據(jù)集上取得了優(yōu)于不同大小的GPT模型的結(jié)果,并達到了新的最優(yōu)性能。
不同的基座模型:為了展示RLTF方法的魯棒性,除了使用CodeT5外,論文還使用另一個基礎(chǔ)模型CodeGen 2.7B進行實驗。
結(jié)果表明,在CodeGen 2.7B上應(yīng)用RLTF方法也取得了令人印象深刻的性能,使得pass@10的提高接近1%。
值得注意的是,研究人員發(fā)現(xiàn),基礎(chǔ)模型越大,RLTF提供的性能提升越大,表明RLTF方法可以有效地發(fā)揮不同基礎(chǔ)模型生成更好代碼的潛力,當基礎(chǔ)模型大小更大時,影響更為明顯。
結(jié)論及未來工作
本文提出了RLTF(Reinforcement Learning from unit Test Feedback),一個具有多粒度單元測試反饋的新型在線RL框架,用于優(yōu)化程序合成任務(wù)中的大語言模型。
與現(xiàn)有工作相比,該方法在訓(xùn)練過程中實時生成數(shù)據(jù),并同時利用更細粒度的反饋信號引導(dǎo)模型生成更高質(zhì)量的代碼。
大量實驗表明,RLTF超越了現(xiàn)有基于RL的方法,并可以應(yīng)用于各種code LLM,包括CodeT5和CodeGen。此外,它在廣泛使用的benchmark(如APPS和MBPP)上實現(xiàn)了最先進的性能。
在未來,有幾個方向可以進一步改進RLTF:
例如,現(xiàn)有基準測試中的輸入輸出示例可能不夠多樣化,使用隱藏的輸入輸出示例生成的程序可能不是正確的最終代碼版本,這種限制可能會影響RLTF的性能,因此,使用LLM創(chuàng)建更多樣化和準確的輸入輸出示例集是一個值得探討的潛在研究方向。
此外,是否更細粒度的反饋信號(如來自靜態(tài)代碼分析器的信號)可以進一步提高RLTF的性能,也是另一個可能的研究方向。