今天小編分享的科學經驗:将偏好學習引入模型訓練,北大李戈團隊新框架,可顯著提升代碼準确性與執行效率,歡迎閱讀。
代碼模型 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)。
論文地址:
https://arxiv.org/abs/2410.05605
— 完 —
投稿請發郵件到:
标題注明【投稿】,告訴我們:
你是誰,從哪來,投稿内容
附上論文 / 項目主頁鏈接,以及聯系方式哦
我們會(盡量)及時回復你
點這裡關注我,記得标星哦~
一鍵三連「分享」、「點贊」和「在看」
科技前沿進展日日相見 ~
>