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