探究代碼思維鏈對大模型推理能力的作用
一、引言
現階段,程序代碼是解決基于大型語言模型(LLM)的復雜推理任務的有效的方式之一,這類方法通常被稱為"程序或代碼思維鏈" (program-of-thought)。與傳統思維鏈(chain-of-thought)方法相比,代碼思維鏈方法將復雜問題分解為可執行的代碼片段,并且利用代碼執行器逐步解決子問題,可以較大程度提升基于大型語言模型的推理能力。然而目前代碼程序數據本身的形式與大模型推理能力之間的相關性仍是未解之謎,我們對于構造何種代碼指令數據才能提升基于代碼思維鏈的大模型推理能力仍知之甚少。因此,本文致力于分析以下問題:
什么情況下代碼思維鏈數據對語言模型推理最為有效?
本文分析了不同邏輯和結構復雜度的代碼程序數據,初步探究了不同復雜度的代碼數據與語言模型推理能力的關系。
二、代碼程序復雜度估計
在這項工作中,我們提出Complexity-Impacted Reasoning Score (CIRS) 用來度量推理復雜度的分數。CIRS分數用于衡量代碼推理步驟(代碼思維鏈)對語言模型推理能力的影響。
我們假設代碼編程語言具有獨特的優勢,原因如下:
- 首先,相較于扁平化的自然語言數據,得益于其面向對象的特征,代碼語言能夠更加有效建模復雜的結構。
- 其次,程序語言具有相對固有的過程導向邏輯,其面向過程的特性有助于解決多步推理問題。
因此,合理的方式應該從結構和邏輯兩個角度評估代碼的復雜性。
具體來說,為了衡量代碼思維鏈 的推理能力,我們定義為結構復雜性 和邏輯復雜性 的乘積。
1.結構復雜性定義
為了計算結構復雜性,我們衡量抽象語法樹(AST)的結構復雜性。具體來說,我們利用抽象語法樹中的三個指標來反映其結構信息。
一般來說,節點數越多,復雜性越高。但是僅憑節點數無法全面衡量代碼的復雜性,因為一個具有簡單結構的大代碼可能比一個具有復雜結構的小代碼更容易理解。節點類型幫助識別代碼中存在的結構元素,例如條件語句、循環和函數調用。不同的節點類型在代碼中扮演不同的角色,并對代碼的復雜性有不同的貢獻。因此,記錄各種節點類型的數量可以增進對代碼結構復雜性的理解。最后,抽象語法樹 的深度反映了代碼中嵌套的級別。更大的樹深度可能意味著更復雜的控制流和邏輯,使代碼更難理解。同樣樹深度也不是唯一的衡量標準。一個具有多個簡單分支的淺樹可能比一個具有少數復雜分支的深樹更容易理解。
2.邏輯復雜性定義
受到 Halstead 復雜度 和 McCabe 的圈復雜度的啟發,我們定義代碼的邏輯復雜性 ,它包含了困難度
和圈復雜度
。
其中表示代碼控制流圖中的邊數,
表示代碼控制流圖中的節點數。高圈復雜度與潛在的程序錯誤之間存在顯著的相關性, 高圈復雜度的模塊和方法也會有最多的缺陷。我們注意到高圈復雜度表明程序代碼具有復雜的判斷邏輯,同時也可能導致較低的質量,并且難以測試和維護。
總的來說,引入對于代碼塊困難度和圈復雜度的衡量指標,可以同時兼顧碼操作符、操作數和代碼控制流的復雜性對于代邏輯復雜度的影響。
三、實驗分析
本文的實驗分為兩部分,第一部分我們使用CIRS指標對代碼數據進行經驗性分析,并且按照分數值進行劃分,最后探討不同復雜度代碼塊對大模型推理能力的影響。第二部分,我們將第一部分得到的結論用于代碼數據的過濾,篩選出對大模型推理能力增益最有效的代碼,在多個數據集上做驗證。
1.經驗性實驗分析
為了盡量避免現有數據集本身造成的誤差,我們選擇模擬新的代碼數據,種子數據的來源包括GSM8K、MultiArith、Asdiv等訓練集。我們從五個種子數據集模擬合成了超過60,000個樣本。最后每個數據集生成了大約10,000個樣本,并且我們選擇盡可能多的數據集以確保數學問題的多樣性。在獲取到生成的代碼數據后,我們使用CIRS指標并根據代碼復雜性分布的分析手動將數據分成不同的子集。基于不同的復雜性分數,我們將劃分的子集命名為low(低分樣本)、medium(中分樣本)和high(高分樣本)。
(1)不同代碼程序復雜度分數的影響
合適代碼的復雜度對于代碼思維鏈的提示的推理能力至關重要:
從四個數據集的結果中,我們注意到當代碼數據的復雜性處于中等范圍時,模型的性能最佳。這表明學習性符號語言對于程序輔助提示的推理能力至關重要。其原因在于,過于簡單的復雜性數據對于大型語言模型(LLMs)來說太簡單,導致效果不太明顯。相反,當復雜性顯著增加時,邏輯語義和嵌套結構變得難以理解或學習,這可能對大型語言模型的推理能力產生不利影響。
參數數量越大,代碼數據對于大型語言模型的推理能力提升越顯著:
隨著語言模型大小從70億增加到650億,其推理能力也在提高。實際上經過微調后,大多數650億參數量的模型使用代碼數據可以達到與gpt-3.5-turbo相當的結果。這表明擁有足夠多的參數對于語言模型的實質性推理能力至關重要。此外當語言模型足夠大時,不同復雜度代碼之間帶來的結果差異很小。這說明大量參數的語言模型能夠更加擅長處理符號數據,并且內在的具有產生強大推理能力的潛力。
當前語言模型的架構在理解推理能力方面存在局限性:
我們觀察到,當數據復雜性極高時,語言模型的性能傾向于下降,這反映了大型語言模型的推理能力有其固有的限制。首先,我們認為當前語言模型的架構(例如decoder-only架構)對于理解復雜知識的能力有限,這也限制了其推理能力的涌現。大模型展示強大推理能力的前提是它們能夠理解復雜數據中嵌入的結構和邏輯知識。因此,未來的研究需要探索具有更強推理能力的模型基礎結構。其次,進一步增強推理能力需要依賴外部工具。我們知道推理問題的范圍非常廣泛,不僅包括數學推理,還包括常識或更復雜的邏輯推理任務。因此,僅依靠LLM本身是不足以一次性解決所有問題的,需要更強大的外部工具的協助。
(2)不同復雜度分數的數據特征
不同CIRS分數的不同子集顯示出不同的結構和邏輯差異,我們還發現不同復雜性分數的結果與推理問題的認知難度級別相對應。低分數的樣本包含很少的結構信息。盡管它們包含一些中間推理過程,但這些主要以平面文本描述形式呈現。這些樣本通常對應于更簡單的、在結構和邏輯上不足的問題。當分數在代碼推理步驟中增加時,具有簡單邏輯語義和結構的編程語言的存在也隨之增加。這些樣本通常涉及簡單且直接的邏輯操作。得分極高的樣本包含大量的結構化函數定義或推理過程,這表明存在許多復雜的條件語句和函數結構。這些樣本通常是高度挑戰性的數學問題。
(3)排除數據分布本身的影響
為了消除數據分布本身可能帶來的偏差,例如由于出現頻率較高而在中等數據范圍內的性能提升,我們對不同復雜性分數的結果進行了更深入的分析。從實驗結果來看,模型對每種分布的預測準確率與訓練數據的數量無關。因此,我們可以初步得出結論,復雜性數據的有效性并非因為數據出現的頻率。
(4)代碼思維鏈和文本思維鏈的比較
為了驗證代碼和文本推理鏈的效果,我們用文本替換了使用相同數據集的代碼程序推理過程。代碼數據集在所有四個數據集中都展示出明顯的優勢。這是因為代碼本質上包含了邏輯語義和結構信息, 另一個原因是代碼可以被外部解釋器執行。因此帶有代碼的提示方法優于扁平化的文本信息。
2.使用CIRS提升大語言模型推理能力
(1)自動合成和劃分代碼數據算法
我們將第一部分實驗的步驟集成為一種自動合成和分層算法,然后將其應用于數學推理的指令生成任務,以及代碼生成任務中用來做代碼數據過濾。
(2)CIRS引導的指令生成
合適的代碼數據復雜性對于語言模型表現出最佳的推理能力更重要。因此,我們從源數據集中篩選出更多數據訓練一個針對中等復雜性范圍的代碼數據增強推理模型。在分布內測試條件下,我們發現訓練的模型優于Vicuna和Falcon。為了消除數據分布的影響,我們直接測試了模型在分布外設置中的性能。相同的參數下,我們的模型在零樣本和少樣本提示下表現更好。值得注意的是,我們的方法在零樣本設置下在BigBench-Hard與ChatGPT相當。對于MATH數據集,我們注意到我們的模型仍然優于基線模型。但是由于代碼數據本身的局限性,我們的模型比ChatGPT差得多。
(3)不同推理復雜度分數的影響
為了驗證我們方法在代碼相關任務中的有效性,我們過濾訓練數據集并獲得了更多高質量代碼指令的子集。結果表明,Code (CIRS)-LLaMA在純代碼生成任務中表現出有效的性能。我們可以得出結論,優化的結構和邏輯語義對LLM的推理能力最有益。
四、討論與總結
1. 數學邏輯和代碼之間的深層聯系是什么?
柯里-霍華德同構(Curry-Howard isomorphism)表明數學邏輯和計算機程序代碼之間的互為鏡像,同時這也說明了數學證明和計算機程序可以建立某種關聯,為我們理解語言模型也提供了啟發和思考。語言模型在處理代碼時,如果能夠理解和應用類型系統,就能更好地處理邏輯推理。類型系統在程序設計中用于約束和推理數據和函數之間的關系,類似于邏輯系統中命題和證明的關系。在編寫程序時,人需要對數據和操作進行邏輯推理。這與證明一個邏輯命題的過程有相似之處。語言模型如果能理解和生成程序代碼,就表明它在進行某種形式的邏輯推理。通過程序代碼的理解和生成,語言模型能夠更有效地進行邏輯推理,處理復雜的問題解決方案,這對于理解邏輯問題來解決特定問題是有用的。雖然柯里-霍華德同構直接描述的是邏輯系統和類型系統之間的關系,但將這種理論應用于語言模型和程序代碼的融合,可以幫助模型更好地理解和處理邏輯推理和編程任務。這表明了邏輯學和計算機科學之間的深刻聯系也適用于人工智能和語言模型的領域。
2. 對于語言模型的推理能力來說,哪種數據格式至關重要?
在本文中,我們探討了程序思維提示鏈的推理能力。結果表明,具有某些邏輯和結構特質的優化級別代碼數據是關鍵因素。代碼數據之所以高效,是因為它本質上是半結構化的,且在自然界中豐富存在。我們可以證明:(1) 數據的局部結構特性對于提升推理能力至關重要,這與Prystawski等 (Why think step-by-step? Reasoning emerges from the locality of experience) 的觀點一致。數據中固有的邏輯連貫性或一定量的知識回路是必要的。(2) 過于復雜的結構信息和邏輯對LLM來說是“太難學習”的。本文的實驗結果表明,最有效的是知識的最佳層次復雜度,因為它對大多數大型語言模型來說是可學習的。同時,我們還發現,隨著語言模型中參數數量的增加,它們對復雜知識的理解也在提高。
在本項工作中,我們致力于探究代碼思維鏈數據和大模型推理能力背后的機理,并提出CIRS來衡量代碼數據形式與大模型推理能力之間的關系。通過考慮代碼數據的結構和邏輯屬性,我們使用AST來編碼結構信息,并根據難度和圈復雜度編碼結構特征。通過實證分析,我們發現代碼語言的合適水平在程序思維提示的推理能力中扮演著關鍵角色。進一步的,我們設計了應用數學推理和代碼生成任務的自動合成和分層算法。廣泛的結果證明了所提方法的有效性。在未來,我們將把這項工作擴展到更多場景,例如常識或邏輯推理任務,并以低計算成本訓練強大的推理模型。
本文轉載自:??ZJUKG??
作者:畢禎
