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