DeepSeek團(tuán)隊(duì)新作:把代碼變成思維鏈,大模型推理各種能力全面提升
用代碼訓(xùn)練大模型思考,其他方面的推理能力也能提升。
DeepSeek團(tuán)隊(duì)最新研究,利用300多萬個(gè)實(shí)例,將代碼轉(zhuǎn)換成思考過程,構(gòu)建出數(shù)據(jù)集CODEI/O,對Qwen、Llama等模型進(jìn)行了訓(xùn)練。
結(jié)果,在各種類型的推理任務(wù)當(dāng)中,模型性能都取得了全面提升,包括在非代碼類的推理任務(wù)上,也展現(xiàn)出了良好的遷移能力。
研究團(tuán)隊(duì)認(rèn)為,在代碼當(dāng)中暗含了不同類型場景的思考過程,于是想要把這種思考過程“提取”出來訓(xùn)練推理模型。
他們生成了大量的訓(xùn)練數(shù)據(jù)運(yùn)行這些代碼,然后把代碼、輸入/輸出對以及功能描述輸入DeepSeek-V2.5,從而合成自然語言形式的推理過程。
在此基礎(chǔ)上,團(tuán)隊(duì)還引入了驗(yàn)證和修訂機(jī)制,形成了更高質(zhì)量的CODEI/O++。
從代碼中構(gòu)建思維鏈
首先,作者從CodeMix、PyEdu-R等數(shù)據(jù)集中收集了80多萬份代碼文件,涵蓋多種編程語言(以Python為主),任務(wù)類型多樣,并且蘊(yùn)含了豐富的推理模式。
但是,由于原始代碼文件通常缺乏結(jié)構(gòu)化,包含不相關(guān)的元素,難以以自包含的方式執(zhí)行,作者使用DeepSeek-V2.5模型對其進(jìn)行預(yù)處理,將其轉(zhuǎn)換為統(tǒng)一的格式。
轉(zhuǎn)換過程中的工作主要包括把核心邏輯功能提取到函數(shù)中,添加總結(jié)整體邏輯的主入口函數(shù),明確定義主入口函數(shù)的輸入/輸出,創(chuàng)建獨(dú)立的基于規(guī)則的輸入生成器函數(shù),以及基于主入口函數(shù)生成簡明的問題陳述作為查詢等等。
接下來,在轉(zhuǎn)換后的每個(gè)函數(shù)上,使用輸入生成器采樣多個(gè)輸入,并通過執(zhí)行代碼獲得相應(yīng)的輸出,從而收集輸入-輸出對。
這一過程中,部分代碼出現(xiàn)了超時(shí)、復(fù)雜度過高、不可執(zhí)行或結(jié)果不確定等情況,這部分代碼被作者跳過,最終生下了40多萬份代碼文檔,產(chǎn)生了350萬個(gè)樣本實(shí)例。
然后,作者利用DeepSeek-V2.5,將代碼、輸入輸出對、功能描述等信息合成為自然語言思維鏈(CoT),構(gòu)建訓(xùn)練樣本。
對于每一個(gè)輸入-輸出對,作者首先構(gòu)建一個(gè)輸入提示。這個(gè)提示由幾個(gè)部分拼裝而成:
- 函數(shù)定義:即之前結(jié)構(gòu)化和標(biāo)準(zhǔn)化后的Python函數(shù)代碼。
- 文本描述:用自然語言概括函數(shù)的功能和目的。
- 參考代碼:與函數(shù)定義類似,但可能包含一些額外的上下文信息或注釋。
- 輸入或輸出:根據(jù)是輸入預(yù)測還是輸出預(yù)測任務(wù),提示中會(huì)包含具體的輸入或期望的輸出。
將構(gòu)建好的提示輸入給DeepSeek-V2.5模型,模型會(huì)根據(jù)提示生成一段自然語言文本作為響應(yīng)。
這段文本就是作者想要的推理過程——它需要解釋如何從給定的輸入推導(dǎo)出輸出,或者在給定輸出的情況下如何構(gòu)造出滿足條件的輸入。
通過這種方式收集的數(shù)據(jù)集,就是CODEI/O。
在CODEI/O的基礎(chǔ)上,作者進(jìn)一步利用了代碼的可執(zhí)行特性,合成了數(shù)據(jù)質(zhì)量更高的CODEI/O++。
作者首先對CODEI/O中生成的所有響應(yīng)通過重新執(zhí)行代碼進(jìn)行正確性驗(yàn)證。對于驗(yàn)證為不正確的響應(yīng),作者將執(zhí)行反饋?zhàn)芳訛榈诙嗇斎胄畔?,并要求模型重新生成一個(gè)響應(yīng)。
執(zhí)行反饋包括輸出預(yù)測的正誤、輸入預(yù)測基于錯(cuò)誤輸入的執(zhí)行輸出,以及代碼執(zhí)行失敗的錯(cuò)誤信息等。
在第二輪生成后,再次檢查新響應(yīng)的正確性。
無論第二輪結(jié)果如何,最終的響應(yīng)都由四個(gè)部分按順序構(gòu)成:第一輪響應(yīng)、第一輪反饋、第二輪響應(yīng)和第二輪反饋。
對于第一輪就正確的響應(yīng),第一輪反饋簡單標(biāo)記為“Success”,且沒有第二輪內(nèi)容。
與CODEI/O一樣,所有修訂后的響應(yīng)都會(huì)被保留。通過引入基于執(zhí)行反饋的多輪修正所構(gòu)建的增強(qiáng)型數(shù)據(jù)集就是CODEI/O++。
數(shù)據(jù)集構(gòu)建完成后,作者采用了兩階段訓(xùn)練策略對相關(guān)模型進(jìn)行訓(xùn)練。
第一階段先用CODEI/O或CODEI/O++來訓(xùn)練推理能力,然后再用通用指令數(shù)據(jù)集進(jìn)行微調(diào),教會(huì)模型遵循自然語言指令、執(zhí)行各種任務(wù)。
模型推理能力全面提升
為了評估CODEI/O或CODEI/O++的效果,作者一共找來了四個(gè)模型來進(jìn)行測試,分別是Qwen 2.5-7B-Coder、Deepseek v2-Lite-Coder、Llama 3.1-8B和Gemma 2-27B。
測試過程中,作者共選用了10余個(gè)數(shù)據(jù)集,測試了模型常識、數(shù)學(xué)、代碼、物理、工程等領(lǐng)域的表現(xiàn),具體數(shù)據(jù)集如下表:
CODEI/O訓(xùn)練之后,Qwen-Coder在代碼理解任務(wù)上取得了突破性進(jìn)展,并且在閱讀理解和推理任務(wù)(如DROP)上也有明顯提升,這表明通過代碼訓(xùn)練獲得的推理能力確實(shí)遷移到了其他領(lǐng)域。
DeepSeek-Coder在CODEI/O的訓(xùn)練下也展現(xiàn)出了均衡的進(jìn)步,在各個(gè)維度上都實(shí)現(xiàn)了穩(wěn)定的改進(jìn)。
Qwen-Coder和DeepSeek-Coder的表現(xiàn)說明,即使是已經(jīng)在代碼領(lǐng)域有專門訓(xùn)練的模型,也能從這種結(jié)構(gòu)化的推理訓(xùn)練中獲益。
Llama在LeetCode-O上的性能提升了將近150%,說明即使是參數(shù)量較小的模型,通過合適的訓(xùn)練方法也能在特定任務(wù)上獲得較大提升。
而Gemma作為測試中最大的模型,展示了CODEI/O方法在大規(guī)模模型上的適用性,在多個(gè)關(guān)鍵領(lǐng)域取得了進(jìn)步。
相比于數(shù)據(jù)量更大的WebInstruct(WI),CODEI/O整體上取得了更好的效果;而相對于專門為某種任務(wù)設(shè)計(jì)的OpenMathInstruct2(OMI2)、PyEdu等方式,CODEI/O體現(xiàn)了更強(qiáng)的通用性。
作者簡介
本文第一作者是來自上海交大的碩士生Junlong Li,目前在DeepSeek實(shí)習(xí)。
同時(shí)他還在香港科技大學(xué)助理教授何俊賢的指導(dǎo)下進(jìn)行研究工作,何俊賢亦是本文的通訊作者。
此外參與了DeepSeek V2、V3以及R1研發(fā)的DeepSeek核心研究員、中山大學(xué)校友郭達(dá)雅也參與了這一項(xiàng)目。
論文地址:https://arxiv.org/abs/2502.07316
GitHub:https://github.com/hkust-nlp/CodeIO
數(shù)據(jù)集:https://huggingface.co/datasets/hkust-nlp/CodeIO-PyEdu-Reasoning