以圖靈機為師:通過微調訓練讓大語言模型懂執行計算過程
本文來自南京大學計算機學院軟件研究所,聚焦于開放環境下的智能軟件新技術研究,定位國際學術前沿,面向國家關鍵需求,承擔了一系列國家科技部和基金委重大/重點科研項目。團隊擁有包括中科院院士等多名國家級人才,重點關注軟件和智能方向,研究成果發表于NeurIPS/ICLR/SOSP/ATC/EuroSys/OOPSLA/PLDI/ICSE/FSE等國際頂級會議,其中多篇文章獲得相應會議的最佳論文獎。
大型語言模型 (LLM) 在各種自然語言處理和推理任務中表現出卓越的能力,某些應用場景甚至超越了人類的表現。然而,這類模型在最基礎的算術問題的表現上卻不盡如人意。當遇到算術問題時,LLM 通常依賴記住特定的表達式及其對應結果的方式輸出算術問題的結果。通過簡單的實驗發現,LLM 只在語言層面表達了對算術運算的邏輯理解,但并沒有運用計算邏輯解決算術問題,這對 LLM 在相關領域中的應用造成了重大障礙,同時影響了其推廣到新場景的能力。
為了解決這個問題,來自南京大學的研究者提出了一種面向 LLM 的可組裝算術執行框架 (CAEF),使 LLM 能夠通過模仿圖靈機的方式來執行算術,從而理解計算邏輯。此外,CAEF 具有高度的可擴展性,允許組合已經學習到的運算符,以降低復雜運算符的學習難度。評估表明,LlaMA 3.1-8B 模型配合 CAEF 可在 7 種經典數學算術運算的測試中實現了近乎 100% 的準確率,且能夠支撐 100 位操作數的計算,而同等難度下, GPT-4o 在一些算術問題測試中無法正確給出計算結果。
- 論文標題:Executing Arithmetic: Fine-Tuning Large Language Models as Turing Machines
- 論文地址:https://arxiv.org/abs/2410.07896
- 項目主頁:https://github.com/NJUDeepEngine/CAEF
該工作的貢獻主要有以下部分:
- 可組裝的算術執行框架:提出了一種面向 LLM 的算術執行框架,使 LLM 能夠通過模仿圖靈機的方式解決算術問題、掌握運算符的計算邏輯。此外,CAEF 還支持組合多個已學習的運算符來實現更復雜的運算符。
- Executor 和 Aligners:基于框架 CAEF,實現了七個常見運算符,分別構造了對應的 executor 和 aligner。其中,executor 負責以迭代方式分步執行計算,而 aligner 充當接口,完成 executor 的圖靈機風格表示和原始文本表示之間的雙向轉換。
- 計算準確率:實驗結果表明,基于 CAEF 的 LLaMA 3.1-8B 在這七個運算符上的表現優于現有的 LLM,且能夠在操作數高達 100 位時實現幾乎 100% 的準確率。
相關工作
LLM 面對數學問題:當前研究主要集中如何在提高 LLM 面對數學任務的解題性能,通常引入外部工具來輔助 LLM 解決計算部分的內容。一類常見的外部工具為計算器,如 Schick et al. (2024) [1] ,該工作引入了一種自監督學習方法,模型在該方法中學習何時通過 API 訪問調用外部工具,類似的策略可以在 Gou et al. (2023) [2] 和 He-Yueya et al. (2023) [3] 中也能找到。另一類工具是編程語言解釋器,例如 Python,LLM 生成用于解決數學問題的代碼,再交由外部解釋器執行代碼以獲得最終的結果。一個典型的例子是 Lu et al. (2024) [4] ,它將 LLM 視為生成代碼并將其提交給外部 Python 執行程序以處理表格上下文中的數學問題。Wang et al. (2023) [5] 采用監督學習的方式讓 LLM 學習如何通過構建用于解決數學問題的程序,而 Zhou et al. (2023) [6] 提出了一種零樣本提示方法,以實現代碼驅動的自我驗證,從而提高數學解題性能。
LLM 面對算術問題:當前也有一些專注于 LLM 算術方面的研究。這些研究的共同目標是嘗試教會 LLM 計算邏輯,并通過分步計算的方法拆解計算過程,以提高計算準確性。在這些研究中,Nye et al. (2021) [7] 是一項早期且影響深遠的 方法。它在算術領域引入了類似思維鏈 (CoT) 的思想拆分計算過程,讓語言模型把計算的中間步驟輸出到一個被稱為 “scratchpad” 的緩沖區,顯著提高了 LLM 整數加法的性能。Hu et al. (2024) [8] 觀察到 transformers 傾向于使用 “基于記憶樣例的推理” 來處理算術問題,并提出了一種遵循規則的微調技術,指導模型逐步執行計算。Zhou et al. (2024) [9] 結合了四種技術(FIRE 位置編碼、隨機位置編碼、反向格式(R2L 格式)和索引提示)開發了一種新模型,該模型在兩個整數加法問題上實現了 2.5× 的長度泛化能力。
方法描述
該工作設計了一種可以使 LLM 學習模擬圖靈機執行的框架 CAEF。圖靈機中的轉移函數(transition function)描述了基于當前計算狀態和紙帶信息應該執行什么操作,其中天然蘊含了分步計算的邏輯。此外,組裝多個現有的圖靈機能夠實現更加復雜的計算邏輯,因此圖靈機為計算提供了一個很好的思路。然而,LLM 是基于文本的生成式模型,因此如何將圖靈機的工作模式有效地轉移到 LLM 上成為了一個難點。
框架設計:針對這個問題,CAEF 設計了一種 LLM 友好的基于文本的表示系統,其工作示意如圖 1 所示,左側是一個自動機狀態圖示例,右側是 CAEF 的工作示意圖。CAEF 設計了一套基于文本的表示,包括兩組必需的元素:狀態 (state) 和命令 (command),分別對應于圖中的藍色和粉色部分。state 部分記錄了當前的計算狀態 (status)、操作數 (operands)、計算中間變量和結果等信息。Command 部分由一組操作組成,例如寫入 ([OUTPUT]) 和調用 ([CALL])。輸入當前狀態和命令后,LLM 會以類似自動機的方式,生成下一個狀態和相應的命令,對應于狀態圖中的一次狀態轉換。這個過程中,形式化來說,LLM 的學習目標即一個轉移函數,對于給定
的計算中間結果 <
>,LLM 需要生成下一個中間結果 <
>,即
。LLM 通過學習計算的單步執行,就能以迭代的方式完成計算任務。
圖 1. CAEF 框架圖示
圖 2. 45+67 執行過程
此外,由于計算的初始狀態和命令 < > 本身并不存在,CAEF 針對每個操作符需要設計兩個組件,一個是用于充當自然語言表示和圖靈機風格表示之間 “翻譯” 的 aligner,另一個是依照上述流程、負責實際執行計算的 executor,兩者以獨立的 LoRA adapter 的形式存在。其中 executor 可進一步細分為 basic executor 和 executor composer。針對像加法這樣相對容易的基礎運算符,可由單一的 LoRA adapter 實現功能,被稱為 basic executor;而像乘法這樣可以做進一步分解的復雜運算符,其 executor 本身不負責實際運算,它通過組織計算步驟、調用其他運算符的 executor 來實現功能,被稱為 executor composer。
Basic executor:以加法為例,文章介紹 basic executor 的設計過程。加法可以通過模擬累加器的執行過程實現,即每次從兩個操作數中取相同位置的數字,與存儲在進位寄存器中的值三者相加,在計算后寫入當前位計算結果,同時更新進位寄存器。因此,加法狀態和命令的表示 < > 可構造如下:
應包含:1) 兩個操作數、2) 兩個指針,用于指示當前參與計算的位置、3) 進位寄存器、 4) 到目前為止的計算結果。
應包含:1) 進位和輸出的寫入,2) 移動指針的操作、 3) 計算狀態的轉換。基于該思路,可以構建加法的抽象執行流程,如圖 2 左側的自動機圖所示。以 “45+67=” 這個問題為例,圖 2 的右側展示了 executor 的完整執行流程。完整的文本形式轉換過程如下:
Step 1 (aligner):
45+67=
Step 2 (executor):
state0: ADD, q0, [HEAD1] |5|4 [HEAD2] |7|6 [C] [OUTPUT]
command0: CMD: [C] 0, [HEAD1] RIGHT, [HEAD2] RIGHT, q1
Step 3 (executor):
state1: ADD, q1, [HEAD1]|5|4 [HEAD2]|7|6 [C] 0 [OUTPUT]
command1: CMD: [C] 1, [OUTPUT] 2, [OUTPUT] RIGHT, [HEAD1] RIGHT, [HEAD2] RIGHT, q1
Step 4 (executor):
state2: ADD, q1, |5 [HEAD1]|4 |7 [HEAD2]|6 [C] 1 |2 [OUTPUT]
command2: CMD: [C] 1, [OUTPUT] 1, [OUTPUT] RIGHT, [HEAD1] RIGHT, [HEAD2] RIGHT, q1
Step 5 (executor):
state3: ADD, q1, |5|4 [HEAD1] |7|6 [HEAD2] [C] 1 |2|1 [OUTPUT]
command3: CMD: [OUTPUT] 1, [OUTPUT], [C], qH
Step 6 (executor):
state4: ADD, qH, |5|4 [HEAD1] |7|6 [HEAD2] [C] 1 |2|1|1
command4: No command to execute. Halt state.
Step 7 (aligner):
45+67=112
Executor composer:以乘法為例,文章介紹 executor composer 的設計過程。乘法可以可以通過加法和小于兩個操作符實現。以形式 a×b=c 為例,一種簡單的乘法實現可以大致視為循環結構。在循環中使用兩個累加器:在每次循環中,一個累加器自增 1,另一個累加器在每次循環中累加 a。當第一個累加器達到 b 時,循環結束,第二個累加器的值即為結果 c。在該過程中,累加器通過現有的加法操作符實現,循環終止條件由小于操作符實現,而乘法自身不參與實際運算,僅驅動該流程的執行。基于該思路,可以構建乘法的抽象執行流程,如圖 3 左側的自動機圖所示。以 “89×2=” 這個問題為例,圖 3 的右側展示了 executor 的完整執行流程。
圖 3. 89×2 執行過程
通過上述設計,CAEF 賦予了 LLM 執行計算的能力,executor composer 的存在還使得該方法具有很高的擴展性,能夠有效處理復雜計算。
實驗結果
該工作評估了不同運算符、不同位數情況下的算術準確率。實驗使用 LLaMA 3.1-8B 預訓練模型作為基礎模型,在 +、?、×、÷、==、> 和 < 這 7 個運算符上和三個基準進行了比較:1)LLaMA 3.1-8B 預訓練模型基于 LoRA、在僅給出計算結果的數據集上直接微調得到的模型、2)LLaMA 3.1-8B-Instruct、3)GPT-4o。
表 1. 七種運算符的總體評估結果,“LLaMA 3.1 (L)” 代表 LoRA 微調后的 LLaMA 3.1-8B,“LLaMA 3.1 (I)” 代表 LLaMA 3.1-8B-Instruct 模型
表 1 展示了 7 個運算符的 CAEF 方法和基準的評估結果。與基準相比,CAEF 在不同運算符、不同長度的操作數的設置下表現相對穩定,準確率高。特別是對于長數字的任務,例如 100 位加法,通過 CAEF 指導的 LLM 可以有效地學習到計算邏輯。
為了進一步探索 executor 和 aligner 在計算過程中的實際性能,該工作在同一數據集上分別進行了評估。如表 2 所示,可以觀察到,即使 executor 必須以迭代方式反復生成中間計算步驟,而 aligner 只執行兩個轉換步驟,但 executor 的整體性能仍然優于 aligner。executor 在所有實驗設置中都達到了 99% 以上的準確率,說明當提供正確的初始狀態和命令時,它在絕大多數情況下都能有效工作。另一方面,在大多數情況下,與轉換 executor 的輸出相比,aligner 在轉換原始輸入時表現出較低的精度,這表明整個計算過程的瓶頸在于操作數的翻轉,而不是計算本身。
表 2. 七種運算符的 executor 和 aligner 準確率,executor 的準確率統計的是從初始狀態到最后一步中,每一步都正確、最終計算正確的情況。aligner 的精度分為兩部分:從原始輸入到 executor 表示的轉換,記為 aligner (I),以及從 executor 表示到輸出的轉換,記為 aligner (O)。