重寫預訓練資料,大幅提升LLM在數學和程式碼上的效能

如今,大語言模型(LLM)已經成為了AI領域的明星技術,但你是否注意到,即使是最新的模型在處理數學題和編寫程式碼時,仍然會犯一些讓人哭笑不得的錯誤?為什麼會這樣呢?其實,問題可能不在於模型本身,而在于它們的"飲食結構"——預訓練資料的品質。

最近,一項研究通過"重寫"而非簡單"篩選"預訓練資料,讓模型在數學推理和程式碼生成能力上有了驚人提升。這項研究不僅開源了資料集,更重要的是提供了一種可複製的方法,讓我們能夠不斷提升模型在專業領域的表現。

1、傳統資料處理方法的局限性

想像一下,如果你正在學習程式設計,你手邊的教材充斥著錯誤的程式碼、不一致的命名習慣和缺少上下文的片段,你能學好嗎?同樣地,大語言模型在學習過程中也面臨著類似的挑戰。

目前公開的程式碼資料集(如The-Stack-v1/v2)和數學資料集(如Finemath-4+)主要依靠基于規則的提取或模型評分來過濾低品質樣本。然而,這些方法存在明顯局限性:

(1)簡單過濾法:只是剔除了"不合格"的樣本,但保留的內容仍可能存在風格不一致、演算法低效等問題

(2)保留原樣法:雖然避免了資訊丟失,但無法提升樣本品質

(3)品質評分法:雖然能辨識高品質內容,但對中等品質的內容無法進行改進

這就像在挑選水果時,我們只是扔掉了明顯腐爛的,卻沒有對稍有瑕疵的水果進行加工提純。

2、SwallowCode:從清洗到重寫的全流程最佳化

研究團隊提出了一個四階段的資料處理流水線,不僅過濾了低品質程式碼,更對保留的程式碼進行了全面改寫:

(1)語法錯誤過濾

首先,團隊使用Python的內建compile()函數檢查每段程式碼,刪除那些無法通過編譯的樣本。這一步驟就減少了約10.6%的樣本,為後續處理奠定了基礎。

有趣的是,僅僅是移除語法錯誤的程式碼,就能提升模型在HumanEval和HumanEval+基準測試上的表現。

(2)程式碼品質過濾

團隊使用Pylint(一個廣泛使用的Python程式碼品質檢查工具)對程式碼進行評分,只保留評分超過7.0(滿分10分)的樣本。他們還通過自訂演算法懲罰過于冗長的註釋。這一步驟又減少了34.3%的樣本。

這些看似嚴格的篩選標準,在後續測試中證明是值得的,因為它們給模型提供了更高品質的"學習資料"。

(3) 風格引導的程式碼重寫(SGCR)

這一階段使用大語言模型(Llama-3.3-70B-Instruct)根據Google Python風格指南對程式碼進行重寫:

1)添加文檔字串和類型提示

2)統一變數重新賦值模式

3)標準化函數和類名

通過這一步,模型在HumanEval和HumanEval+上的表現提升了超過9個百分點!

(4)自包含最佳化重寫(SCOR)

SGCR主要關注程式碼的風格,而SCOR則進一步最佳化程式碼的語義和功能:

1)確保程式碼的自包含性:內聯或滿足外部依賴

2)用更有效率的演算法替換低效演算法

3)將瑣碎的程式碼片段轉化為有意義的可執行範例

這一階段帶來了額外5個百分點的性能提升,強調了語義層面重寫的重要性。

最終的SwallowCode資料集包含約161億個tokens,在相同訓練預算下,顯著優于其他公開程式碼資料集。

4、SwallowMath:數學資料集的品質提升

研究團隊還將類似的重寫方法應用于數學資料集Finemath-4+,創建了SwallowMath(約23億個tokens)。重寫過程包括:

(1)移除殘留的網頁頭部、頁腳和隱私聲明

(2)消除多餘的元資料(如問題和答案時間戳)

(3)恢復不完整問題或答案中缺失的上下文

(4)將解釋重寫為簡潔而全面的形式

(5)提供清晰的、步驟化的解決方案

這些改進在GSM8K和MATH基準測試上分別帶來了12.4和7.6個百分點的性能提升,證明了重寫方法在數學領域的有效性。

5、效果:讓模型"翻倍"進步

研究人員在固定的500億token訓練預算內,對Llama-3.1-8B模型進行了持續預訓練。結果顯示:

(1)使用SwallowCode:在HumanEval上提升17.0個百分點,在HumanEval+上提升17.7個百分點

(2)使用SwallowMath:在GSM8K上提升12.4個百分點,在MATH上提升7.6個百分點

這相當于在同樣的訓練成本下,模型的能力得到了近乎"翻倍"的提升!

研究團隊還進行了嚴格的測試集洩露檢查,確保性能提升不是由于訓練資料中包含測試樣本導致的。結果表明,SwallowCode中沒有與HumanEval或HumanEval+提示有高相似度的文檔。

6、為什麼重寫比過濾更有效?

傳統的資料處理方法主要依靠過濾,而這項研究採用的"轉換並保留"方法能夠:

(1)提高資料利用率:不是簡單地丟棄低品質樣本,而是通過重寫提升它們的品質

(2)統一風格與結構:使資料集風格一致,便于模型學習

(3)確保資料自包含:減少外部依賴,提高程式碼的可執行性

(4)最佳化演算法效率:用更有效率的演算法替換低效實現

這就像是不僅篩選出了優質的"教材",還對其進行了精心的"編輯"和"重組",讓模型能夠學到更深層次的知識。

7、啟示

這項研究不僅提供了兩個高品質的開源資料集,更重要的是,它為我們提供了一種系統性改進預訓練資料的方法,可應用於各種專業領域:

(1)品質優先于數量:在有限的計算資源下,提高資料品質比簡單地增加資料量更有效

(2)重寫優于過濾:通過重寫低品質資料,能夠最大限度地提高資料利用率

(3)領域特定處理:不同領域(如程式碼、數學)需要專門設計的資料處理流水線

值得一提的是,雖然實驗聚焦于Python,但這一流水線設計是與語言無關的,只需可解析的語法和一個程式碼風格檢查工具,就能應用於其他程式設計語言。

這項開創性的研究讓我們看到,通過精心設計的資料處理流水線,我們可以顯著提升大語言模型在專業領域的能力,而無需依賴更大的模型或更多的訓練資料。它為AI在自動推理和軟體開發等關鍵領域的進步鋪平了道路。

隨著這些方法和資料集的開源,我們有理由相信,未來的大語言模型在處理數學和程式設計任務時將變得更加得心應手,為我們在這些領域提供更可靠的幫助。這也再次證明,在AI發展中,資料品質與模型架構同樣重要,甚至可能更為關鍵。

論文標題:Rewriting Pre-Training Data Boosts LLM Performance in Math and Code

論文連結:https://arxiv.org/abs/2505.02881

推薦閱讀

英偉達發布Llama-Nemotron系列推理模型、Zero to One: 詳解AI Agent設計模式

RM-R1:將獎勵建模視為推理過程的創新方法

DeepSeek-R1 發布後的 100 天:關於複製研究和推理語言模型的綜述

主標籤:資料重寫

次標籤:預訓練資料資料集品質數學推理程式碼生成


上一篇:「絕對零度」:一種零數據、自我進化的AI推理方法超越SOTA

下一篇:AI 生成的程式碼:一誕生即為「遺留程式碼」?

分享短網址