原文出处:Techniques to improve reliability 原作者:OpenAI · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与 OpenAI 所有。
上篇讲了把复杂任务拆小、让模型先推理再作答的思维链(chain of thought)提示。本篇继续讲在它之后发表出来的几种扩展做法,再往后是自我一致性、验证器等相关技巧,以及解释这些技巧为什么有效的可靠性理论。
思维链提示的扩展做法
围绕思维链提示,业界还发表了不少扩展技术。
筛选-推断提示(selection-inference prompting)
方法
Antonia Creswell 等人给思维链技术做了一个扩展:把"生成解释和答案"的单一提示拆成更小的部件。先用一个提示从文本里挑出相关的事实子集("筛选提示",selection prompt),再用第二个提示从这些被挑出的事实推出结论("推断提示",inference prompt)。两类提示交替循环,生成多步推理,最终落到一个答案上。作者用一张图说明了这个思路:原文此处有一张图,画的是这套循环的示意,即筛选提示先取出相关句子,推断提示再基于这些句子得出结论,如此往复,直到给出最终答案(图出自 Creswell 等人 2022 年的论文 Selection-Inference: Exploiting Large Language Models for Interpretable Logical Reasoning)。
结果
作者把这些技术用在一个 70 亿参数的模型上,发现:在 bAbi 和 Proof Writer 这两个基准任务上,筛选-推断提示的表现比思维链提示好出一大截,这两个任务都要求更长的推理步骤序列。他们拿到的最佳成绩,是把筛选-推断提示与微调结合起来实现的。原文此处有一张图,是各方法在这两个基准上的成绩对比。
启示
这些基准上的收益虽然大,但基准本身就是专门挑出来的,它们都需要长链条的推理。换到不需要多步推理的问题上,收益大概率要小得多。
这组结果给出了两条与大型语言模型打交道的一般经验。第一条:把复杂任务拆成小任务,是提高可靠性和性能的好办法;任务拆得越原子化,模型犯错的空间就越小。第二条:想拿到最高性能,往往要把微调和你选定的方法结合起来用。
想进一步了解,请读完整论文。
忠实推理架构(faithful reasoning architecture)
发表筛选-推断技巧几个月后,同一批作者在后续论文里扩展了这套技术,补充了三个想法:
- 弄清楚筛选-推断循环什么时候该停、什么时候该继续
- 加入一个价值函数(value function),帮助在多条推理路径中搜索
- 微调模型,让它围绕句子编号(例如 sen1)而不是句子原文来推理,从而减少编造假事实的幻觉(hallucination)
方法
在最初的筛选-推断技术里,专门的"筛选"和"推断"两类提示交替使用:一边挑事实,一边从事实做推断,合起来生成一串推理步骤。作者给这套技术加了两个部件。
第一,加一个"中止器"(halter)模型。每完成一步推断,就问它:到目前为止的推断够不够回答问题。够了,就由模型生成最终答案。中止器带来两个好处:
- 它能视情况叫停或放行筛选-推断过程
- 如果过程一直停不下来,你会拿不到答案,而这往往比得到一个编造的猜测更好
原文此处有两张图,画的是这套架构的整体流程,以及加入中止器之后的推理循环。
第二,作者加入一个价值函数,用来评估推理步骤的质量,并在多条推理路径上做搜索。这呼应了提高可靠性的一个常见主题:不让模型只生成一个答案,而是生成一批答案,再用某种价值函数、判别器(discriminator)或验证器(verifier)模型挑出最好的那个。原文此处有一张图,演示了如何用价值函数在多条推理路径中做搜索。
除了这两个扩展,作者还用了一个技巧来减少编造假事实的幻觉:不让模型把事实句子写出来,而是微调模型去操作句子编号(例如 sen1)。这样能防止模型编造提示上下文里根本没出现过的假事实。原文此处有一张图,展示的是句子编号的处理方式。
结果
作者在两个基准上评估了这套技术:ProofWriter(结果未展示)和 EntailmentBankQA(结果有展示)。这套技术显著提高了准确率,在较难的推理题上尤其明显。原文此处有一张表,列出了各方法在 EntailmentBankQA 上的准确率对比。另外,那个句子编号的小技巧几乎彻底消除了幻觉。原文此处有一张表,展示了幻觉率的对比。
启示
这篇论文示范了一整套提高大型语言模型可靠性的实用经验:
- 把复杂任务拆成更小的、更可靠的子任务
- 一步一步生成答案,边走边评估
- 生成许多可能的答案,用另一个模型或函数挑出最好看的
- 约束模型能说什么来减少幻觉,例如用句子编号代替句子原文
- 在专门任务上微调模型,把性能拉满
想进一步了解,请读完整论文。
由少到多提示(least-to-most prompting)
思维链提示除了不擅长长推理链(这正是筛选-推断技术的强项),在示例很短、任务却很长的情形下也容易失手。
方法
由少到多提示是另一套把推理任务拆成更小、更可靠子任务的技术。思路是用类似 To solve {question}, we need to first solve: " 的提示,让模型自己说出一个子任务。拿到子任务后,模型接着给出解法。把解法拼到原问题上,再重复这个过程,直到产出最终答案。原文此处有一张图,画的是这套"先拆子问题、逐个解决、边解边拼回题目"的流程。
结果
在涉及长推理链的基准上(用的模型是 code-davinci-002,它为代码而生但仍能理解文本),作者测得的收益高达从 16% 到 99.7%。原文此处有三张表,分别是末字母拼接(last-letter-concatenation)、SCAN 指令遵循、DROP 数字推理这几项任务上的结果。
启示
上面这些收益虽然亮眼,但测评只覆盖了一小类需要长推理链的任务。即便如此,它们仍说明了一个常见的道理:提高可靠性的办法,一是把复杂任务拆成更小的子任务,二是给模型更多时间和空间去把答案做出来。
想进一步了解,请读完整论文。
相关思路
助产术提示(maieutic prompting)
方法
前面的技巧都在设法提高正确答案出现的概率,另有一条路是反着走:让 GPT-3 生成一棵解释树,把可能的解释(正确的和错误的都要)全部摆出来,再分析它们之间的关系,猜哪一组是对的。这套技术由 Jaehun Jung 等人在 2022 年 5 月提出,命名为 maieutic prompting(maieutic 意为"助产术",指苏格拉底靠提问引出想法的那套方法)。
这套方法比较复杂,流程如下:
- 第一步,搭一棵助产术树,每个节点是一句可真可假的陈述:
- 从一道选择题或判断题开始(例如
War cannot have a tie,战争不可能打平) - 对问题的每个可能答案,用提示(如
War cannot have a tie? True, because)让模型生成对应的解释 - 然后,把问题和生成的解释一起喂给模型,让它给出答案。如果翻转解释(在前面加一句
It is wrong to say that {explanation})就能翻转答案,这条解释就算"逻辑自洽"(logically integral) - 解释不自洽,就把每条解释本身变成一道判断题,递归地重复上面的过程,为新问题再生成解释
- 递归解释结束后,你得到一棵解释树,树上每个叶子都满足:翻转这条解释,模型的答案就会跟着翻转
- 第二步,把树转成一张关系图:
- 对树中每个节点,计算模型对它的相对信念(从"给定这条解释后回答
True的概率"推断出来) - 对树中每两个节点,让模型判断它们之间是蕴含(implied,即一个成立意味着另一个成立)还是矛盾关系
- 第三步,找出最一致的一组信念,认它们为真:
- 具体来说,用每个节点的信念强度和节点之间的逻辑关系,把问题形式化为一个加权最大可满足性(weighted maximum satisfiability,MAX-SAT)问题
- 用求解器找出最自洽的一组信念,取之为真
原文此处有两张图,一张画的是助产术树的递归解释结构,一张画的是由这棵树转出的信念关系图。
结果
原文此处有一张表,列出了这套方法在各基准上相对基线的表现。
启示
除了复杂之外,这套方法还有一个局限:它看起来只适用于能出成选择题的问题。
想进一步了解,请读完整论文。
进一步扩展
自我一致性(self-consistency)
方法
对答案是一组离散取值(用数学的话说,discrete set of answers)的任务,提高可靠性有个简单办法:让模型多采样几条解释和答案(把温度,temperature,调成正值),然后取出现次数最多的那个答案。原文此处有一张图,画的是这套"多路推理、多数投票"的流程。
结果
在一组数学与推理基准上,这套技巧把准确率抬高了 1 到 24 个百分点不等。(展示的是谷歌 LaMDA 模型的结果;换用谷歌更大的 PaLM 模型,基线更高,收益略小。)原文此处有一张图,是各基准上基线与自我一致性的准确率对比。
启示
这套技巧实现简单,但可能昂贵:一口气生成 10 个答案,成本就翻 10 倍。和许多同类技巧一样,它只适用于答案数量有限的任务。开放性任务(比如写一首诗)每个答案都独一无二,取"最常见答案"是什么意思就不好说了。
还有一点:这招在"同一个答案有多条路径、多种说法可以到达"时最有用;如果只有唯一一条路,它可能完全帮不上忙。极端例子:任务是生成单令牌(token)答案,那么从 100 次生成里取出现最多的那个令牌,和直接取对数概率(logprob)最高的那个令牌没有区别,后者在温度为 0 时做一次生成就能拿到。
验证器(verifier)
提高任务表现的另一个关键技巧,是训练一个验证器(verifier)或判别器(discriminator)模型,用来评估主生成模型的输出。判别器不通过,就重新采样生成模型,直到拿到一个可接受的输出。很多时候,判断一个答案比做出一个答案容易,这正是这套方法有威力的原因。
方法
2021 年,OpenAI 的研究者把这招用在小学数学应用题上,流程如下:
- 先拿问题和解答微调一个模型
- 对训练集里每道题,生成 100 个解答
- 依据最终答案对不对,把这 100 个解答自动标注为正确或错误
- 用这批有对有错的解答,微调一个验证器模型,让它能判断"题目加候选解答"是对是错
- 最后,在测试时让生成模型对每道题产出 100 个解答,取验证器打分最高的那个作为最终答案
原文此处有一张图,画的是这套"生成、标注、训练验证器、测试时筛选"的流程。
结果
用一个 1750 亿参数的 GPT-3 模型和 8000 个训练样本,这套技巧把小学数学题的准确率从约 33% 大幅拉到约 55%。原文此处有一张图,是准确率随采样方案变化的对比。
启示
和自我一致性一样,这招可能烧钱:每道题生成 100 个解答,成本大约翻 100 倍。
可靠性的理论
上面这些技巧做法各异,目标却一致:提高复杂任务上的可靠性。它们主要靠两条路做到这一点:
- 把不可靠的操作分解成更小、更可靠的操作(例如筛选-推断提示)
- 用多个步骤或多个关系,让整个系统的可靠性高于任何单个部件(例如助产术提示)
概率图模型(probabilistic graphical model)
用可靠性较低的部件搭出可靠的系统,这一范式让人想起概率编程(probabilistic programming),那个领域的很多分析技术都能搬到这个领域来。在论文 Language Model Cascades 中,David Dohan 等人把上面几套技巧放进概率图模型的框架下解读。
思维链提示
原文此处有一张图,把思维链提示画成一条链式的概率图模型:每一步的中间输出作为节点,喂给下一步。
微调思维链提示 / 自学推理者
原文此处有一张图,对应的图模型还是那条推理链,特点是链上的模型经过微调、共享参数。
筛选-推断提示
原文此处有一张图,把交替出现的筛选节点与推断节点画成一张分层的概率图模型。
验证器
原文此处有一张图,画的是多条生成路径在末端汇入一个验证器节点、由它选出最终答案的图模型。
启示
把这些技巧表述成概率图模型,眼下对解决某个具体问题未必马上有用,但这套框架有助于挑选技巧、组合技巧,也有助于发现新技巧。
写在最后
对大型语言模型的研究非常活跃,演进很快。研究者一边改进模型,一边也在改进"怎么把模型用好"的认知。想体会这段发展有多快,可以看一点:我写这篇文章是在 2022 年 9 月,上文分享的所有论文都发表在最近 12 个月之内。
未来一定会有更好的模型、更好的技术发表出来。就算这里列的具体技巧日后被新的最佳实践取代,它们背后的一般原则,大概率仍会是专家级用户工具箱里的重要部分。
参考文献
(全文完)