機器之心報道
編輯:趙陽
作爲最領先的大模型,GPT-4 有自我糾正生成代碼的能力,結合人類反饋,自我糾正能力還能進一步的提高。
大型語言模型(LLM)已被證明能夠從自然語言中生成代碼片段,但在應對複雜的編碼挑戰,如專業競賽和軟件工程專業面試時,仍面臨巨大的挑戰。最近的研究試圖通過利用自修複來提高模型編碼性能。自修複是指讓模型反思并糾正自己代碼中的錯誤。
下圖 1 顯示了基于自修複方法的典型工作流程。首先,給定一個規範,從代碼生成模型中對程序進行采樣;然後在作爲一部分規範提供的一套單元測試上執行程序;如果程序在任一單元測試中失敗,則将錯誤消息和錯誤程序提供給一個反饋生成模型,該模型輸出代碼失敗原因的簡短解釋;最後,反饋被傳遞給修複模型,該模型生成程序的最終固化版本。
從表面上看,這是一個非常有吸引力的想法。這種設計能讓系統克服在解碼過程中由離群樣本引起的錯誤;在修複階段,可以輕松地整合來自編譯器、靜态分析工具和執行引擎等符号系統的反饋,并模仿人類軟件工程師編寫代碼的試錯方式。
然而,自修複需要更多的模型調用,計算成本較高。特别要注意的是,自修複能否奏效,最終歸結爲在同等計算性能預算下,是否能從模型中抽取更多代碼樣本,并将其與作爲一部分任務提供的單元測試套件進行比較。
至關重要的是,自修複的有效性不僅取決于模型生成代碼的能力(文獻中對此進行了廣泛研究),還取決于它識别代碼(由模型本身生成)在任務規範方面是如何出錯的能力。此前沒有任何工作試圖詳細研究這些能力的影響。
本文中,來自 MIT、微軟研究院的研究者在解決競賽級别的代碼生成任務時,使用 GPT-3.5 和 GPT-4 研究自修複的有效性。研究者首先提出一種新的評估策略,稱爲 pass@t,其中獲得正确程序的可能性(相對于給定的單元測試)相對于從模型中采樣的 token 總數進行加權。
使用新的評估策略代替傳統的 pass@k 度量(根據試驗次數衡量通過率),研究者能夠準确地将通過自修複獲得的性能與模型在生成反饋和進行修複時所做的任何額外工作進行比較。研究者仔細探究了在一系列超參數下的動态自修複過程。
最後,鑒于研究的主要目标是深入了解最先進的代碼生成模型反思和調試自己代碼的能力,本文進行了一組實驗,單獨研究了改進反饋階段的影響。通過分析使用比代碼生成模型更強的反饋生成模型(使用 GPT-4 爲 GPT-3.5 代碼模型生成反饋)的影響,研究者進行了一項研究:讓人類對不正确的程序提供反饋,以便将模型生成的自反饋與人類提供的自反饋進行比較。
論文地址:https://arxiv.org/pdf/2306.09896.pdf
從本文的實驗中,研究者有了以下發現:
1. 當考慮進行檢查和修複的成本時,自修複的性能收益隻能用 GPT-4 來衡量;對于 GPT-3.5,在所有配置下,修複的通過率低于或等于基線模型 / 無修複方法的通過率。
2. 即使對于 GPT-4,性能提升也是适度的(66% → 71% 的通過率,預算爲 7000 個 token,約 45 個獨立同分布(i.i.d.)的 GPT-4 樣本),并同時取決于初始程序是否具有足夠的多樣性。
3. 用 GPT-4 産生的反饋代替 GPT-3.5 對錯誤的解釋,可以獲得更好的自修複性能,甚至超過了基線的無修複 GPT-3.5 方法(50% → 7000token 時爲 54%)。
4. 用人類的解釋取代 GPT-4 自己的解釋可以顯著改善修複結果,從而使通過測試的修複程序數量增加 57%。
愛丁堡大學博士生符堯表示:「隻有 GPT-4 可以自我改進,而較弱的模型不能,這一發現非常有趣,表明(大模型存在)一種新型的湧現能力(即改進自然語言反饋),可能隻有在模型足夠成熟(大而整齊)時才存在。大模型的這種能力在論文《Improving Language Model Negotiation with Self-Play and In-Context Learning from AI Feedback》中也存在過。
隻有足夠成熟的模型才能清楚(listen to)并改進自然語言反饋,較弱的模型要麽無法理解反饋,要麽無法對其進行改進。
我傾向于相信這種湧現能力(通過語言反饋進行自我改進)會對 LLM 研究産生非常重要的影響,因爲這意味着 AI 可以在很少的人類監督下不斷自主改進。」
方法
自修複概述
如上圖 1 所示,自修複方法包括 4 個階段:代碼生成、代碼執行、反饋生成和代碼修複。接下來正式定義這四個階段。
代碼生成
給定一個規範 ψ,程序模型 M_P 首先生成 n_p 個獨立同分布樣本,研究者将其表示爲
代碼執行
然後在測試台上執行這 n_p 個代碼樣本。研究者假設可以訪問可執行形式的全套測試,因此如果任何樣本通過了所有測試,系統就會停止,因爲這時已經找到了一個令人滿意的程序。否則,系統将收集執行環境返回的錯誤消息
。這些錯誤消息要麽包含編譯 / 運行時錯誤信息,要麽包含程序輸出與預期輸出不同的示例輸入。示例如圖 1(組件 3)所示。
反饋生成
由于來自執行環境的錯誤消息通常非常高級,因此它們提供的修複信号很少。作爲中間步驟,研究者使用反饋模型來更詳細地解釋出了什麽問題;示例如圖 1(組件 4)所示。形式上,在這個階段,他們爲每個錯誤的程序 p_i 生成 n_f 個反饋字符串
,具體如下所示:
有了明确的反饋生成步驟,就可以消融這個組件,獨立地研究它的意義。
代碼修複
在最後一步中,對于每個初始程序 p_i 和反饋 f_ij,可以從
采樣 n_r 個候選修複程序:
修複樹。研究者将該過程生成的包含文本和程序的樹稱爲植根于規範中的 ψ,然後分支到初始程序 p_i,每個初始程序分支到反饋 f_ij,然後對修複樹 r_ijk 進行修複,如下圖所示。
注意:聯合采樣反饋和修複。上述通用框架不要求編程模型和反饋模型相同,因此兩個模型可以使用各自的專有模型。然而,當 M_P=M_F 時,研究者在單個 API 調用中聯合生成反饋和修複的程序,因爲 GPT-3.5 和 GPT-4 都有在響應中交織文本和代碼的自然傾向。形式上,研究者将其表示爲
pass@t:通過率與 token 數量的關系
由于自修複需要幾個非均勻成本的依賴模型調用,因此 pass@k 這種在 k 個獨立同分布樣本中獲得正确程序的可能性指标,不是用于比較和評估自修複的各種超參數選擇的合适度量。相反,研究者将通過率作爲從模型中采樣的 token 總數的函數,稱之爲 pass@t。
形式上,假設一個數據集 D={ ψ _d}_d 和超參數(M_P,M_F,n_p,n_f,n_r)的一組選定值。令
表示上文所述對任務 ψ _d 進行采樣的修複樹;令 size(T^i_d)表示修複樹中的程序和反饋 token 的總數;并在當且僅當 T^i_d 至少有一個葉子節點程序滿足規範中的單元測試 ψ _d 時,令 T^i_d |= ψ _d 爲真。然後 pass@t 這種超參數選擇的度量被定義爲希望通過這種超參數選擇生成的 token 數量時預期通過率:
實驗繪制了這兩個量的 bootstrapped estimates(一種統計估計方法,通常用于評估參數估計的不确定性)。爲了獲得這些數值,本文首先爲每個任務規範生成一個非常大的修複樹,其中:有 N_p ≥ n_p 個初始程序樣本;每個錯誤程序有 N_f ≥ n_f 個反饋字符串;并且每個反饋串有 N_r ≥ n_r 個修複候選。給定(n_p,n_f,n_r)的設置,然後從這個凍結的數據集中對 N_t 個不同的修複樹進行子采樣(帶替換)。最後,本文計算了這 N_t 棵樹上通過率和樹大小的樣本均值和标準差。如此估計 pass@t 大大降低了實驗的計算成本,因爲可以重用相同的初始數據集來計算 n_p、n_f 和 n_r 的所有不同選擇的估計。
本文所有實驗中,N_p=50,自修複方法中 n_p ≤ 25,基線無修複方法中 n_p ≤ 50。類似地,對于反饋,本文令 N_f=25 和 N_f ≤ 10。對于候選修複,由于本文在大多數實驗中對反饋和修複進行聯合采樣,因此本文設置 N_r=n_r=1。最後,本文對所有設置使用 N_t=1000。
實驗
研究者針對以下問題進行了相關實驗:
(a)在具有挑戰性的編程難題的背景下,對于本文提出的模型,自修複是否比不修複的獨立同分布采樣更好?如果是,在什麽超參數下自修複最有效?
(b) 更強的反饋模型會提高模型的修複性能嗎?
(c) 即使是最強的模型,讓人參與提供反饋會帶來更好的修複性能嗎?
本文使用 APPS 數據集評估了這些關于 Python 編程挑戰的疑惑。
自修複需要強大的模型和多樣化的初始樣本
令 M_P=M_F ∈ {GPT-3.5,GPT-4},用于代碼 / 修複生成和反饋生成的是同一個模型。GPT-3.5 的結果見圖 3,GPT-4 的結果見圖 4。
從圖中可以看出,對于 GPT-3.5 模型,pass@t 在所有的 n_p、n_fr 選值中,都低于或等于相應基線(黑線),這清楚地表明自修複不是 GPT-3.5 的有效策略。另一方面,對于 GPT-4,有幾個 n_p、n_fr 值,其自修複的通過率明顯優于基線的通過率。例如,當 n_p=10,n_fr=3 時,通過率從 65% 增加到 70%,當 n_p=25,n_fr=1 時,通過率從 65% 增加至 71%。
GPT-4 的反饋改進了 GPT-3.5 自修複能力
接下來,本文進行了一個實驗,在這個實驗中,研究者評估了使用一個單獨的、更強的模型來生成反饋的影響。這是爲了檢驗一種假設:即模型無法内省和調試自己本身的代碼,從而阻礙了自修複(尤其是 GPT-3.5)。
該實驗的結果如圖 5 所示(亮藍線)。研究者觀察到,就絕對性能而言,M_P=GPT-3.5,M_F=GPT-4 确實突破了性能障礙,變得比 GPT-3.5 的獨立同分布采樣效率略高。這表明反饋階段至關重要,改進它可以緩解 GPT-3.5 自修複的瓶頸。
人類反饋顯著提高了 GPT-4 自修複的成功率
在本文的最後一個實驗中,研究者考慮了在使用 GPT-4 等更強的模型進行修複時使用專業人類程序員的反饋的效果。這項研究的目的不是直接比較人在循環中的方法與自修複方法,因爲人在循環方法會帶來更多的認知負擔,而本文沒有對此進行研究。相反,本文的目标是了解模型識别代碼中錯誤的能力與人類相比如何,以及這如何影響自修複的下遊性能。因此,該研究對人類反饋對自修複的影響進行了定性和定量分析。
結果總結在表 1 中。我們首先注意到,當我們用人類參與者的調試取代 GPT-4 自己的調試時,總體成功率提高了 1.57 倍以上。也許不足爲奇的是,随着問題變得越來越困難,相對差異也會增加,這表明當任務(和代碼)變得更加複雜時,GPT-4 産生準确和有用反饋的能力遠遠落後于我們的人類參與者。
此外,該研究還定性地分析了人類參與者提供的反饋與 GPT-4 提供的反饋之間的差異。
隻有 2/80 個人貢獻的反饋字符串包括僞代碼或顯式 Python;也就是說,獲得的幾乎所有人類反饋都是自然語言,偶爾穿插着單語句數學 / 代碼表達式。
GPT-4 的反饋更可能明顯不準确(32/80 與人類反饋的 7/80)。
GPT-4 更可能明确地建議小的變化(54/80 對 42/80;28/48 對 38/73,當看起來正确時),而我們的人類參與者顯示出更大的趨勢來建議高水平的變化(23/80 對 18/80,GPT-4;21/73 對 13/48,當看起來正确時)。
人類參與者有時會表達不确定性(7/80);GPT-4 沒有(0/80)。
進一步的分析表明,表 1 中的結果不是由于人爲因素造成的,例如參與者提供了模型簡單複制的顯式代碼塊。相反,性能的差異似乎是由更準确的反饋、在需要時建議對代碼進行高級别、大規模更改的更大能力,以及參與者表達其不确定性的能力(而不是自信地給出潛在的不準确反饋)共同造成的。
© THE END
轉載請聯系本公衆号獲得授權
投稿或尋求報道:[email protected]