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