SELF-REFINE: 通過自反饋進行迭代優化 原創
摘要:與人類類似,大型語言模型(LLMs)并不總是在第一次嘗試時生成最佳輸出。受人類改進書面文本方式的啟發,我們提出了SELF-REFINE,這是一種通過迭代反饋和優化來改進LLMs初始輸出的方法。主要思想是首先使用LLM生成初始輸出;然后,由同一個LLM對其輸出提供反饋,并使用該反饋對其進行自我優化。SELF-REFINE 不需要任何監督訓練數據、額外的訓練或強化學習,而是使用單一的LLM作為生成器、優化器和反饋提供者。我們在7項不同任務中評估了SELF-REFINE,這些任務從對話生成到數學推理不等,使用了最先進的LLMs(如GPT-3.5和GPT-4)。在所有評估任務中,使用SELF-REFINE生成的輸出在人工評估和自動評估指標上均優于使用常規一次生成方法的同一LLM,平均提高約20%的任務表現。我們的研究表明,即使是最先進的LLMs(如GPT-4),也可以通過我們簡單的獨立方法在測試時進一步改進。
1 引言
雖然大型語言模型(LLMs)可以生成連貫的輸出,但它們在應對復雜任務時往往表現不佳。這些任務通常具有多重目標,例如對話生成,或者目標難以定義,例如提升程序的可讀性。在這些情況下,現代LLMs可能會生成合理的初始輸出,但仍然可以通過進一步的迭代優化來改進輸出質量,即通過迭代地將候選輸出映射到更好的輸出,以確保達到所需的質量。迭代優化通常涉及訓練一個依賴于特定領域數據的優化模型(例如,Reid和Neubig,2022;Schick等人,2022a;Welleck等人,2022)。其他依賴外部監督或獎勵模型的方法需要大量的訓練數據或昂貴的人類注釋(Madaan等人,2021;Ouyang等人,2022),這在某些情況下可能無法實現。這些限制凸顯了需要一種有效的優化方法,該方法可以應用于各種任務,而無需廣泛的監督。
迭代自我優化是人類解決問題的一個基本特征(Simon,1962;Flower和Hayes,1981;Amabile,1983)。迭代自我優化是一個包含創建初稿并根據自我提供的反饋進行改進的過程。例如,當撰寫電子郵件向同事索要文件時,個人可能會首先寫一個直接的請求,如“盡快把數據發給我”。然而,經過反思,作者會意識到這種措辭可能不夠禮貌,然后將其修改為“嗨,Ashley,你能否在方便的時候將數據發給我?”類似地,當編寫代碼時,程序員可能會先實現一個“快速而簡陋”的版本,隨后經過反思,將代碼重構為更高效、更易讀的解決方案。在本文中,我們展示了LLMs可以在不進行額外訓練的情況下提供迭代的自我優化,從而在廣泛的任務中生成更高質量的輸出。
我們提出了SELF-REFINE:一種迭代自我優化算法,通過交替進行反饋和優化兩個生成步驟,協同工作以生成高質量的輸出。給定模型M生成的初始輸出,我們將其反饋傳回同一個模型M,以獲取反饋。然后,反饋再次傳回同一個模型,以優化先前生成的草稿。這個過程可以重復進行,直到達到指定的迭代次數或模型M確定不需要進一步優化為止。我們使用少量示例提示(few-shot prompting)(Brown等人,2020)引導M生成反饋并將反饋整合到改進的草稿中。圖1展示了高層次的概念,即SELF-REFINE使用同一個底層語言模型生成反饋并優化輸出。
圖 1:給定一個輸入(?),SELF-REFINE 通過生成一個輸出開始,并將其傳回同一模型 M 以獲取反饋(①)。然后將反饋傳回 M,M 根據反饋對之前生成的輸出進行優化(②)。步驟(①)和(②)迭代進行,直到滿足停止條件。SELF-REFINE 使用類似 GPT-3.5 的語言模型進行實例化,不涉及人工輔助。
我們在七個涵蓋不同領域的生成任務上評估了SELF-REFINE,包括自然語言生成和源代碼生成。我們展示了SELF-REFINE相較于強大的LLMs(如GPT-3.5 [text-davinci-003和gpt-3.5-turbo;OpenAI;Ouyang等,2022] 和 GPT-4 [OpenAI,2023])的直接生成方法,性能提升了5%到40%。在代碼生成任務中,SELF-REFINE在應用于強大的代碼模型(如Codex [code-davinci-002;Chen等,2021])時,將初始生成結果提升了最高達13%。我們發布了所有代碼,這些代碼可以輕松擴展到其他LLMs。總的來說,我們的結果表明,即使LLM在第一次生成時不能生成最佳輸出,它通常可以提供有用的反饋并相應地改進自己的輸出。因此,SELF-REFINE通過迭代的(自我)反饋和優化,提供了一種無需任何額外訓練就能從單一模型中獲得更好輸出的有效方法。
2 使用SELF-REFINE進行迭代優化
給定一個輸入序列,SELF-REFINE 生成一個初始輸出,對該輸出提供反饋,并根據反饋對輸出進行優化。SELF-REFINE 在反饋和優化之間進行迭代,直到達到所需的條件。SELF-REFINE 依賴于一個合適的語言模型和三個提示(用于初始生成、反饋和優化),且不需要進行訓練。SELF-REFINE 的工作流程如圖1和算法1所示。接下來,我們將詳細描述 SELF-REFINE 的工作原理。
初始生成
給定輸入 x 、生成提示 pgen 和模型 M ,SELF-REFINE 生成初始輸出 y0 :
y0 = M(pgen || x)
例如,在圖2(d)中,模型為給定輸入生成了功能上正確的代碼。這里,pgen 是一個特定任務的少量樣本提示(或指令)用于初始生成,而 ∥ 表示連接。這個少量樣本提示包含了任務的輸入-輸出對 ?x(k), y(k)?。(原文注釋:少量樣本提示(也稱為“上下文學習”)為模型提供一個由目標任務的 k 個上下文示例組成的提示,每個示例都是以輸入-輸出對 ?xi, yi? 的形式出現的(Brown 等人,2020)。)
反饋生成
接下來,SELF-REFINE 使用相同的模型 M 為其生成的輸出提供反饋 fbt ,使用的是針對任務的反饋生成提示 pfb :
fbt = M(pfb || x || yt)
反饋可能涉及輸出的多個方面。例如,在代碼優化中,反饋可能涉及代碼的效率、可讀性和整體質量。
在這里,提示 pfb 以輸入-輸出-反饋三元組的形式提供反饋示例 ?x(k), y(k), fb(k)?。我們提示模型通過 fb(k) 寫出可操作且具體的反饋。所謂“可操作”,意味著反饋應包含可能改善輸出的具體行動。所謂“具體”,意味著反饋應指出輸出中需要改變的具體短語。例如,圖 2(e) 中的反饋是“這段代碼因為使用了暴力解法的 for 循環而運行緩慢。更好的方法是使用公式...(n(n+1))/2”。這個反饋是可操作的,因為它建議采取行動“使用公式...”。這個反饋是具體的,因為它提到了“for 循環”。
優化
然后,SELF-REFINE 使用模型 M 根據反饋優化其最近生成的輸出:
yt+1 = M(prefine || x || yt ||fbt)
例如,在圖 2(f) 中,根據初始輸出和生成的反饋,模型生成了一個更短且運行速度更快的重新實現版本。提示 prefine 提供了基于反饋改進輸出的示例,形式為輸入-輸出-反饋-優化四元組 ?x(k), yt(k), fb(k)t, y(k)t+1?。
迭代 SELF-REFINE
SELF-REFINE 在反饋和優化步驟之間交替進行,直到滿足停止條件。停止條件 stop(fbt, t) 可以是指定的迭代次數 t ,也可以是從反饋中提取的停止指標(如標量停止分數)。在實踐中,模型可以通過提示生成停止指標,并根據任務確定停止條件。
為了讓模型了解之前的迭代,我們通過將以前的反饋和輸出附加到提示中來保留其歷史記錄。直觀上,這可以讓模型從過去的錯誤中學習,并避免重復這些錯誤。更準確地說,公式(3)實際上被實例化為:
yt+1 = M(prefine || x || y0 || fb0 || ... || yt || fbt)
最后,我們將最后的優化結果 yt 作為 SELF-REFINE 的輸出。
算法1總結了SELF-REFINE的流程,圖2展示了SELF-REFINE在對話生成和代碼優化任務中的應用示例。關鍵思想是,SELF-REFINE 使用同一個底層LLM來生成、獲取反饋并根據自身的反饋優化輸出。它只依賴于少量示例中的監督。
圖 2:SELF-REFINE 示例:初始輸出由基礎LLM生成,然后傳回同一LLM以接收反饋,再傳回同一LLM對輸出進行優化。上排展示了對話生成的例子,其中通過應用反饋,將初始對話響應轉換為更具參與性且更能理解用戶的響應。下排展示了代碼優化的例子,其中通過應用反饋,使代碼變得更高效。
(注釋: 圖 2 內容
- (a) 對話:x, yt
- 用戶: 我對打乒乓球感興趣。
- 回應: 我確信這是一種很好的社交和保持活躍的方式。
- (b) 反饋 fb
- 吸引力: 沒有提供關于乒乓球或如何打乒乓球的信息。
- 用戶理解: 缺乏對用戶需求和心理狀態的理解。
- (c) 優化 yt+1
- 回應 (優化后): 聽起來你對此很感興趣!這是一項需要快速反應和良好手眼協調能力的有趣運動。你以前玩過嗎,還是想學習?
- (d) 代碼優化:x, yt
- 生成 1 到 N 的和
```python
def sum(n):
res = 0
for i in range(n + 1):
res += i
return res
```
- (e) 反饋 fb
- 這段代碼執行緩慢,因為它使用了暴力解法。更好的方法是使用公式... (n(n+1))/2。
- (f) 優化 yt+1
- 代碼 (優化后)
```python
def sum_faster(n):
return (n (n + 1)) // 2
```
原理解釋
圖 2 展示了 SELF-REFINE 方法的實際應用實例。這個方法利用同一模型(如GPT-3.5或GPT-4)在生成初始輸出后,通過自我反饋循環對輸出進行迭代優化。在這個過程中:
1. 初始生成(如圖中部分 a 和 d):模型根據給定的輸入(比如對話或代碼生成任務的指令)生成一個初始輸出。
2. 生成反饋(如圖中部分 b 和 e):模型評估初始輸出的質量或效率,并生成關于如何改進這一輸出的具體反饋。
3. 迭代優化(如圖中部分 c 和 f):模型使用反饋來調整或完全重寫初始輸出,以提高輸出的質量或效率。
這種方法的核心優勢在于其自適應性和迭代性,使得即使是單一模型也能通過自我評估和調整來顯著改進其輸出。通過這種方式,模型可以自主地學習并優化其性能,而無需外部的數據或額外的訓練。這在自然語言處理和代碼生成等多種領域均展示了顯著的應用潛力。)
3 評估
我們在 7 項跨越不同領域的生成任務上評估了 SELF-REFINE,這些任務包括自然語言生成和源代碼生成。我們展示了 SELF-REFINE 相較于強大的 LLMs(如 GPT-3.5 [text-davinci-003 和 gpt-3.5-turbo;OpenAI;Ouyang 等,2022] 和 GPT-4 [OpenAI,2023])的直接生成方法,性能提升了 5% 到 40% 的絕對值。在代碼生成任務中,SELF-REFINE 應用于強大的代碼模型(如 Codex [code-davinci-002;Chen 等,2021])時,將初始生成結果提升了最高達 13% 的絕對值。我們發布了所有代碼,這些代碼可以輕松擴展到其他 LLMs。
3.1 SELF-REFINE 的實例化
我們按照第 2 節中的高級描述實例化了 SELF-REFINE。反饋-優化的迭代持續進行,直到達到期望的輸出質量或任務特定標準,最多可進行 4 次迭代。為了使我們的評估在不同模型之間具有一致性,即使是在對指令響應良好的模型(如 ChatGPT 和 GPT-4)中,我們也將反饋和優化均實現為少量示例提示。
基礎 LLMs:我們的主要目標是評估是否可以通過 SELF-REFINE 來提高任何強大的基礎 LLMs 的性能。因此,我們將 SELF-REFINE 與相同的基礎 LLMs 但不進行反饋-優化迭代的生成方法進行了比較。在所有任務中,我們都使用了三種主要的強大基礎 LLMs:GPT-3.5(text-davinci-003)、ChatGPT(gpt-3.5-turbo)和 GPT-4(OpenAI,2023)。在代碼相關的任務中,我們還嘗試了使用 CODEX(code-davinci-002)。在所有任務中,GPT-3.5 或 GPT-4 均為先前的最先進模型。我們使用了來自先前工作的相同提示(如代碼優化和數學推理),如果沒有,我們則創建了新的提示,如附錄 S 所述。所有設置均使用貪婪解碼,溫度為 0.7。
3.2 評估指標
我們報告了三種類型的評估指標:
- 任務特定指標:在可能的情況下,我們使用來自先前工作的自動化指標(如數學推理中的%解答率;代碼優化中的%程序優化率;約束生成中的覆蓋率%)。
- 人工偏好:在對話響應生成、代碼可讀性提升、情感逆轉和首字母縮略詞生成任務中,由于沒有自動化指標,我們對輸出的一個子集進行了盲選人工 A/B 評估,以選擇偏好的輸出。附錄 C 提供了更多詳細信息。
- GPT-4 偏好:除了人工偏好之外,我們還使用 GPT-4 作為人工偏好的代理,依據先前的工作(Fu 等,2023;Chiang 等,2023;Geng 等,2023;Sun 等,2023),并發現與人工偏好高度相關(情感逆轉 82%,首字母縮略詞生成 68%,對話響應生成 71%)。對于代碼可讀性提升,我們提示 GPT-4 計算在給定上下文中適當命名的變量所占的比例(例如,將 `x = []` 改為 `input_buffer = []`)。附錄 D 提供了更多詳細信息。
3.3 結果
表 1 展示了我們的主要結果:
SELF-REFINE 在所有模型大小的基礎模型上均表現出了持續的改進,并且在所有任務中還優于先前的最先進方法。例如,GPT-4+SELF-REFINE 相比基礎 GPT-4 在代碼優化中絕對提升了 8.7%(優化百分比從 27.3% 提高到 36.0%)。附錄 J 中提供了置信區間。對于代碼相關的任務,當使用 CODEX 時,我們發現了類似的趨勢;這些結果包含在附錄 F 中。
在與基礎模型相比,我們觀察到的最大收益之一是在約束生成任務中,模型需要生成包含多達 30 個給定概念的句子。我們認為,SELF-REFINE 能夠顯著改善這一任務,因為在第一次嘗試時有更多的機會遺漏一些概念,因此 SELF-REFINE 允許模型隨后修正這些錯誤。此外,該任務有非常多的合理輸出,因此 SELF-REFINE 可以更好地探索可能的輸出空間。
在對話響應生成、情感逆轉和首字母縮略詞生成等基于偏好的任務中,SELF-REFINE 帶來了尤其高的收益。例如在對話響應生成中,GPT-4 的偏好得分提高了 49.2%——從 25.4% 提高到 74.6%。同樣,在其他基于偏好的任務中,我們在所有模型上都觀察到了顯著的提升。
在數學推理中的適度性能提升可以歸因于模型難以準確識別是否存在錯誤。在數學推理中,錯誤可能是微妙的,有時僅限于單行或不正確的運算。此外,看似一致的推理鏈可能會誤導 LLMs,使其認為“一切看起來都不錯”(例如,ChatGPT 對 94% 的實例的反饋是“所有內容看起來都不錯”)。在附錄 H.1 中,我們展示了如果一個外部來源可以識別當前數學答案是否錯誤,SELF-REFINE 在數學推理中的收益要大得多(超過5%)。
基礎 LLMs 的改進是持續一致的:通常,GPT-4+SELF-REFINE 在所有任務中均優于 GPT-3.5+SELF-REFINE 和 ChatGPT+SELF-REFINE,即使在某些任務中基礎 GPT-4 的初始結果低于 GPT-3.5 或 ChatGPT。因此,我們認為 SELF-REFINE 允許更強大的模型(如 GPT-4)充分發揮其潛力,即使這種潛力在標準的單次輸出生成中并未完全表現出來。附錄 F 中提供了與其他強大基線的比較。
4 分析(略)
5 相關工作
利用人類和機器生成的自然語言(NL)反饋來精煉輸出,在多種任務中已被證明非常有效,包括摘要(Scheurer et al., 2022)、腳本生成(Tandon et al., 2021)、程序合成(Le et al., 2022a; Yasunaga and Liang, 2020)和其他任務(Bai et al., 2022a; Schick et al., 2022b; Saunders et al., 2022a; Bai et al., 2022b; Welleck et al., 2022)。不同的精煉方法在反饋的來源和格式以及獲得精煉器的方式上有所不同。表 3 總結了與 SELF-REFINE 密切相關的先前精煉方法。
反饋來源
人類一直是反饋的有效來源(Tandon et al., 2021; Elgohary et al., 2021; Tandon et al., 2022; Bai et al., 2022a)。由于人類反饋成本高昂,幾種方法使用標量獎勵函數作為人類反饋的替代品(例如,(Bai et al., 2022a; Liu et al., 2022; Lu et al., 2022; Le et al., 2022a; Welleck et al., 2022))。其他來源,如編譯器(Yasunaga and Liang, 2020)或維基百科編輯(Schick et al., 2022b)可以提供領域特定的反饋。最近,LLMs已被用于為一般領域生成反饋(Fu et al., 2023; Peng et al., 2023; Yang et al., 2022),然而,我們的方法是唯一一種使用 LLM 在其自身輸出上生成反饋以用于精煉的方法。
反饋的表現形式
反饋的形式通常可以分為自然語言(NL)和非 NL 反饋。非 NL 反饋可以來自人類提供的示例對(Dasgupta et al., 2019)或標量獎勵(Liu et al., 2022; Le et al., 2022b)。在這項工作中,我們使用 NL 反饋,因為這使得模型能夠輕松地使用生成輸出的同一 LM 提供自我反饋,同時利用現有的預訓練 LLMs,如 GPT-4。
精煉器類型
已使用反饋和精煉對學習有監督的精煉器(Schick et al., 2022b; Du et al., 2022; Yasunaga and Liang, 2020; Madaan et al., 2021)。由于收集有監督數據的成本高昂,一些方法使用模型生成學習精煉器(Welleck et al., 2022; Peng et al., 2023)。然而,精煉器是針對每個新領域進行訓練的。最后,(Yang et al., 2022)使用為故事生成專門定制的反饋和精煉提示。在這項工作中,我們避免訓練單獨的精煉器,并展示了同一模型可以在多個領域中用作精煉器和反饋的來源。
非精煉強化學習(RL)方法
與擁有顯式精煉模塊的方法不同,一種替代的整合反饋的方式是通過優化標量獎勵函數,例如使用強化學習(例如,Stiennon et al. (2020); Lu et al. (2022); Le et al. (2022a))。這些方法與 SELF-REFINE 不同,因為模型無法訪問中間生成的反饋。其次,這些 RL 方法需要更新模型的參數,與 SELF-REFINE 不同。
6 限制與討論
我們方法的主要限制是基礎模型需要具備足夠的少數樣本建模或指令遵循能力,以便學習如何提供反饋并在上下文中進行精煉,而無需依賴監督模型和監督數據。
此外,本研究中使用的語言模型未開源,即 GPT-3.5、ChatGPT、GPT-4 和 CODEX。現有文獻(Ouyang 等人,2022)并未詳細描述這些模型的細節,如預訓練語料、模型大小和模型偏見。此外,這些模型不是免費使用的,使用它們進行研究需要一定的資金。盡管如此,我們發布了我們的代碼和模型輸出,以確保我們工作的可復現性。
我們的工作另一個限制是,我們僅在英語數據集上進行了實驗。在其他語言中,當前模型可能無法提供相同的效益。
最后,存在壞行為者使用提示技術引導模型生成更有害或有毒文本的可能性。我們的方法沒有明確防范這一點。
7 結論
我們介紹了 SELF-REFINE:一種允許大型語言模型迭代地提供自我反饋并優化其自身輸出的新方法。SELF-REFINE 在單個 LLM 內運作,無需額外的訓練數據或強化學習。我們通過廣泛的任務展示了 SELF-REFINE 的簡單性和易用性。通過展示 SELF-REFINE 在多種任務中的潛力,我們的研究為持續探索和發展大型語言模型做出了貢獻,旨在減少實際設置中人類創造過程的成本。我們希望我們的迭代方法將促進在這一領域的進一步研究。為此,我們匿名提供了我們所有的代碼、數據和提示。
本文轉載自公眾號AIRoobt ,作者:AIRoobt
原文鏈接:??https://mp.weixin.qq.com/s/7wbN1NL6pmZCB0udqOph6g??
