论文:
《Finetuned Language Models Are Zero-Shot Learners》
。
大型语言模型,例如 GPT-3
,已经显示出在 few-shot learning
方面表现出色。然而,它们在 zero-shot learning
方面并不成功。例如,GPT-3
在阅读理解、问答、和自然语言推理等任务的 zero-shot
表现要比 few-shot
表现差得多。其中一个潜在原因是,在没有 few-shot
示例的情况下,模型很难在与预训练数据格式不相似的 prompts
上表现良好。
在本文中,我们探索了一种简单的方法来提高大型语言模型的 zero-shot
性能,从而扩大它们的受众范围。我们利用一种直觉,即自然语言处理任务可以通过自然语言指令来描述,例如, “这部电影评论的情感是积极的还是消极的?”,或者 “将 ‘Hello’ 翻译成文”。我们采用了一个包含 137B
参数的 pretrained
语言模型,并进行指令微调 instruction tuning
:在超过 60
个 NLP
数据集的混合样本上对模型进行微调,这些数据集通过自然语言指令来表达。我们将得到的模型称为 FLAN
,即 Finetuned Language Net
。
为了评估 FLAN
在未见过的任务上的 zero-shot
性能,我们根据任务类型将 NLP
数据集分组成 clusters
,并保留每个 cluster
用于评估,同时在其它所有 clusters
上对 FLAN
进行指令微调。例如,如 Figure 1
所示,为了评估 FLAN
在执行自然语言推理任务的能力,我们在其他一系列 NLP
任务上(如,常识推理、翻译、情感分析)上对模型进行指令微调。由于这个设置确保 FLAN
在指令微调中没有见过任何自然语言推理任务,我们随后评估其在 zero-shot
自然语言推理上的能力。
我们的评估结果显示,FLAN
显著提高了 base 137B-parameter model
的 zero-shot
性能。FLAN
的zero-shot
性能在我们评估的25
个数据集中有 20
个优于拥有 175B
参数的 GPT-3
的zero-shot
性能,甚至在 ANLI
、RTE
、BoolQ
、AI2-ARC
、OpenbookQA
和 StoryCloze
等任务上远远超过了 GPT-3
的 few-shot
表现。在消融研究中,我们发现在指令微调中增加 task clusters
的数量可以提高对 unseen
任务的性能,并且指令微调的好处只在足够大的模型规模下显现出来。
指令微调的效果并不总是好的,如果下游任务和语言建模预训练目标相同时,指令微调是无效的、甚至是降低性能的。
指令微调是一种简单的方法,如 Figure 2
所示,它结合了 pretrain–finetune
和 prompting
范式的吸引人的特点,通过使用 finetuning
的监督来改善语言模型对推理时文本交互的响应。我们的实证结果展示了语言模型通过纯粹的指令来执行任务的有希望的能力。用于加载用于 FLAN
的指令微调数据集的源代码可在 https://github.com/google-research/flan
公开获取。
相关工作:我们的工作涉及多个广泛的研究领域,包括 zero-shot learning
、prompting
、multi-task learning
以及用于NLP applications
的语言模型。我们在一个扩展的相关工作部分(附录 D
)中描述了这些广泛领域的先前工作,这里我们描述了两个范围较窄、与我们的工作关系最密切的子领域。
我们要求模型对指令作出响应的方式类似于 QA-based task
,其目的是通过将 NLP
任务视为上下文中的问答来统一这些任务。尽管这些方法与我们的方法非常相似,但它们主要关注的是multi-task learning
而不是 zero-shot learning
,并且正如 《Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing》
所指出的,它们通常不是基于 pretrained
语言模型中的现有知识的动机。
此外,从模型规模和任务范围两方面来看,我们的工作超过了 《Description based text classification with reinforcement learning》
和 《Meta-tuning language models to answer prompts better》
等最近的研究。
语言模型的成功导致了对模型遵循指令能力的初步研究。
最近, 《Natural Instructions: Benchmarking generalization to new tasks from natural language instructions》
用 few-shot
示例对具有 140M
参数的 BART
进行了指令微调,并在 unseen
任务上评估其 few-shot
能力,这与我们的 few-shot instruction tuning
结果类似。这一有希望的结果(以及 《Crossfit: A few-shot learning challenge for cross-task generalization in NLP》
的一个结果,虽然没有像我们一样强调指令),表明在一组任务上进行微调可以提高对 unseen
任务的 few-shot
性能,即使在较小的模型规模下也是如此。
T0
以与我们类似的设置对 T5
进行微调,发现 zero-shot learning
在具有 11B
参数的模型中可以得到改善。
在与我们模型规模类似的情况下,OpenAI
的 InstructGPT
模型通过微调和强化学习进行训练,以产生更受人类评分者青睐的输出(《Training language models to follow instructions with human feedback》
)。
指令微调的动机是提高语言模型对 NLP
指令的响应能力。其思想是通过使用 supervision
来教导语言模型执行通过指令来描述的任务,使语言模型学会遵循指令,即使是对于 unseen
任务也能做到如此。为了评估在 unseen
任务上的性能,我们将数据集按任务类型分成 clusters
,并保留每个 task cluster
进行评估,同时在其余所有 clusters
上进行指令微调。
任务和模板:由于从头创建一个包含多个任务的指令微调数据集需要耗费大量资源,我们将学术界社区中现有的数据集转化为指令格式。我们聚合了 62
个公开可用的文本数据集,这些数据集都可以在 TensorFlow Datasets
上找到,包括语言理解任务和语言生成任务,并将它们合并为一个混合体。 Figure 3
展示了这些数据集,每个数据集都被归类到 12
个 task clusters
中,同一 cluster
中的数据集属于相同的任务类型。每个数据集的描述、大小和示例可在附录 G
中找到。
对于每个数据集,我们手动编写了十个 unique
的模板,这些模板使用自然语言指令来描述该数据集的任务。尽管十个模板的大部分都描述了原始任务,为了增加多样性,对于每个数据集,我们还包括最多三个 "turned the task around"
的模板(例如,对于情感分类,我们包括了要求生成电影评论的模板)。然后,我们对 pretrained
语言模型在所有数据集的混合体上进行指令微调,每个数据集中的样本都按照该数据集的随机选择的指令模板进行格式化。 Figure 4
展示了一个自然语言推理数据集的多个指令模板。
Evaluation Splits
:我们对 FLAN
在指令微调中 unseen
任务的表现非常感兴趣,因此定义什么算作 unseen
任务是至关重要的。一些先前的工作通过不允许相同的数据集出现在训练中来定义 unseen
任务,但我们使用了一个更保守的定义,利用了 Figure 3
中的 task clusters
。在这项工作中,只有当在指令微调过程中没有看到 task cluster
中的数据集时,我们才将数据集 unseen
任务。例如,如果 entailment
任务,那么在指令微调中没有出现过任何 entailment
数据集,而我们对所有其他的 task clusters
进行了指令微调。因此,要评估 task clusters
上的 zero-shot FLAN
,我们进行了 task cluster
从而用于评估。
带 Options
的分类任务:给定任务的输出空间可以是几个类别(分类任务)或自由文本(生成式任务)。由于 FLAN
是一个 decoder-only
语言模型的指令微调版本,它自然会以自由文本的形式进行响应,因此在生成式任务中不需要进一步的修改。
对于分类任务,先前的工作(GPT-3
)使用了一种 rank classification
方法,例如,只考虑两个输出( "yes"
和" no"
),将概率较高的那个作为模型的预测结果。虽然这个过程在逻辑上是正确的,但它存在不完美之处,因为答案的概率分布可能在表达每个答案的方式上存在不希望的分布(例如,大量的替代方式说 "yes"
可能会降低分配给 "yes"
的概率)。因此,我们在分类任务的末尾添加了一个 options
后缀,其中我们将单词 "OPTIONS"
添加到分类任务的末尾,并附上该任务的输出类别列表。这样,模型在响应分类任务时就知道哪些选择是期望的。 Figure 1
中的 NLI
示例和常识示例显示了 options
的例子。
这不同于将
label
映射到target words
,这里是将label space
主动地添加到了输入中。这相当于让模型做选择题(而不是填空题)。
训练细节:
模型架构和预训练:在我们的实验中,我们使用了 LaMDA-PT
,一个包含 137B
参数的稠密的、从左到右的 decoder-only transformer language model
。该模型在一系列 web
文档(包括带有计算机代码的文档)、对话数据、以及维基百科上进行预训练,使用 SentencePiece library
将文本 tokenize
为 2.49T BPE tokens
,词表规模 32k
。预训练数据中约有 10%
为非英语数据。请注意,LaMDA-PT
只进行了语言模型的预训练(与针对对话来微调的 LaMDA
相比)。
指令微调过程:FLAN
是 LaMDA-PT
的指令微调版本。我们的指令微调流程将所有数据集混合在一起,并从每个数据集中随机抽样。为了平衡不同数据集的大小,我们将每个数据集的训练样本数限制为 30k
,并遵从了 examples-proportional mixing scheme
(T5
),最大 mixing rate
为 3k
。我们使用具有 3e-5
学习率的 Adafactor
优化器对所有模型进行了 30k
个 gradient steps
的微调, batch size = 8192 tokens
。微调中使用的输入序列长度和目标序列长度分别为 1024
和 256
。我们使用 packing
(T5
)将多个训练样本组合成单个序列,使用特殊的 EOS token
将 inputs
与 targets
分开。这个指令微调过程在具有 128 cores
的 TPUv3
上大约需要 60
小时。对于所有的评估,我们报告训练 30k steps
的 final checkpoint
的结果。
因为是
zero-shot
,所以这里没有通过验证集来选择checkpoint
。
我们在自然语言推理、阅读理解、闭卷问答、翻译、常识推理、共指消解、以及 struct-to-text
等任务上评估了 FLAN
。如前所述,我们通过将数据集分组为 task clusters
,并 hold out
每个 cluster
以供评估,同时在其他所有 task clusters
上进行指令微调(即每个 evaluation task cluster
使用不同的 checkpoint
)。对于每个数据集,我们评估所有模板的性能均值,这代表了在典型自然语言指令下的期望性能。由于有时可以使用验证集进行 manual prompt engineering
(GPT-3
),对于每个数据集,我们还使用在验证集上性能最佳的模板来获得测试集性能。
为了进行比较,我们报告了 LaMDA-PT
使用与 GPT-3
相同的 prompts
的 zero-shot
和 few-shot
结果(因为 LaMDA-PT
在没有指令微调的情况下不适用于自然指令)。该 baseline
提供了指令微调对性能提升的直接消融研究。指令微调显著提高了 LaMDA-PT
在大多数数据集上的性能。
我们还展示了 GPT-3 175B
和 GLaM 64B/64E
在的 zero
性能,这些结果是根据各自的论文报告得出的。
根据验证集上的最佳模板,zero-shot FLAN
在 25
个数据集中有 20
个超过了 zero-shot GPT-3
,甚至在 10
个数据集上超过了GPT-3
的 few-shot
性能。
根据验证集上的最佳模板,zero-shot FLAN
在 19
个可用数据集中有 13
个超过了 zero-shot GLaM
,而在 19
个数据集中的 11
个超过了 one-shot GLaM
。
总体而言,我们观察到指令微调对于自然语言指令化的任务(如 NLI
、QA
、翻译、struct-to-text
等)非常有效,而对于直接以语言建模形式构建的任务,指令微调的效果较小,因为指令在这些任务中会很大程度上重复(例如,常识推理任务和共指消解任务以填写不完整的句子或段落的形式进行)。Figure 5
是自然语言推理、阅读理解、闭卷问答、以及翻译任务的结果摘要。
自然语言推理(NLI
):在五个 NLI
数据集上, FLAN
的性能远远超过所有基准模型。正如 GPT-3
原始论文所指出的,GPT-3
在NLI
上表现不佳的原因之一可能是 NLI
的样本在无监督训练集中不太可能以自然方式出现,因此以作为句子续写的方式表达起来会很别扭。对于 FLAN
,我们将 NLI
表述为更自然的问题形式:"Does <premise> mean that <hypothesis>?"
从而获得了更高的性能。
阅读理解:在阅读理解任务中,FLAN
在 MultiRC
和 OBQA
上优于基准模型。在BoolQ
上,FLAN
大幅优于 GPT-3
,而 LaMDA-PT
在 BoolQ
上已经取得了很高的性能。
闭卷问答:对于闭卷问答任务,FLAN
在所有四个数据集上优于 GPT-3
。与 GLaM
相比,FLAN
在ARC-e
和 ARC-c
上表现更好,在 NQ
和 TQA
上略低一些。
翻译:类似于 GPT-3
,LaMDA-PT
的训练数据约有 90%
是英语,并包含一些其他语言的文本,这些文本并不是专门用来训练机器翻译的。我们还在 GPT-3
论文中评估的三个数据集上评估 FLAN
的机器翻译性能:WMT'14
的 French–English
数据集,以及 WMT'16
的 German-English
数据集和 Romanian–English
数据集。
与 GPT-3
相比,FLAN
在所有六个评估上优于 zero-shot GPT-3
,但在大多数情况下不如 few-shot GPT-3
。类似于 GPT-3
,FLAN
在翻译成英语方面表现出色,并与监督翻译基准模型相媲美。然而,从英语翻译成其他语言的结果相对较弱,这是可以预料的,因为 FLAN
使用了 English sentencepiece tokenizer
,并且大部分预训练数据是英语。
其它任务:尽管我们看到了上述任务类别的强大结果,但指令微调的一个局限性是它并未改善许多语言建模任务的性能(例如,以补全句子的形式构建的常识推理任务或共指消解任务)。对于七个常识推理和共指消解任务(详见附录中的 Table 2
),FLAN
仅在其中三个任务上优于 LaMDA-PT
。这个负面结果表明,当下游任务与原始的语言建模预训练目标相同时(即在指令很大程度上是冗余的情况下),指令微调是无用的。
最后,我们在附录中的 Table 1
和 Table 2
中报告了情感分析、转述检测(paraphrase detection
)、以及 struct-to-text
的结果,以及 GPT-3
结果不可用的其他数据集。通常情况下,zero-shot FLAN
优于 zero-shot LaMDA-PT
,并且与 few-shot LaMDA-PT
相当或更好。
Instruction tuning clusters
数量:在第一个消融实验中,我们研究了指令微调中使用的任务数量和 task clusters
数量对性能的影响。在这个设置中,我们将 NLI
、闭卷问答、以及常识推理作为 evaluation clusters
,并使用剩下的七个 task clusters
进行指令微调。我们展示了使用一个到七个 instruction tuning clusters
的结果,其中 task clusters
按照每个 cluster
中任务数量递减的顺序添加。Figure 6
展示了这些结果。
正如预期的那样,当我们添加更多的 task clusters
和任务到指令微调中时,三个 held-out clusters
的平均性能都有所提高(除了情感分析 cluster
),从而证实了我们提出的指令微调方法在新任务的 zero-shot
性能上的优势。
此外,有趣的是,在我们测试的七个 task clusters
中,性能似乎没有达到饱和状态,这意味着通过添加更多 task clusters
到指令微调中,性能可能会进一步提高。
值得注意的是,这个消融实验不能让我们得出关于哪个 instruction tuning cluster
对每个 evaluation cluster
贡献最大的结论,尽管我们看到 sentiment analysis cluster
的附加价值很小。
Scaling Laws
:正如 GPT-3
原始论文所展示的,对于更大的模型,语言模型的 zero-shot
和 few-shot
能力显著提高,我们接下来探究指令微调的好处如何受到模型规模的影响。使用前面消融实验中的相同 cluster split
,我们评估了参数为 422M, 2B, 8B, 68B, 137B
的模型上指导微调的效果。在 Figure 7
中展示了这些结果。
我们可以看到,在约 100B
参数的两个模型中,指导微调显著提高了 held-out tasks
的性能,这与我们论文中的先前结果一致。
然而,对于 8B
及更小规模的模型,在 held-out tasks
上的表现却令人深思:指导微调实际上对 held-out tasks
的性能产生了负面影响。对于这一结果,一个可能的解释是对于小规模模型来说,在指令微调过程中学习的 40
个任务填满了整个模型容量,导致这些模型在新任务上的表现较差。根据这一潜在解释,对于更大规模的模型,指令微调填满了部分模型容量,同时教会这些模型如何遵循指令,使它们能够利用剩余容量来泛化到新任务上。
指令的作用:在最后的消融研究中,我们探讨了指令在微调过程中的作用,因为一种可能性是性能提升完全来自多任务微调,模型即使没有指令也可以表现得很好。因此,我们考虑了两种没有指令的微调设置。
在 no template
设置中,模型只接收输入和输出(例如,对于翻译任务,输入是 "The dog runs."
,输出是 "Le chien court."
)。
在 dataset name
设置中,每个输入都以任务和数据集的名称开头(例如,对于翻译成法语的任务,输入是 "[Translation: WMT’14 to French] The dog runs."
)。
我们将这两种消融配置与 FLAN
的微调过程进行比较,其中 FLAN
使用了自然语言指令(例如,"Please translate this sentence to French: 'The dog runs.'"
)。我们针对 Figure 5
中的四个 held-out clusters
进行评估。
对于 no template
设置,我们在zero-shot
推理过程中仍使用了 FLAN
的指令。因为如果我们不使用模板,模型将不知道执行哪个任务。
对于仅使用数据集名称进行微调的模型,我们在zero-shot
推理过程中分别报告了使用 FLAN
指令、以及使用数据集名称的 zero-shot
性能。
Figure 8
显示了结果:这两种消融配置的性能都显著低于 FLAN
,这表明在处理 unseen
任务的 zero-shot
性能中,使用指令是至关重要的。
带 few-shot
示例的指令:到目前为止,我们专注于在 zero-shot setting
中进行指令微调。在这里,我们研究了在推理时有 few-shot
示例可用时如何使用指令微调。
few-shot setting
的格式基于 zero-shot
格式。对于某个输入 zero-shot
指令。那么,在给定 few-shot
示例 few-shot setting
的指令格式为 token
。在训练和推理时,示例从训练集中随机选择,并且示例的数量限制为 16
个,并且总序列长度小于 960 tokens
。我们的实验使用与 ”主要结果“ 章节相同的任务划分和评估过程,因此仅在推理时使用 unseen
任务的 few-shot
示例。
注意:训练时并没有使用
few-shot
,而是zero-shot
。
如 Figure 9
所示,与zero-shot FLAN
相比,few-shot
示例改善了所有 task clusters
的性能。示例对于输出空间较大/复杂的任务特别有效,例如 struct-to-text
、翻译、以及闭卷问答,这可能是因为示例有助于模型更好地理解输出格式。此外,对于所有task clusters
,few-shot FLAN
的标准差较低,表明对 prompt engineering
的敏感性降低了。
指令微调促进 prompt tuning
:根据我们之前观察到的指令微调改善了模型对指令的响应能力的情况,我们可以得出这样的结论:如果 FLAN
更顺从地执行 NLP
任务,那么当使用 soft prompts
(放在输入之前的连续变量,这些变量通过 prompt tuning
进行优化)进行推理时,它也应该表现出更好的性能。作为进一步的分析,我们根据前面的 cluster splits
,为每个 SuperGLUE
任务训练continuous prompts
,以便在对任务 prompt-tuning
时,指令微调过程中没有看到与 cluster
的任务。我们的 prompt setting
设置遵循 《The power of scale for parameter-efficient prompt tuning》
的过程,只是我们使用了长度为 10
的prompt
,权重衰减为 1e-4
,并且在注意力分数上没有使用 dropout
;我们在初步实验中发现,这些改变提高了 LaMDA-PT
的性能。
Figure 10
显示了这些 prompt tuning
实验的结果,包括在使用完全监督训练集的情况下、以及在仅有 32
个训练示例的低资源环境中的情况。我们可以看到:
在所有情景下,FLAN
比 LaMDA-PT
更适合进行 prompt tuning
。
在许多情况下,特别是在低资源设置中,对 FLAN
进行 prompt tuning
可以比对 LaMDA-PT
进行 prompt tuning
获得甚至 10%
以上的改进。
这个结果以另一种方式展示了指令微调如何导致更适合执行 NLP
任务的 checkpoint
。
大规模语言模型的多样能力引起了对专家模型(每个任务一个模型)和通用模型(一个模型用于多个任务)之间权衡的关注,这对我们的研究具有潜在的影响。尽管人们可能认为 labeled
数据在改进专家模型方面具有最自然的作用,但指令微调展示了如何利用 labeled
数据帮助大型语言模型执行许多 unseen
任务。换句话说,指令微调对跨任务泛化的积极影响表明, task-specific training
是通用语言建模的补充,并激发了对通用模型进一步研究的动机。
我们研究的局限性:
任务分配到 clusters
中存在一定的主观性(尽管我们尽量使用文献中公认的分类),而且我们只探索了通常只有一句话的相对简短的指令的使用(与给予众包工作者的详细指令相比)。
对于我们的评估来说,个别示例可能出现在模型的预训练数据中(预训练数据包括 Web
文档),但在事后分析中(附录 C
),我们并未发现数据重叠显著影响结果的任何证据。
最后,FLAN 137B
的规模使其成本较高。
指令微调的未来工作可以包括收集/生成更多的 task clusters
进行微调、进行跨语言实验、使用 FLAN
生成用于训练下游分类器的数据,并使用微调改善模型在 bias
和公平性方面的行为(《Process for adapting language models to society (palms) with values-targeted datasets》
。
论文
《Multitask Prompted Training Enables Zero-Shot Task Generalization》
最近的工作表明,大型语言模型表现出对新任务进行合理的 zero-shot generalization
的能力(GPT-3
、《What changes can large scale language models bring? intensive study on hyperclova: Billions-scale korean generative pretrained transformers》
)。尽管只是在 language modeling objectives
上进行了训练,这些模型在它们没有被显式地训练过的新任务上可以表现得相对较好,例如回答一段话的问题或进行摘要。
一个有影响力的假设是,大型语言模型对新任务的泛化是多任务学习的隐式过程的结果(GPT-2
)。作为学习预测 next word
的副产品,语言模型被迫从其预训练语料库中包含的隐式任务的 mixture
中学习。例如,通过对网络论坛的通用文本进行训练,一个模型可能隐式地学习问答任务的格式和结构。这使得大型语言模型有能力泛化到以自然语言的 prompts
所呈现的 held-out tasks
,超越了先前关于泛化到 held-out datasets
的多任务研究(《Unifiedqa: Crossing format boundaries with a single QA system》
、《Crossfit: A few-shot learning challenge for cross-task generalization in nlp》
)。然而,这种能力需要一个足够大的模型,并且对其 prompts
的措辞很敏感(《True few-shot learning with language models》
、《Calibrate before use: Improving few-shot performance of language models》
、《Prompt programming for large language models: Beyond the few-shot paradigm》
)。
此外,这种多任务学习到底有多隐式,也是一个悬而未决的问题。考虑到近期语言模型预训练语料库的规模,我们有理由期待一些常见的自然语言处理任务会以显式的形式出现在其预训练语料库中,从而直接在这些任务上训练模型。例如,有许多网站只是包含了一些关于普通问题和答案的列表,这正是闭卷问答任务的监督训练数据(《How much knowledge can you pack into the parameters of a language model?》
)。我们假设,预训练中的这种多任务监督(multitask supervision
)在 zero-shot generalization
中发挥了很大的作用。
在本文中,我们专注于以有监督的和大规模多任务的方式显式地训练语言模型。我们的方法是使用由自然语言的 prompts
中指定的一组不同任务组成的 training mixture
。我们的目标是:诱导模型在不需要大规模的情况下更好地泛化到 held-out tasks
,以及对 prompts
的措辞选择更加鲁棒。为了将大量的自然语言任务转换成 prompted
形式,我们为结构化的数据集使用了一种简单的模板语言。我们开发了一个接口从而从公共贡献者那里收集 prompt
,促进了 large multitask mixture with multiple prompts per dataset
的收集(《Promptsource: An integrated development environment and repository for natural language prompts》
)。然后,我们在任务的一个子集上训练 T5 encoder-decoder model
的变体(T5
、《The power of scale for parameter-efficient prompttuning》
),然后在未被模型训练的任务和 prompts
上评估模型。
我们的实验研究了两个问题:
首先,multitask prompted training
是否能提高对 held-out tasks
的泛化性?
第二,在更广泛的prompts
上进行训练是否能提高对 prompt
措辞的鲁棒性?
对于第一个问题,我们发现多任务训练能够实现 zero-shot task generalization
,我们的模型在 11
个 held-out datasets
中的 9
个数据集上与 GPT-3
的性能相匹配或超过,尽管它比 GPT-3
小 16
倍。我们还表明,在 BIG-bench
基准的 14
个任务中,该模型在 13
个任务上比大型 baseline
语言模型有提高。
对于第二个问题,我们发现,在每个数据集上训练更多的 prompts
,可以持续地提高中位数,并减少在 held-out tasks
上的性能方差。对来自更多数据集的 prompts
进行训练也普遍提高了中位数,但并没有一致地降低方差。
T0
也是基于指令微调的,这和FLAN
非常类似。
相关工作:
在这项工作中,我们将语言模型预训练中的隐式多任务学习与显式多任务学习(《Multitask learning》
)区分开来,其中,显式多任务学习是将多个任务混合到一个监督训练过程中的技术。用多任务学习训练的模型早已被证明在 NLP
中具有更好的性能(《A unified architecture for natural language processing: deepneural networks with multitask learning》
)。由于不同的任务有不同的输出,应用多任务学习需要一个共享的格式,各种格式已经被使用(《A joint many-task model: Growing a neural network for multiple NLP tasks》
、《The natural language decathlon: Multitask learning as question answering》
)。一些多任务的工作还探索了用大型预训练模型对新的数据集进行 few-shot generalization
和 zero-shot generalization
(例如,《Exploring and predicting transferability across NLP tasks》
、《Crossfit: A few-shot learning challenge for cross-task generalization in nlp》
)。
自然语言 prompting
是将 NLP
任务以自然语言的格式重新格式化到对应于 natural language input
的方法。text-to-text pretrained models
的发展(如 T5
)使得 prompts
成为多任务学习的一个特别有用的方法。例如:
《Unifiedqa: Crossing format boundaries with a single QA system》
将20
个问答数据集改编为 question: ... (A)... (B)... (C)... context: ...
的单一prompt
。
而后来的工作,如 《Adapting language models for zero-shot learning by meta-tuning on dataset and prompt collections》
和 《Entailment as few-shot learner》
将一系列数据集分别转换为单个 boolean QA prompt
、或单个NLI prompt
。
虽然有效,但这些 single-prompt
方法通常不能泛化到新的 prompts
或新的任务,其中这些新的 prompts
或新的任务无法在 single-prompt
的固定的格式中表达。
更加通用的是:
PET
以及 GPT-3
将使用 prompts
作为所有 NLP
任务的通用方法加以推广。
《Natural instructions: Benchmarking generalization to new tasks from natural language instructions》
将这种方法进一步扩展到多任务设置中,对 61
个狭义定义的任务(如 question generation
、incorrect answer generation
)的 prompts
进行训练,这些任务改编自 9
个数据集的众包指令;而我们对 62
个数据集和 NLP
文献中传统定义的 12
个任务进行训练并衡量泛化性。此外,他们的 prompts
除了指令之外还包括 labeled examples
,而我们则专注于 zero-shot generalization
。
最后,FLAN
同时进行的工作与我们有类似的研究问题,尽管我们在几个实质性的方面有所不同,例如,prompt
多样性、模型规模、held-out-task scheme
。我们将详细讨论我们的差异。
最后,在解释 prompts
的成功时,主要的假设是:模型学会了将 prompts
理解为 task instructions
,这有助于它们泛化到 held-out tasks
。然而,这种成功在多大程度上取决于 held-out tasks
的语义意义已经受到挑战(《Do prompt-based models really understand the meaning of their prompts?》
、《Cutting down on prompts and parameters: Simple few-shot learning with language models》
)。因此,在这项工作中,我们对 prompts
为什么支持泛化仍然保持未知( agnostic
)。我们只宣称,prompts
作为多任务训练的自然格式,从经验上支持泛化到 held-out tasks
。
我们首先假设 NLP
数据集被划分为任务。我们用 "任务" 一词来指代由一组特定数据集测试的通用 NLP
能力。为了评估对新任务的 zero-shot generalization
,我们在任务的一个子集上进行训练,并在一组 held-out
任务上进行评估。
不幸的是,NLP
任务的分类是模糊的,尤其是当人们试图分离出一种独特的 skill
时。例如,许多数据集评估常识性知识,一些多任务工作(如 GPT-3
、FLAN
)将常识性知识定义为一个独立的任务。然而,常识数据集差别很大,从 innate knowledge
和小学科学到 DIY
指令、美国文化规范、以及研究生水平的定理(详细讨论见附录 D.1
)。
注意到按任务分组是一种不完美的启发式方法,我们在组织我们的任务分类学时,偏向于根据任务格式,而不是根据文献中的惯例所要求的技能。我们从这些论文中收集所有的数据集,并排除那些非英语的数据集(这也排除了编程语言、以及结构化的注释,如 parse trees
)、或者如果它们需要特殊的领域知识(例如,生物医学)。这就产生了 12
个任务和 62
个数据集,这些数据集在我们的 training mixture
和 evaluation mixture
中都有 publicly contributed prompts
(Figure 2
),截至目前。所有的实验都使用 Hugging Face datasets library
中的数据集。
为了测试 zero-shot generalization
,我们保留了四个任务的所有组成数据集:自然语言推理(natural language inference: NLI
) 、共指解析(coreference resolution
)、句子补全(sentence completion
)、词义消岐(word sense disambiguation
)。
我们选择自然语言推理作为 held-out task
,因为人类也会将自然语言推理作为 held-out task
从而进行 zero-shot generalize
: 大多数人从来没有被明确地训练从而对一个 premise sentence
是否蕴含或违背一个 hypothesis sentence
进行分类,但他们发现不经过训练就能直观地执行这项任务(《Anlizing the adversarial natural language inference dataset》
)。出于同样的原因,我们也保留共指解析和词义消岐。我们进一步 hold out
句子补全任务,因为它可能与 NLI
过于相似(附录 D.2
详细讨论了这一点)。
此外,我们不在 GPT-3
用于评估的任何数据集上训练我们的 main model
,这样我们的主要结果将是一个公平的 zero-shot
比较。我们还验证了这些任务的数据没有通过预训练语料库而被泄露(附录 E
)。
最后,我们对 BIG-bench
的数据集的一个子集进行了进一步的评估。BIG-bench
是最近的一个社区驱动的基准,用于创建一个多样化的困难任务集合来测试大型语言模型的能力。BIG-bench
的子集包括一个 language-oriented
的任务的选择,BIGbench
的维护者已经为其准备了初步结果,这些任务构成了 T5 tokenizer
的词汇范围(即只包含英语文本,没有表情符号或其他特殊字符)。所有来自 BIG-bench
的任务都是新任务,并且在我们的训练中被 held out
。
所有的数据集都是以自然语言提示的形式交给我们的模型,以实现 zero-shot experimentation
。为了方便编写大量的 prompts
信息,我们开发了一种 templating language
和一个应用程序,使其能够轻松地将不同的数据集转换为 prompts
。
我们将一个 prompt
定义为由一个 input template
、一个 target template
、以及一系列关联的 target template
组成。模板是一个函数,该函数针对 input sequences
和 target sequences
将 data example
映射为自然语言。实际上,模板允许用户将带任意文本与数据字段、元数据、以及其他用于渲染和格式化原始字段的 code
相混合。例如,在一个 NLI
数据集的情况下,example
将包括 Premise
、Hypothesis
、Label
等字段。一个 input template
是 If {Premise} is true, is it also true that {Hypothesis}?
,而一个 target template
可以定义为 label
选项 {Choices[label]}
。这里 Choices
是 prompt-specific metadata
,由选项 yes, maybe, no
组成,对应的标签是 entailment (0), neutral (1), contradiction (2)
。其他元数据记录了额外的属性,如评价指标。如 Figure 3
所示,每个 data example
都被具体化为许多不同的 prompt templates
。
为了开发 prompts
,我们建立了一个 interface
,用于在数据集上交互式地编写 prompts
。我们在学术界公开呼吁用户贡献 prompts
。隶属于 8
个国家 24
个机构的 36
位贡献者参与了进来。由于我们的目标是训练一个对 prompt format
具有鲁棒性的模型,并且,因为什么使得 prompt
有效的问题仍未悬而未决,我们鼓励贡献者在他们的 prompt
风格上保持开放,并创造一组多样化的 prompts
。主要的标注准则是,prompts
需要符合语法,并能被一个没有任务经验的流利的英语使用者所理解。此外,需要显式的计数或数字索引的 prompts
被删除,从而支持自然语言的变体。例如,不是预测从段落中提取答案的 span
的索引,而是期待模型复制 span
的文本。有了这些最低限度的限制,我们鼓励 prompt
作者使用正式的和创造性的 prompts
以及各种关于数据的排序。
大多数 prompts
直接对应于原始任务的一个版本,我们也允许这种 prompts
:改变原始任务的顺序(例如,从摘要中生成一个文档)。这种 non-original-task prompts
包括在我们的 training mixtures
中,以提高多样性,但它们没有在评估中报告,因为它们偏离了原始数据集报告的指标和基线。
即,根据
output
来预测input
。
prompting language
和工具的细节在附录 C
和 《Promptsource: An integrated development environment and repository for natural language prompts》
中给出,而 prompts
本身在附录G
中给出。我们收集了英语数据集的 prompts
,排除了包含潜在有害内容或非自然语言(如编程语言)的数据集。我们把这个集合称为 Public Pool of Prompts: P3
。截至目前,P3
包含 177
个数据集的 2073
个 prompts
(平均每个数据集有 11.7 prompts
)。实验中使用的 prompts
都来自P3
(除了 BIG-bench
,它的 prompts
由其维护者提供)。
模型:我们在自然语言 prompted
数据集的 multi-task training mixture
上对预训练模型进行了微调。我们的模型使用一个 encoder-decoder
架构:输入文本被馈入编码器,target text
由解码器产生。
我们训练的所有模型都是基于 T5
。由于 T5
的预训练目标是生成 tokens
,而且是只生成那些已从输入文本中删除的 tokens
,它与 prompted datasets
的自然文本生成格式不同。因此,我们使用 《The power of scale for parameter-efficient prompt tuning》
的 LM-adapted T5 model
(简称 T5+LM
),该模型是在标准的 language modeling objective
上对 C4
的 100B
额外 tokens
上进行训练后产生的。
训练:我们的主力模型,T0
,是 Table 5
中详述的 multitask mixture
上训练的。此外,T0+
是相同的模型,具有相同的超参数,只是在加入了 GPT-3
的评估数据集的 mixture
上训练。最后,T0++
进一步将 SuperGLUE
加入到 training mixture
中(除了 RTE
和 CB
),这使得 NLI
和 BIG-bench
任务成为唯一被 held-out
的任务。
上述的 T0
变体都是由 11B
参数版本的 T5+LM
初始化的。为了研究 scaling
的效果,并帮助资源较少的研究人员,我们还训练了T0(3B)
,它与 T0
具有相同的 training mixture
,但是从 3B
参数版本的 T5+LM
初始化的(结果报告在附录 F
)。
我们通过选择在训练数据集的 validation splits
上产生最高分的 checkpoint
来进行 checkpoint selection
。这仍然满足了 true zero-shot
(《True few-shot learning with language models》
)的设置,因为我们不使用任何 held-out tasks
中的任何样本来选择最佳 checkpoint
。
我们通过合并和混洗所有训练数据集的所有样本来组装我们的 multitask training mixture
。这相当于从每个数据集中按照数据集中的样本数量的按比例采样。然而,我们每个训练数据集中的样本数量相差两个数量级。因此,我们遵循 T5
使用的策略,将任何超过 500k
个样本的数据集视为有 500k/num_templates
的样本,从而用于采样,其中 num_templates
是为该数据集创建的模板数量。
考虑到每个数据集被应用到
num_templates
个模版上,因此数据集总共生成了个样本, 为数据集的原始大小。
我们将 input
序列和 target
序列分别截断为1024 tokens
和 256 tokens
。遵循 T5
的做法,我们使用 packing
的方式将多个训练样本合并成一个序列,以达到最大序列长度。我们使用 1024
个序列的 batch size
(对应于每个 batch
包含 tokens
)和 Adafactor
优化器。遵循微调 T5
的标准做法,我们使用 1e-3
的学习率和 0.1
的 dropout rate
。
评估:我们在 11
个数据集上评估了4
个传统 NLP
任务的 zero-shot generalization
:自然语言推理、共指解析、词义消岐、句子补全;以及 BIG-bench
的 14
个新任务。除非另有说明,否则我们报告的是 validation splits
的性能。所有报告的数据集都使用准确率作为其衡量指标。
对于涉及从几个选项中选择正确完成的任务(如多个选项的问答题),我们遵循 GPT-3
的做法,使用 rank classification
来评估我们的模型:我们计算 fine-tuned model
下每个目标选项的对数似然,并选择具有最高对数似然的选项作为预测。为了简单起见,我们不对目标选项的对数似然进行长度归一化处理。
我们不通过比较不同的 prompts
在 validation splits
上的表现来进行 prompt selection
;《True few-shot learning with language models》
强调了这种策略如何从 validation splits
中泄露信息,这使得评价不是 "true" zero-shot
。对于一个给定的数据集,我们报告了该数据集所有 prompts
的性能中值、以及它们的四分位数范围( Q3 -Q1
),从而衡量模型对 prompts
措辞的鲁棒性。
注意,
checkpoint selection
是在训练数据集的validation splits
上进行的,它不同于这里的validation splits
。
泛化到 heldout tasks
:我们的第一个研究问题是,multitask prompted training
是否能提高对 heldout tasks
的泛化能力。 在 Figure 4
,我们将 T0
与我们的 T5+LM
基线在四个 heldout tasks
上进行比较。我们的方法在所有的数据集上都比我们的基线有明显的提高,这表明 multitask prompted training
比只用相同的模型和 prompts
的语言建模训练有好处。
接下来,我们将 T0
与截至目前可用的最大的语言模型的 zero-shot
性能进行比较,即各种 GPT-3
模型,最高可达 175B
参数。请注意,GPT-3
论文中报告的是单个 prompt
的性能,而我们报告的是 P3
中所有 prompts
的性能的中位数和四分位数范围。我们发现,T0
在 11
个 held-out datasets
中的 9
个上与所有 GPT-3
模型的性能媲美或超过。值得注意的是,T0
和 GPT-3
都没有在 NLI
任务上训练,但是 T0
在所有的 NLI
数据集上的表现都超过了 GPT-3
,而我们的 T5+LM
基线没有超越 GPT-3
。对于其他 held-out tasks
的大多数数据集来说,情况也是如此。两个例外是 Winogrande
和 HellaSwag
数据集,我们在后续讨论。
为了在更多的 held-out tasks
上评估我们的模型,我们在 BIG-bench
的一个子集上评估了 T0, T0+, T0++
的 zero-shot
。BIG-bench
的任务涵盖了我们的训练任务中没有包括的各种新技能,例如推断 objects
序列的顺序、解决逻辑网格谜题,以及将真实的陈述与常见的错误概念区分开来。BIG-bench
的维护者为每个数据集提供了一个 prompt
,我们用它将我们的模型与一系列由谷歌训练并由 BIG-bench
维护者评估的初步诊断基线模型进行比较。这些模型是在一个标准的 language modeling objective
上训练的 decoder-only Transformer
语言模型,模型大小不一。我们发现,除了 StrategyQA
之外,至少有一个 T0
变体在所有任务上的表现超过了所有的基线模型(Figure 5
)。在大多数情况下,我们模型的性能随着训练数据集数量的增加而提高(即T0++
优于 T0+
、T0+
优于T0
)。
prompt
鲁棒性:我们的第二个研究问题是,在更广泛的 prompts
上进行训练是否能提高对 prompts
措辞的鲁棒性。我们对每个数据集的平均 prompts
数量(
每个数据集更多 prompts
的效果:在这个分析中,我们固定 T0
与具有不同
T0
是在一些没有映射到数据集原始任务的 prompts
上训练的,例如 "given an answer, generate a plausible question"
。包括这些 prompts
的结果是 8.03
(这与我们的主力 T0
模型相对应)。我们将 T0
与 original-tasks prompts
)、original-tasks prompts
)和 prompted training
的 T5+LM
)的模型进行比较。我们用相同的超参数和相同的步骤数来训练所有模型。
Figure 6
显示:
即使每个数据集只有一个 prompt
, held-out tasks
性能也能比 non-prompted baseline
有很大的改善,尽管 spread
(Q1
和 Q3
之间的四分位数范围)并没有一致地改善。
同时,进一步将 1
增加到 5.7
,确实在中位数(8/11
个数据集上增加)和 spread
( 7/11
个数据集上减少)方面都有额外的改善。这加强了我们的假设,即在每个数据集上训练更多的 prompts
会导致更好的和更鲁棒的泛化到 held-out tasks
。
最后,我们发现 T0
包含了所有的 prompts
(包括那些不对应于数据集原始任务的 prompts
),进一步改善了中位数(9/11
个数据集上增加)和 spread
( 8/11
个数据集上减少),表明对 non-original-task prompts
的训练也是有益的。
来自更多数据集的 Prompts
的效果:这里我们固定 prompts
,并将 39
增加到 49
或 55
(分别对应 T0, T0+, T0++
)。Figure 7
显示:
随着 39
增加到49
,所有 5
个被 held-out datasets
的中位性能都在增加。然而,5
个数据集中只有 1
个数据集的 spread
有所减少。
对于一些数据集(如 ANLI
),这是一个伪命题,因为一些 prompts
总是表现得很差,所以当其他 prompts
改善时,spread
被拉大了。然而,对于其他的数据集(如 CB
),spread
确实随着 T0+
而减少。
当 49
增加到 55
时,所有数据集的中位数性能再次增加,但spread
只对 5
个数据集中的 2
个减少了。虽然还需要进一步调查,但看来增加 prompts
的措辞更加鲁棒。
比较 T0
和 GPT-3
的鲁棒性:由于 GPT-3
只报告了每个数据集的一个 prompt
,没有标准差,我们通过 OpenAI
的 API
在 RTE
上评估 GPT-3
,使用我们评估 T0
的相同的 10
个 prompts
,从而估计 GPT-3
对不同措辞的 prompts
的鲁棒性。其中一个模板与 GPT-3
报告的 prompts
相同,其准确率为 58.8%
,低于 GPT-3
报告的 63.5%
。然而,所有其他 9
个 prompts
都产生了大致随机猜测的性能,准确率中值为 52.96%
,四分位数范围为 1.28%
。这些结果表明,相比 GPT-3
,T0
可能对 prompt formulation
更加鲁棒。
这是可以理解的,因为
T0
被微调从而更适合这些prompts
。
与我们的工作同时, 《Finetuned language models are zero-shot learners》
提出了 FLAN
,它采用相同的方法:通过 multitask prompted training
来实现 zero-shot generalization
。利用与我们类似的混合数据集,他们训练了多个 decoder-only
的语言模型,每个模型都有一个 held-out task
(比方说,我们专注于用多个 held-out tasks
训练一个模型,以评估该模型对不同任务的泛化能力)。与 FLAN
相比:
T0
在 CB
和 RTE
上的 zero-shot
性能更好、在 Story Cloze
和 COPA
上类似、而在 Winogrande
和 ANLI
上更糟。
T0++
在 CB, RTE, COPA
上的表现优于 FLAN
,在 Winogrande, ANLI
上的表现与 FLAN
相当。
值得注意的是,尽管 T0
和 T0++
比 FLAN
小 10
倍以上(11B vs. 137B
的参数),但还是达到了这个性能。
T0
和 FLAN
在Winogrande, HellaSwag
上的表现都不如 GPT-3
,对此,FLAN
猜想,对于像共指消解这样可以被格式化为补全一个不完整的句子的任务,在 prompts
中添加任务指令 "基本上是多余的"。根据这个猜想,我们按照 FLAN
和 GPT-3
的做法,对这两个数据集进行了不带指令的重新评估,发现它在 HellaSwag
上的表现从中位数 33.65%
提高到 57.93%
,与 FLAN
的表现相匹配。然而,对于 Winogrande
,使用 FLAN
的 prompts
而不带指令,并没有带来实质性的变化(准确率为 62.15%
)。
令人惊讶的是, FLAN
用一个与 T0
(11B
参数)规模相当的模型( 8B
参数)进行消融,发现在 multitask prompted training
后,held-out tasks
的性能会下降,而我们发现 multitask prompted training
至少可以提高小到 3B
参数的模型的性能( Figure 8
)。我们确定了模型之间的两个关键差异,可以解释这种不一致:
首先,我们使用了一个 encoder-decoder
模型,该模型在被训练成标准语言模型之前,用不同的目标(masked language modeling
)进行了预训练,最后在 multitask mixture
上进行了微调。我们注意到,masked language modeling
已多次被证明是一种明显更有效的预训练策略(T5
、《Cloze-driven pretraining of self-attention networks》
、BERT
)。
其次,我们的 prompts
在长度和创造性方面更有质量上的多样性。例如,考虑我们对 Quora Question Pairs: QQP
的一个 prompt
(转述识别): I’m an administrator on the website Quora. There are two posts, one that asks "question1" and another that asks "question2". I can merge questions if they are asking the same thing. Can I merge these two questions?
。我们假设,这种多样性可能会产生具体的影响。例如,它可以解释为什么 FLAN
提出的消融结果中,增加 prompts
的数量对性能的影响可以忽略不计,而我们在增加更多的 prompts
时却观察到了改进。我们把对这些差异的影响的全面调查留给未来的工作。
论文:
《Prompt Programming for Large Language Models: Beyond the Few-Shot Paradigm》
。
最近大规模自监督语言模型(如 GPT-3
)的兴起,以及它们在下游任务上的成功,使我们离 task-agnostic
的人工智能系统的目标又近了一步。然而,尽管这类模型具有明显的力量,但目前控制它们执行特定任务的方法却极为有限。为了正确评估其能力并从这些模型中提取有用的工作,需要新的方法。
在GPT-3
之前,评估和使用这类模型的标准方法涉及对任务数据集的一部分进行微调(《Universal language model fine-tuning for text classification》
)。GPT-3
在没有微调的情况下在各种任务上取得了 SOTA
的性能,只使用了 few-shot prompts
,其中 prompts
提供了少量的任务示例作为输入的一部分馈入到训练好的模型。然而,虽然 few-shot format
足以揭示这些任务的惊人表现,但我们认为,在从自监督的语言模型中提取特定的 learned behaviors
方面,prompting
可能比 fine-tuning
或 few-shot format
更有效。
我们认为,与原始 GPT-3
论文的标题(即,Language models are few-shot learners
)所暗示的对 few-shot format
的普遍解释相反,GPT-3
在运行期间往往不是真正从 few-shot examples
中学习任务。与其说是指令(instruction
),不如说该方法的主要 function
是:在模型现有的 learned tasks
空间中进行任务定位(task location
)。这可以从 alternative prompts
的有效性中得到证明,其中在没有示例或指令的情况下,这些 alternative prompts
可以激发与 few-shot format
相当或更好的表现。
这促使我们采取新的方法,显式地追求 task location
的 goal
。我们建议探索更通用的 prompt programming
方法,特别是将任务意图(task intention
)和任务结构传达给自监督模型的技术,其中自监督模型的训练模态是自然语言。
在很大程度上,自监督语言模型被训练来逼近的 ground truth function
就是人类的写作方式。因此,为了与语言模型进行交互和控制,我们应该从人类使用的自然语言的角度来考虑。除了一些注意事项外,我们希望找到一些我们预期人类补全的 prompts
,通过文本补全的方式来完成目标任务。
在本文中,我们研究了 few-shot paradigm
,并发现它的性能可以被简单的 0-shot prompts
相匹配或超过。我们探讨了成功的 0-shot prompts
的性质,并通过自然语言符号学的视角提出了 prompt programming
的通用方法。我们展示了一些新颖的 prompts
,这些 prompts
迫使语言模型在作出裁决之前将问题分解成若干部分;我们还介绍了 metaprompt programming
的概念,这种方法将编写 task-specific prompt
的工作交给语言模型本身。最后,我们讨论了如何将这些想法纳入现有的和未来的 benchmarks
,使得我们能够更好地探测(probe
)大型语言模型的能力。
就是类似于
COT
的思想来引导模型自动生成few-shot examples
。
相关工作:最近的文献工作集中在,使用机器学习的传统应用方法来控制自然语言的生成,例如:
调节 output
的新架构(《CTRL: A Conditional Transformer Language Model for Controllable Generation》
、《GeDi: Generative Discriminator Guided Sequence Generation》
)。
更先进的采样技术(《Hierarchical Neural Story Generation》
、《The Curious Case of Neural Text Degeneration》
)。
基于梯度的 prompts
优化(《AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts》
、《Prefix-Tuning:Optimizing Continuous Prompts for Generation 》
)。
特定任务的adapter networks
(《Zero-shot Learning by Generating Task-specific Adapters》
)。
关于这些最新方法的综述见 《Controllable Neural Text Generation》
。过去的工作还探索了通过为每个任务动态地选择最相关的示例来改进 few-shot paradigm
(《Multi-Step Inference for Reasoning Over Paragraphs》
、《Making Pre-trained Language Models Better Few-shot Learners》
。
相比之下,关于自然语言的 0-shot
的 prompt programming
方法的工作很少被正式化。相反,成功的 prompt programming
技术主要是在 OpenAI's API and AI Dungeon
的用户的博客和社交媒体上分享。
由于大多数 prompt programming
的探索采取了分散的形式,我们在这里汇编所有相关的贡献是不可行的。相反,我们给出了一个简短的、非详尽的探索,这些探索已经超越了 few-shot paradigm
。
《GPT-3 Creative Fiction》
对 GPT-3
的能力做了最全面的综述,他演示了 GPT-3
写小说、写诗歌、写海豹突击队,以及执行 PDF
清理等任务。他写了大量关于他使用 GPT-3
工作的直觉,也写了他的 prompt programming
方法。
《GPT-3: Using Fiction to Demonstrate How Prompts Impact OutputQuality》
写过关于 prompt
提供的上下文对写作质量的影响。
《You Can Probably Amplify GPT3 Directly》
写过关于通过对话引导 GPT-3
从而将问题分解成多个步骤来放大 GPT-3
的数学能力。
推特用户 KaryoKleptid
也发布了类似的实验(《Seems to work》
、《Teaching GPT-3 to do a brute force ’for loop’ checking answers》
),使用对话来 prompt GPT3
(通过 AI Dungeon
)将问题分解成多个步骤并遵循暴力检查等程序,在数学问题上取得了令人印象深刻的结果。
我们的工作综合并扩展了这些探索所开创的方法,代表了向正式确定有效的自然语言 prompt programming
技术迈出了适度一步。
GPT-3
在有 0-shot prompts
、1-shot prompts
、n-shot prompts
的任务上进行了评估。当提供更多的示例时,GPT-3
的表现一直很好,0-shot
的表现往往不到 n-shot
的一半。对这一结果的常见解释是,GPT-3
在运行时从示例中学习,这使得它的表现比提供较少或没有示例时更好(《Language models are few-shot learners》
)。
然而,随着示例数量的增加,性能的提高可以用另一种方式来解释。与其说从示例中学习如何执行任务,不如说这些示例只是用来指导 GPT-3
解决什么任务,并鼓励它在回答中遵循 prompt
的结构。
例如,对于某些任务(如翻译任务),少量的样本不足以学习关于该任务的任何实质性内容。相反,GPT-3
必须主要地(如果不是完全地)依靠其 trained weights
中所包含的源语言和目标语言的词汇知识和语法知识。我们将明确表明,这些 prompts
主要是引导模型访问现有的知识,而不是将这些任务视为 few-shot learning
。我们通过研究示例(训练样本)是否有必要,从而来做到这一点。
0-shot prompts
的成功:由于预算和时间的限制,我们只探讨了一个简单的例子,即一个 French-to-English
的翻译任务。我们发现,0-shot prompts
可以匹配甚至超过标准的 few-shot
的性能。我们在 Table 1
中的结果显示,GPT-3
论文中所报告的 0-shot accuracy
甚至可以通过微小的 prompt engineering
而得到实质性的改善。最重要的是,Figure 1
中极其简单的 prompt
,只包括两种语言的名称和一个冒号,比原始 GPT-3
论文中的 10-shot prompt
表现得更好。
事实上,我们发现 GPT-3
论文中大多数表现最差的 0-shot prompts
都是如此,特别是问答任务的 benchmarks
。许多 prompts
可以很容易地通过简单的格式改变而得到改善,从而使 prompt
更接近人类写的自然语言。因此,GPT-3
的 0-shot
性能被大大低估了。
纠正这种 confusion
是很重要的,可以更准确地了解模型能力的性质,以便我们可以更好地学习控制它。事实上,GPT-3
有大量 functions
,这些 functions
无需在运行期间被学习;这使得 0-shot prompting
具有很大的灵活性,并鼓励探索更通用的 prompt programming
方法。
Examples
并不总是有用的:在我们的实验中,简单的 colon prompt
(Figure 1
)的 1-shot
的表现明显比 0-shot
更差。通过检查 GPT-3
在这个任务上的输出,我们发现性能下降是由于 1-shot
示例的语义污染造成的。这是认为示例的语义与任务有关(比如说,示例被解释为连续叙述的一部分),而不是把示例当作 categorical guide
。事实上,我们发现,在各种任务中,对于普遍的 low-shot prompts
都存在这个现象。
这种来自 few-shot examples
的污染效应已经被成功地用于提高 GPT-3
的性能,通过为每个任务选择 in-context examples
(《Multi-Step Inference for Reasoning Over Paragraphs》
)。
重写 prompt
可以使语言模型的表现发生重大变化。这就促使我们提出了一个问题: 是否有一种方法,我们可以遵循该方法来制作更有可能产生预期行为的 prompts
?
对于语言模型(它的输入和输出都是自然语言)的 prompt engineering
,可以理解为自然语言的编程。然而,自然语言是不确定的,比传统的编程语言要复杂得多。在本节中,我们将对自然语言编程的理论和方法进行讨论。
为了理解如何 prompt
一个自回归语言模型,我们必须首先考虑模型被训练的背景、以及模型所近似的 function
。
GPT-3
是在一个自监督的环境下,对数百 GB
的自然语言进行训练的。自监督是一种无监督学习的形式,其中 ground truth labels
来自数据本身。在 GPT-3
的case
中,分配给每个样本的 ground truth label
只是原始数据源中的 next token
。那么,GPT-3
所近似的 ground truth function
就是决定原始数据中 next token
的 underlying dynamic
。这个 function
,与GPT-3
不同,并不是一个黑盒子,但它是巨大的、难以解决地复杂。它是人类语言的 function
,因为它已经被人类使用并记录在书籍、文章、博客和互联网评论中。
一个预测语言 dynamics
的系统必然包括人类行为和物理世界的模型(《Building AGI Using Language Models》
)。语言的 dynamics
并没有脱离文化的、心理的和物理的背景;它不仅仅是一种语法的甚至语义的理论。在这个意义上,语言不是一个抽象的概念,而是一个与人类相关的 reality
的所有方面纠缠在一起的现象。dynamic
必须预测语言的实际使用情况,这包括(比如)预测理论物理学家之间的对话。对语言进行建模,和对 reality
(该 reality
可能影响语言流动)的每一个方面进行建模一样困难。
显然,GPT-3
并没有完美地学习到 ground truth function
,否则现在的世界看起来会非常不同。然而,它已经在明显的程度上接近了它,这一点从它不仅能够形成语法句子,而且能够连贯地采用文化参考和隐喻,并对复杂的心理的和物理的环境进行建模(《GPT-3 Creative Fiction》
)。那么,prompt programming
的问题是重要的,因为语言的 dynamics
是重要的。
如果我们要预测一个给定的由人类撰写的文本段落如何继续下去,我们将需要对作者的意图进行建模,并纳入有关该文本段落所指的世界性知识。逆问题(寻找一个 prompt
,该 prompt
能够产生一个或一类 continuations
)也涉及相同的考虑:就像说服(persuasion
)的艺术一样,它需要高层次的心理学概念,如语气、暗示、联想、记忆、风格、可信度、以及模糊性。
这就促使我们采用拟人化的方法进行 prompt programming
,因为建模 GPT-3
如何对一个 prompt
做出反应涉及到对虚拟的 human writer(s)
的建模。拟人化的方法与模型的拟人化是不同的。GPT-3
的 dynamics
需要对人类进行复杂的预测,但它的行为在几个重要方面与人类不同。在本文中,我们将讨论其中的两个方面:
它不像单个的人类作者,而是许多作者的叠加,这促使我们采用减法方法从而用于 prompt programming
。
在 tokens
之间发生大量 silent reasoning
的情况下,其预测 dynamics
的能力受到限制,这一限制可由 prompting
技术部分地克服。
本节的主旨是,为自监督的语言模型制定精确的 prompt programming
理论,与写下可观察现实的物理学的 Hamiltonian
(非常困难)属于同一难度等级。然而,人类还是有优势可以有效地进行 prompt programming
,因为我们已经进化了,并花了一生的时间学习与手头的 dynamics
相关的启发式方法。prompt programming
是用自然语言编程,它为我们提供了大量我们熟悉但没有名字的 functions
。我们需要学习一种新的方法论,但方便的是,我们已经学会了最困难的基础。prompt programming
的艺术在于:使我们现有的知识适应关于与自回归语言模型互动的特殊性。
随后,我们介绍了一些方法和框架,我们发现这些方法和框架有助于制作有效的 prompts
。这些方法可以而且应该并行地应用,就像它们在所有形式的人类话语中交织在一起一样。一般来说,强化所需行为的冗余度越多越好,这可以说是由 few-shot format
的有效性所证明的。
由于我们的经验主要来自与 GPT-3
的互动,在下面的章节中,我们直接和间接地提到了 GPT-3
的能力和行为。然而,我们相信这些方法可以推广到 prompting
任何在大规模人类撰写的语料库上训练的自回归语言模型。
pre-GPT-3
模型由于其对世界和人类概念的建模有限,在理解任务的抽象描述方面的能力要小得多。GPT-3
在 0-shot prompts
上的令人印象深刻的表现表明了直接任务规范(task specification
)的新的可能性领域。
直接任务规范是一个 0-shot prompt
,它告诉模型执行一些该模型已经知道如何做的任务。直接任务规范包括为任务构建一个 signifier
。signifier
是一种模式,它决定了预期的行为。直接任务规范可以是任务的名称,如 "翻译";也可以是一个复合描述,如 "重新表述这个二部图,使二年级学生能够理解它,通过强调在现实世界的应用";也可以纯粹是上下文,如 Figure 1
中简单的冒号 prompt
。在这些情况下,signifier
都没有解释如何完成任务、或提供预期行为的示例;相反,它显式地或隐式地调用它认为语言模型已经学会的 functions
。
直接任务规范可以监督无穷无尽的隐式样本,就像一个无限序列的闭式表达式(closed-form expression
),使得它们非常强大和紧凑。例如,"translate French to English"
这句话监督于所有可能的法语短语到英语的映射所构成的集合。
一个大型的语言模型,像一个人一样,也学会了一些行为,在这些行为上如何构建一个直接的 signifier
是不太明显的。通过示范(demonstration
)和代理(proxy
)的任务规范可能是激发这些行为的可行的替代策略。
few-shot examples
对于任务规范是有效的,因为具有不同参数的 function
的连续重复模式是自然语言中常见的。与以前的模型不同,GPT-3
鲁棒地学习了语言的这一属性,并且能够在示例从所有上下文中移除的情况下应用它。与直接规范一样,通过示范来规范任务也是 GPT-3
的一种可能性。
有些任务用示例来传达是最有效的,比如当任务需要一个 be-spoke
的格式时,描述示例的语言比描述任务本身所需的 meta-language
更容易理解。
需要注意的是,与微调不同的是,few-shot
中的"training examples"
是作为一个整体来处理的,不一定会被解释为并行的和独立的。informative context
或大量的示例可以帮助缓解 Examples don’t always help
中提到的 few-shot
的问题。例如,一个prompt
可以将示例嵌入到一个上下文中,使上下文清楚地表明这些示例是一个 function
的独立实例,而不是一个应该被推断的序列模式。一般来说,无论是从人的角度还是从语言模型的角度,示例在上下文中都是更有效的和更有信息量的。
人类交流中使用的另一种方法是代理或类比(analogy
),其中一个记忆性的概念(memetic concept
),如一个人物或特性被用作一个意图的代理,后者可能是相当复杂的或细微的。GPT-3
显示了对类比的细微理解。通过代理的规范在机制上类似于直接规范,只是 signifier
从记忆空间/文化意识中提取行为,而不是直接命名行为。
例如,你可以问圣雄甘地、安-兰德、埃利泽-尤德考克斯,而不是直接指定回答道德问题的确切标准或使用示例。每个人不仅会有复杂的偏见,而且会对问题的内容做出假设,这可能需要几段文字来证明或描述。GPT-3
对知名人物的模拟能力和抽取文化信息的能力远远超过了大多数人的能力(《GPT-3 Creative Fiction》
),所以这种方法对编码复杂的(尤其是开放式的)任务特别有用。由于 GPT-3
很适合在叙事的上下文中进行嵌入,叙事中的无限自由度也可以用来进一步塑造行为。
另一个有效代理的例子是上演老师和学生之间的对话。假设你想和 GPT-3
讨论一些事情,你关心的是它应该非常彻底地、简单地解释事情,并在你错误的时候指出来。你可以说 "be very thorough, explain things simply, and point out if I’m wrong"
,但这也可能导致一个幽默的对话,即它总是说你错了,并对你的不理解越来越恼火。更可靠的做法是将讨论呈现为学生和老师之间的讨论,这是一种典型的情况,在这种情况下,所需的属性已经隐含在其中,并且由于记忆的强化,更有可能保持稳定。
像 GPT-3
这样的语言模型的朴素的拟人化的失败方式是这样的:对 prompt
产生的概率分布不是某个人延续该 prompt
的方式的分布,而是任何一个人都可以延续该 prompt
的方式的分布。一个上下文模糊的 prompt
可能会以相互不连贯的方式继续下去,就像由不同的人在任何合理的上下文中延续 prompt
一样。
像 GPT-3
这样的大型生成模型的全能性意味着,如果有各种可能延续 prompt
的方式(包括所有人类操作者不愿意的方式),它将以多种方式对 prompt
做出反应。因此,从约束行为的角度来处理 prompt programming
是很有帮助的:我们希望 prompt
不仅与所需的延续一致,而且与不需要的延续不一致。
考虑一下下面的 prompt
:
Translate French to English:
Mon corps est un transformateur de soi, mais aussi un transformateur pour cette cire de langage.
这种 prompt
在限制可能的延续到预定任务方面做得很差。最常见的失败模式是,模型的输出不是英语,而是另一个法语句子。在法语句子后面添加一个换行符将增加下一个句子是英语翻译的几率,但是下一个句子仍然有可能是法语,因为 prompt
中没有任何内容可以排除一个多行短语成为 translation subject
。将 prompt
的第一行改为 "Translate this French sentence to English"
将进一步提高可靠性;在法语句子周围加上引号也是如此,但也可能输出通过引号包围的一段法语(比如,作为法语对话的一部分)。最可靠的是创建一个句法约束,其中任何合理的延续只能是预期的行为,就像 Figure 1
的简单冒号 prompt
、以及 Figure 2
master translator prompt
。
这个简单的例子是为了 frame
一个对 prompt programming
的动机至关重要的问题:什么样的 prompt
会导致预期的行为,而且只导致预期的行为?many-shot prompts
的成功可以通过这个角度来重塑:如果 prompt
由一个函数的众多实例组成,那么延续很可能是这个函数的另一个实例;而如果只有一个或几个实例,那么继续符合模式的可能性就较小。
对于需要推理的任务来说,prompts
以求真模式(truth-seeking patterns
)指导语言模型的计算是至关重要的。
如果问题迫使裁决由模型的延续的第一个 token
来决定,那么计算将受限于单次前向传递。可以合理地预期,某些任务可能在单次传递中难以计算,但如果将其分解为可单独处理的子任务,则可以解决问题。
当人类被给予一个封闭式测试时,通常期望在确定答案之前, subject
在 working memory
或草稿纸上进行计算。看不见的计算可能涉及重新表述问题、概述一个过程、排除答案选项、或将隐式信息转化为显式形式。当我们强迫模型在单次前向传递中产生答案时,我们剥夺了它进行类似的 "working memory"
或 "草稿空间"(scratch space
) 的能力,这些能力可以进行这种操作。
与其开放式的延续所暗示的强大理解能力和广博知识相比,GPT-3
在封闭式问题上的表现并不出色。例如,在这个多任务数据集(《Measuring massive multitask language understanding》
)上,它在某些部分的得分几乎只是随机猜测的水平。我们怀疑这部分是由于这种格式迫使在延续的第一个 token
上做出决策。
封闭式评估是必要的,因为当前的方法不支持在大型数据集上进行评估,也无法对使用开放式问题的模型进行直接比较。然而,为了更好地了解模型的能力,我们寻求更能反映系统全部能力的评估方法。我们不必改变基准测试,而是可以改变语言模型与其互动的方式。
这个问题在之前的研究中已经被认识到,之前的研究试图通过使用专门的神经网络架构来实现串行推理(《Low-resource generation of multi-hop reasoning questions》
、《Multi-step Reasoning via Recurrent Dual Attention for Visual Dialog》
)。我们努力通过仅使用prompt programming
来达到同样的效果。
对于像 GPT-3
这样的 Transformer
模型,利用 "草稿空间" 的潜在方法包括逐步过程、自我批评(辩论)、以及通过详细阐述问题来激活正确答案的关联性。已经证明,能够让 GPT-3
将数学问题分解为多步骤的 prompts
是有效的(《You Can Probably Amplify GPT3 Directly》
、《Seems to work》
)。这些演示涉及到人类通过交互式引导 GPT-3
的程序。
需要 human-in-the-loop
限制了此类基准测试和大规模应用的适用性,但是我们提出,对于许多任务来说,在通过 extending reasoning
来扩大 GPT-3
的能力方面,人类互动和 task-specific prompts
都不是严格必要的,因为 GPT-3
已经了解许多程序和元程序(meta- procedures
)用于演绎地处理问题。在这些情况下,prompt programming
的作用再次是 signify
序列推理任务。例如,"For a problem like this,"
,这样的种子通常足以指示模型考虑任务的类别并将其分析为各个组成部分。
在extending reasoning
时,要避免过早做出决策是至关重要的,否则所有后续计算只会为已经选择的决策进行合理化,而不会提高决策准确性的概率。例如,"Let’s consider each of these answer choices"
这样的 prompt
有助于引导推理的流程朝正确的方向发展。
放松对立即决策的限制引入了额外的控制挑战:我们希望延迟决策,但仍然需要以可程序化的形式被检索。动态响应长度使得推理过程何时结束变得不确定;也不能保证决策会以预期的形式或压根就没有决策。每当语言模型对其自身的 prompt
做出贡献(连续的自回归步骤而无需干预),就存在偏离预期任务的风险。
可以通过停止生成并插入类似于 Thus, the correct answer is
的 prompt fragment
来强制产生一个闭合形式的决策。但是,在插入之前要生成多长时间?在本文的例子中,我们通过使用 GPT-3
来解决这个问题,在每个 generated token
之后计算 multi-part prompt
的 next segment
的条件概率。在 segment
是 "Thus, the correct answer is"
的情况下,其反事实的可能性信号指示了程序是否已经结束。当这个信号达到最大值时,我们插入该 segment
来强制产生一个决策。
一种限制偏离的方法是使用 fill-in-the-blank prompt template
,generated sections
较短,从而保持模型的正确性,同时保持广泛适用性(Figure 6
)。这对于控制双向 Transformer
模型(如 BERT
)尤其有前景。
prompt programming
的最大局限性在于:针对特定类型任务来设计 prompt
的困难性、以及缺乏自动化方法来设计 prompt
。prompt programming
需要人力投入大量时间,因为 task-agnostic prompts
往往比针对特定任务的 prompts
效果要差得多。这促使我们创建自动化方法来生成 task-specific prompts
。先前的研究尝试使用独立的模型生成有效的 prompts
(《A Call for Clarity in Reporting BLEU Scores》
)。
相反,我们提出通过 metaprompts
来利用语言模型本身。metaprompt
是一种概括更一般意图的种子,当与其他信息(如任务的问题)结合时,会展开成具体的 prompt
。
metaprompt
可以是一个短语,比如 "This problem asks us to"
,它通过提示问题的意图,为解决问题的步骤提供连续的解释。另外,metaprompt
可以采用 fill-in-the-blank template
的形式,它限制了响应沿着预定的过程,但允许模型填写问题特定的细节。
metaprompt
示例(Figure 3 ~ 5
)是使用 GPT-3
和 OpenAI
的 API
生成的(engine=davinci, temperature=0
)。在这些示例中,metaprompt
充当特定问题的 "wrapper"
。任务问题是 unformatted
的,metaprompts
以粗体显示,由 GPT-3
生成的文本以蓝色显示。
这就是
Chain of Thought Prompting: COT
的思想。只是COT
用于zero-shot
,而这里用于生成示例从而进一步用于few-shot
。
本文是探索性的,是对未来研究 prompt programming
理论和创建自动化 prompting
方法的呼吁。
prompt programming
是一个新生的、高度相关的研究领域,需要跨学科的知识和方法。我们正在进入一个新的人机交互模式,任何精通自然语言的人都可以成为一个程序员。我们希望看到 prompt programming
本身成长为一门学科,并成为理论研究和定量分析的对象。
解耦 meta-learning
和 task location
:前面讨论的 French-to-English
翻译中使用的评分方法(BLEU
)仅对大型数据集给出平均分数。我们没有分析得分分布的其他信息。在我们的实验中,我们发现 0-shot
失败(使用 OpenAI
的 zero-shot prompt
)通常是灾难性的。也就是说,翻译任务甚至没有被尝试。例如,我们注意到模型会继续用法语输出另一个句子,或者输出空白或下划线,好像答案应该由学生填写。
假设这些示例是在执行 task location
,这表明如果将灾难性的失败从分数中去除,0-shot prompts
和 64-shot prompts
的性能将变得更加相似,如果不是相等的。此外,我们怀疑 1-shot prompts
的性能会明显低于 0-shot prompts
和 64-shot prompts
,这是由前面讨论的内容泄漏、以及错误概括等现象引起的。
benchmarking
的新方法:更通用和强大的语言模型使得更广泛的基准测试方法成为可能和必要。
隔离灾难性的失败:我们建议在可能区分任务失败的尝试、以及任务未被尝试的情况下,基准测试报告中同时提供有灾难性失败、以及没有灾难性失败的得分。这提供了关于性能不完美的潜在原因的信息,并有助于识别可能没有可靠传达任务的 prompts
。
用于评估的 metaprompts
:开发有效的 meta-prompt templates
将允许在封闭式的问题上进行大规模的自动化评估,同时仍然允许一定程度的开放式推理。这对于测试自回归语言模型在超越简单的事实记忆(fact recall
)之外的推理能力(例如解决数学问题和物理问题)是至关重要的。
由于依赖于多个自回归步骤,metaprompts
固有地伴随着脱轨的风险。一个 meta-prompt
的可靠性和有效性必须在它可能适用的一系列任务上进行评估,最好是在一系列模型上进行评估。应进一步探索控制脱轨的技术,如 fill-in-the-blank templates
。
用于评估的语言模型:随着语言模型变得越来越强大,使用其他语言模型评估对开放式基准问题的回答质量变得可行。对于许多任务(例如 NP-complete
问题),验证解决方案的正确性要比产生正确的解决方案更容易。例如,我们观察到,GPT-3
更可靠地注意到一个段落是否奇怪或包含错误,相比较于它能够生成没有错误的非奇怪段落。
游戏:由于复杂的语言模型有能力创建虚拟环境的世界模型,我们建议使用基于文本的游戏作为复杂能力的测试。可以使用预先编写的基于文本的游戏来测试世界建模和代理的各个维度,例如 problem solving
、信息收集和社交智能(包括欺骗)。虚拟环境可以用于测试语言模型的世界模型的质量和一致性,例如对象持久性、或准确预测玩具环境中事件的物理后果或社交后果的能力。
设计可靠地探索预期能力的游戏需要先进的 prompt programming
技术。随着人工智能系统在有效代理方面的增加,设计虚拟游戏将对安全评估能力变得越来越关键。
论文:
《Show Your Work: Scratchpads for Intermediate Computation with Language Models》
。
基于 Transformer
的大型语言模型表现出令人惊讶的能力,包括生成代码从而解决简单编程问题的能力(《Evaluating large language models trained on code》
、《Program synthesis with large language models》
)。然而,这些模型在进行 multi-step
算法的计算时很吃力,尤其是那些需要精确推理和无限制计算的算法。例如,GPT-3
在对超过三位数的数字进行 few-shot
加法时很吃力(《Language models are few-shot learners》
)。同样,大型语言模型也很难预测 Python
代码的运行结果,即使是模型能够解决的编程任务的 Python
代码(《Program synthesis with large language models》
)。同样,标准的递归神经网络和图神经网络在预测带有循环的简单程序的输出时,也不能系统地进行泛化(《Learning to execute programs with instruction pointer attention graph neural networks》
)。因此,语言模型在某种程度上可以编写代码,但似乎不能准确地表达他们所编写的代码的语义,因为他们不能预测代码的执行。这促使人们研究能够进行算法推理(algorithmic reasoning
)的网络(《Neural turing machines》
、《Learning to execute》
、《Learning to execute programs with instruction pointer attention graph neural networks》
)。准确表示程序语义的神经网络可以实现各种下游任务,包括程序合成(《Robustfill: Neural program learning under noisy》
)、程序分析(《Learning to represent programs with graphs》
)和其他算法推理任务(《Neural algorithmic reasoning》
)。
为什么大型语言模型会在算法推理任务中挣扎?我们认为,这至少部分是由于 Transformer
架构应用于这些任务的方式的局限性:模型被要求在一次 forward pass
中执行这些任务。考虑到固定的层数和固定的计算时间,该模型无法在产生输出之前根据问题的难度调整计算量。之前的工作(《Adaptive computation time for recurrent neural networks》
、《Pondernet: Learning to ponder》
)已经探索了显式地允许动态选择计算时间从而用于不同子任务的神经架构。在这项工作中,我们提出了一种不同的方法,该方法可以利用现有的 Transformer
架构和大型的 few-shot-capable
语言模型:我们修改了 task design
而不是修改模型或修改训练程序。
我们的建议很简单: 允许模型在产生最终答案之前产生一个任意的 intermediate tokens
序列,我们称之为 scratchpad
。例如,在加法问题上,scratchpad
包含一个标准的 long addition
算法的中间结果(见 Figure 2
)。为了训练模型,我们将算法的中间步骤编码为文本并使用标准的监督训练。
本文贡献:
我们为 Transformers
引入了"scratchpad"
的概念,从而使其在不修改底层架构的情况下更好地进行复杂的离散计算。
我们表明,scratchpad
帮助 Transformers
学会在微调的环境中执行 long addition
,特别是它们改善了对更大的问题实例的 out-of-distribution generalization
。
我们还发现,scratchpad
帮助 Transformers
完成了一个更高层次的任务:多项式求值。这一点在 few-shot
环境下和微调环境下都是如此。
最后,我们转到一个更普遍的背景,并表明,训练 Transformers
逐行发出带有局部变量标注的 full program traces
,极大地提高了他们在特定输入上执行给定的计算机程序的结果预测的能力。这一应用在某种意义上取代了其他的应用。
当在微调的场景下应用时,需要人工为每个样本撰写
scratchpad
,这个代价有点高。当在few-shot learning
场景下应用时,只需要为每一类任务撰写一个prompt
,但是效果更差。
相关工作:
本文的任务可以看作是对大型语言模型的一种探索性的批评,即它们在多大程度上只是依赖文本上的表面的统计关联,而没有学习语义知识或世界知识(《Climbing towards NLU: On meaning, form, and understanding in the age of data》
)?对此,《Implicit representations of meaning in neural language models》
提供证据表明,pre-trained
语言模型确实构建了它们在文本中所描述的情况的语义的近似 representations
。
在程序方面,《Program synthesis with large language models》
通过探索 MBPP
上的 learning to execute task
来接近这个问题,我们文章中考虑了这个问题。这个任务背后的想法是探索用于生成代码的神经模型是否也能执行它。虽然这项工作发现现有的模型在执行结果的预测方面表现不佳,但我们表明,增加一个 scratchpad
可以使这些模型表现得更好。
learning to execute
方面的工作考虑了:现成的递归神经网络或更专门的架构是否具有inductive bias
从而足够适合执行和推理任意代码。neural algorithm induction
的相关问题引起了人们的极大兴趣。这项工作提出了新的神经架构,其灵感来自于计算的理论模型,其 inductive bias
使模型更容易学习 algorithm induction
任务。有几种 algorithm induction
的方法专门为序列模型添加了自适应计算时间。具体而言,universal transformer: UT
包括自适应计算时间,并在 algorithm induction
和 learning to execute
任务上进行评估(《Universal transformers》
)。相比之下,scratchpad
是一种简单的方式,既可以提供具有自适应计算时间的 transformer
模型,也可以提供关于如何使用该额外计算的监督,而不需要修改底层架构。
algorithm induction
也与 pre-trained
模型有关。《Pretrained transformers as universal computation engines》
表明 Transformer
在某种程度上可以被用作通用计算引擎,通过对自然语言进行预训练,并在非语言任务(包括简单的 algorithm induction
任务)上微调一小部分权重。最后,语义解析的监督方法可以预测 database query
的文本,然后执行该 query
来回答自然语言问题。
在这项工作中,我们考虑两个相关的问题:algorithm induction
、learning to execute
。这两个问题的目标都是让神经网络学会模仿一个函数 input-output
行为上,它可以由一个简短的程序来表示,比如加法或多项式求值。
在 neural algorithm induction
中,目标是学习单个算法,每个训练样本给出单个输入和预期的输出,输入和输出以字符串表示。因此,训练数据是
对于 learning to execute
,我们希望模型能在一些输入上产生程序(以源代码来表示)的结果。如果每个 input-output
样本是很常见的,但为了简化符号,我们省略这个。
这意味着多个算法,每个算法对应一个源代码
。
本文的主要观点是,为了解决一个给定的算法任务,我们只需将算法的 intermediate steps
编码为文本,并训练模型将其发射到一个 buffer
,我们称之为 "scratchpad"
。例如,让我们考虑学习 long addition
的 algorithmic induction
任务。为了教一个模型学会 29 + 57
,一个训练样本可能看起来像 Figure 2
中的文字,其中明确写出了 long addition
算法的步骤。
learning to execute
任务也可以用类似的方式进行编码,只是现在我们在 input
、scratchpad
、以及预期输出之前加上了源代码 Figure 1
显示了一个 learning to execute
任务的训练样本。
在训练时,模型将被提供 input
以及 target
从而用于标准的 likelihood-based
训练。在测试时间,模型将只被提供 input
,并被要求预测目标,例如,通过 beam search
或 temperature sampling
。原则上,任何序列模型都可用于此。在这项工作中,我们选择使用 decoder-only Transformer
语言模型,但其他序列模型也可能是有效的,如 encoder-decoder
模型( T5
),或 RNN
。
添加一个 scratchpad
有几个潜在的优势:
首先,该模型具有自适应的计算时间,也就是说,它现在可以根据任务在给定输入条件下的复杂性,在必要的时候处理信息。
越复杂的任务,其
intermediate steps
越大,那么计算时间越长。
第二,模型可以将其计算的中间状态存储在 scratchpad buffer
中,并通过关注其上下文来引用它。这消除了在 activations
中存储所有中间状态的需要。
第三,通过迫使模型通过从生成模型中采样来输出具体的中间状态,我们旨在减少 small errors
的传播和复合,因为中间状态被量化为 token embeddings
。
最后,检查模型的 scratchpad output
可以帮助我们识别常见的错误,并通过修改 scratchpad
的格式来纠正它们。我们发现这种解释错误的能力在这项工作中很有用。
在所有的实验中,我们使用了 pre-trained dense decoder-only Transformer
语言模型,规模从 2M
到 137B
参数不等。这些模型在网络文档和对话数据上进行了预训练,并与 《Program synthesis with large language models》
使用的模型相对应。
作为第一个任务,我们考虑整数加法。baseline
加法任务将两个数字作为输入,目标是它们的总和。比如说:
xxxxxxxxxx
Input: 2 9 + 5 7
Target: 8 6
我们通过在 target
中包括 long addition
算法的中间步骤来实现 scratchpad
,如 Figure 2
所示。我们在具有 1 ~ 8
个数字的输入的整数加法问题上训练几个模型。然后我们对 in-distribution
加法问题(最多 8
位数的输入)和 out-of-distribution
加法问题( 9
位数和 10
位数的输入)进行性能测试。这些模型在 100K
个样本上进行了微调了 5K
步,batch size = 32
。in-distribution
测试样本有 10k
个,对于每个 out-of-distribution
任务都有 1K
个测试样本。我们研究了性能与模型大小的关系,模型规模从 2M
到 1B
参数。我们将模型性能与 baseline
进行比较,其中 baseline
不包含 scratchpad
。
结果: Figure 3
比较了 scratchpad
算法和 baseline
的性能。我们看到:
在超过临界模型规模的情况下,模型能够使用 scratchpad
解决加法任务,而没有 scratchpad
来训练的模型即使在最大的模型规模下也无法做到这一点。
在 out-ofdistribution
的任务( 9
位数加法、10
位数加法)中,我们发现没有scratchpad
来训练的模型完全失败,而用 scratchpad
来训练的模型随着模型大小的增加而显示出持续的改进。
接下来我们专注于一个稍微 higher-level
的任务:多项式求值。受 《Analysing mathematical reasoning abilities of neural models》
中 "多项式评估" 子问题的启发,我们生成了一个阶次小于或等于 3
的多项式数据集,其系数为整数,输入被限制在 10000
个多项式组成的训练数据集、以及一个大小为 2000
的测试数据集。 Figure 4
显示了这个任务的一个示例的 scratchpad target
,多项式的每一项都被独立地求值。
和上一节一样,我们将直接执行的结果与使用 scratchpad execution
的结果进行比较。在这个实验中,我们使用一个 137B
参数的 pre-trained decoder-only
模型在 few-shot setting
下进行评估,因为以前的工作表明,非常大的模型可能能够以 3
位或更少的位数的 few-shot
来执行加法和乘法(GPT-3
)。我们在 few-shot prompt
中使用
我们还用一个 8B
参数的模型在训练集上微调了 2000
步来评估fine-tuning setting
。这两项评估的结果都显示在 Table 1
中。我们发现,无论在 few-shot
还是在微调的 setting
下,scratchpad execution
都明显优于直接执行。
我们已经表明, scratchpad
可以帮助 algorithm induction
,也就是说,它们可以帮助模型在 direct algorithm-specific supervision
下学习实现特定的算法。但是,需要为每个新任务手工设计中间状态是次优的。在本节中,我们评估了模型是否可以通过执行任意代码来学习实现一种新的算法。为了测试这种能力,我们沿用了 《Program synthesis with large language models》
的问题设置,其中要求语言模型预测在给定输入上执行给定 Python
程序的结果。语言模型在这项任务中表现不佳,即使是在那些模型能够解决的编程任务的程序上(即,语言模型能够补全该程序的代码)也是如此。在这里,我们展示了 scratchpad
技术可以极大地提高语言模型执行程序的能力。
Direct execution prediction
:我们的主要 baseline
是 《Program synthesis with large language models》
探讨的直接执行预测程序。向模型展示一个函数的源代码,并要求模型预测在特定输入上运行该函数的输出。例如,Figure 1
中的函数将一个字符串 direct execution prompt
和目标显示在 Figure 1
的 "Direct Execution Prediction"
框中。如果模型正确地输出了目标字符串,那么这个任务就被认为在这个情况下得到了解决。
Execution prediction via scratchpad tracing
:如上所述,direct execution prediction
要求模型在单个 forward pass
中正确输出整个函数的执行结果。在 《Program synthesis with large language models》
的研究中,direct execution prediction
在Python
程序上表现不佳。因此,我们设计了一个执行任务的 scratchpad formulation
,其中模型通过首先预测程序执行期间计算的中间状态序列从而来预测程序的输出。
形式上,我们训练模型来预测一个交替的序列:被执行的源代码行的顺序、每一行执行后的局部变量的状态。我们称这个对象为program’s trace
,它允许我们跟踪控制流(所执行的操作的序列)、以及每个操作后的状态变化。我们将 trace
表示为一个字符串,其中复制代码行,并将状态信息表示为一个 JSON
字典。例如,Figure 1
中的 "Scratchpad Tracing"
框包含了上面讨论的函数的 tracing prompt
和 trace target
。
具体来说,对于每一个要被 traced
的函数,其 prompt
是由两部分拼接而成:
打印 function definition
得到的字符串。
一行字符串表示在特定的输入上调用该函数:output = fn_name(input_value)
,其中 fn_name
和 input_value
被替换成相应的函数名和输入值。
在 Figure 1
中,注意 remove_Occ("PHP", "P")
的正确输出是如何显示在 trace
的最后一行,并分配给变量 "output"
。如果最后一行中分配给变量 output
的值与目标输出值(这里是 "output": "P"
)的语义相符,则认为该 tracing example
具有正确的执行输出。如果所有给定的 input-output
样本都能正确执行,我们就认为一个任务是正确执行的。
我们还可以通过以下方式测试 model prediction
和 ground truth trace
之间是否存在 "trace exact match"
:将 trace
中的每个状态与 ground truth trace
中的相应状态进行语义地比较、将预测的源代码行的序列与 ground truth sequence
进行比较。
实验设置:作为一个概念验证,我们首先表明 scratchpad tracing
极大地提高了合成 Python
数据上的执行性能。然后,我们在 《Program synthesis with large language models》
的人类编写的 Python
问题上比较了 scratchpad tracing
和 direct execution
。我们发现,一种新的数据增强技术,即使用模型生成的程序作为额外的训练数据,可以显著提高真实数据上的 tracing
性能,然而这种增强技术会损害 direct execution
的性能。最后,我们表明,从其他来源纳入 tracing data
可以进一步提高 tracing
性能,这表明这里探索的 scratchpad tracing
技术可以很好地扩展更多数据。
在 Python
代码的所有实验中,我们使用了一个具有大约 137B
参数的 Transformer
模型,上下文窗口大小为 1024 tokens
、 generation
限制为 512 tokens
。除非另有说明,所有的微调运行都使用了 batch size = 8182 tokens
和 3e-5
的学习率,模型推理是在解码温度
在我们的第一个实验中,我们在简单的合成 Python
程序上测试了我们的模型的 few-shot
和微调的执行能力。这为我们的 tracing
技术提供了一个概念验证。
我们使用了从 《Learning to execute programs with instruction pointer attention graph neural networks》
修改的合成Python
程序数据集。这些程序包括小整数(0、1、2
)、简单的 while
循环和if
语句。我们构建了一个合成程序的语料库,以模仿《Program synthesis with large language models》
的 MBPP
数据集的规模,其中有 400
个训练程序、100
个验证程序和 200
个测试程序。对于每个程序,从 0 ~ 9
的范围内采样三个随机整数输入。
我们测试了在 few-shot
和微调条件下的 direct execution
和scratchpad tracing
。对于 few-shot
实验, prompts
包含三个以前的 tracing
问题的示例,如附录 C
所示;对于微调实验,我们对模型进行微调,使其在 training split
上收敛,这是由验证集的困惑度来判断的。
对于 few-shot scratchpad
实验,我们注意到模型不会将变量名 output
分配给 trace
中的 final value
,而是继续使用 v0
(函数 final output line
的变量名。因此,我们修改了 accuracy
标准,从检查 trace
的最后一行的output
的值是否正确,改为检查 v0
的值是否正确。(在朴素的评分标准下, few-shot tracing accuracy
大致为零。)这种行为的一个例子见附录 D
。
结果:Table 2
显示了我们在合成 Python
问题上的结果。不管是在 few-shot
还是微调的情况下,scratchpad tracing
技术都能在 200
个测试问题上带来更高的 overall execution accuracy
。微调对 scratchpad tracing
技术的性能改善也比 direct execution
的改善要大。
在我们的第二组实验中,我们探索了与在真实数据上 direct execution
相比,scratchpad execution
的表现如何。我们的主要评估数据集是 MBPP
数据集。MBPP
由 1000
个编程问题组成,每个问题包含一个自然语言规范、一个ground-truth
的 Python
程序和三个 input-output
测试案例。这些程序涉及使用很多类型的计算,包括整数类型、字符串类型、浮点数类型、字典类型、元组类型等,并包括许多语言特征和控制流结构,如循环、comprehensions
、库导入、API
调用和递归。MBPP
数据集的 evaluation split
包含 500
个任务。为了分离出 generation window size
的影响,我们对这些任务的子集报告了所有的评估指标,对于这些任务来说,ground-truth trace
针对所有的这三个input-output examples
符合模型的 generation window
。这就留下了 212
个测试任务的一个子集。对于基于 Transformer
的模型来说,增加 generation window length
和 context window length
是一个重要的问题,但我们认为它是正交的,并把它留给未来的工作。
在极低数据量的情况下性能很差:在我们对 MBPP
数据的第一次实验中,我们在 374
个训练任务(每个任务有 3
个样本 ,所以总体上有 1122
个样本)上训练一个 scratchpad tracing
模型。我们放弃了所有超过 context window
的训练样本。我们将总体执行结果与在同样的 374
个训练任务上训练的 direct execution
模型进行比较。Table 3
中标记为"MBPP"
的列显示了这个实验的结果。scratchpad execution
模型和 direct execution
模型都没有取得良好的性能( output
准确率分别为 5%
和 10%
),而 direct execution
的性能优于scratchpad execution
。
采样的程序是很好的 scratchpad
训练数据:接下来,我们采用了一种数据增强技术来增加训练数据集的规模: 如 《Program synthesis with large language models》
所述,我们首先使用预训练好的 137B
模型在 374
个 MBPP
训练任务上运行 few-shot synthesis
。对于每个任务,我们在温度 80
个候选程序 execution
数据点,其中 direct execution
数据集既有额外的新程序、又有新的输出。
我们可以通过 tracing
每个候选程序 scratchpad execution
模型创建一个类似的 tracing
数据集。这个过程产生了更大的 tracing and execution
数据集,有 17K
个新程序,我们称之为 MBPP-aug
。
从概念上讲,我们利用已有的工具组合来增强数据集,即:神经模型、通过 Python
解释器的 program execution
。我们在这个新的增强数据集 MBPP-aug
上对 direct execution
和 scratchpad execution
进行微调,使用的过程与上述相同。
Table 3
中的 "MBPP-aug"
列显示了这个实验的结果。虽然 direct execution
方法在对这些额外的数据进行训练时,准确率有所下降,但 scratchpad execution
的性能得到了极大的提高:在增强数据上训练的模型所解决的任务数量,是只在原始 MBPP
程序上训练的模型的三倍以上。我们还注意到,如果我们衡量整个样本的原始正确性,该模型已经达到了 26.8%
的 exact trace match
,这是令人惊讶的高。
scratchpad training
能很好地利用大型数据集:在这一节中,我们研究从人类编写的程序中收集额外的 tracing data
是否能进一步提高 tracing
性能。这将使我们了解,当略微 out-of-distribution
的tracing data
被添加到微调集合时, tracing
程序是否有可能很好地扩展。我们使用两个数据集进行实验:
Single-line programs
:这个数据集包括大约 9M
个单行 Python transformations
的样本。Figure 6 (top)
显示了这些 transformations
的例子。每个 transformation
都包括一组初始变量和相应的值、一行 Python
代码(这些共同构成了输入)、以及运行这一行后产生的新的变量和值(即,target
)。在 single-line data
上进行训练时,我们不引入中间的 scratchpad steps
。由于这个数据集没有提供 high-level
的、多行控制流的样本,但该数据为建模单个代码行的执行提供了良好的监督,而单个代码行的执行是 tracing
的一个关键组成部分。这些数据是由 Fraser Greenlee
收集的,可以在 https://www.kaggle.com/datasets/frasergreenlee/python-state-changes
访问。
CodeNet
:Project CodeNet
数据集由数百万用户提交的大约 4000
个编程问题组成。这些提交的信息包括对编程问题的正确和不正确的解决方案。然而,从上述 MBPP-aug
的实验中,我们知道,不正确或 broken
的程序仍然可以提供有用的训练信号。我们还改进了我们的 tracing
技术从而允许 trace
有错误的程序;当达到一个错误时,错误信息会被添加到 trace text
的末尾,tracing
也会停止。我们从 CodeNet
数据中共提取了 670,904 traces
。
对于每个数据集,我们首先在这些数据集上微调模型,然后在 MBPP-aug
上进行第二次微调直到收敛。
结果显示在 Table 3
中。如上所述,我们报告了跨任务的 execution accuracy
。我们还报告了跨任务的 trace accuracy
,以了解整个 trace
被准确预测的程度。我们还报告了所有测试样本的原始 execution accuracy
和 trace accuracy
,作为比较模型的额外指标。
单独对 single-line
或 CodeNet
数据集的训练似乎都比 MBPP-aug
有所增益(分别提高了 23.4%
和 25.2%
的任务执行正确)。
然而,结合 CodeNet
数据集和single-line
数据集似乎能带来最高的性能:对于 26.6%
的任务,tracing
产生了正确的 final output
;将近四分之一的任务(24.6%
)在所有三个例子中都被完美的被 traced
。
这些结果似乎很有希望:神经网络通常可以准确地 trace
程序。具体而言,从最佳模型中贪婪地解码,对几乎 42%
的 traces
产生了完全正确的 trace
。
Context window size
:在这项工作中,我们将实验限制在 scratchpad text
相符合的 model generation window
( 512 tokens
)的问题上。然而,许多问题需要非常长的 scratchpad generation
。因此,充分实现 scratchpad
技术的潜力可能需要进一步改进 transformer generation window size
。这是 NLP
中一个活跃的研究领域,这方面的改进将有利于 scratchpad
技术的应用。
学习在没有监督的情况下使用 scratchpad
:下一步显然是尝试在没有 direct supervision
的情况下学习使用 scratchpad
。一个简单的方法是使用强化学习技术:模型正确回答问题将得到奖励,奖励与所使用的 scratchpad tokens
数量成反比。我们希望学习使用 scratchpad
是一种可迁移的技能;例如,一个模型有可能使用它所学到的 long addition
算法,从而成功地迁移到进行多项式计算。
论文:
《Can language models learn from explanations in context?》
在 NLP
中出现了一个新的范式:语言模型的 few-shot prompting
。大型语言模型似乎表现出一些 in-context learning
能力,例如它们可以推断出如何执行一项新的语言任务的 few-shot
(GPT-3
):从几个 (input, output) pairs
的样本(作为模型的上下文窗口)中推断出来,但不需要训练。例如,这些模型可以通过上下文中的几个相关问题和正确答案的样本,更准确地回答简单问题或进行算术任务。虽然并不总是清楚从这些 prompts
中学习出什么或推断出什么,但 prompting
是一个不断增长的子领域 (《Pretrain, prompt, and predict: A systematic survey of prompting methods in natural language processing》
)。
这种从 few-shot prompt
中适应新任务的能力与人类适应指令或样本的灵活性有一些相似之处。然而,解释(explanations
)在人类学习中也起着核心作用(《Schema acquisition from a single example》
):解释突出了任务原则(task principles
),使我们能够广泛地进行泛化。例如,解释可以通过将一个简短的答案(如 "false"
)与解决问题所需的更广泛的推理过程联系起来(如 "these statements are contradictory; a number cannot be both prime and divisible by 6, which is composite."
)。因此,解释可以通过说明将问题与答案联系起来的 principles
从而澄清预期的任务(intended task
)。
因此,我们研究了当从 in-context
样本中学习时,语言模型是否也能从解释中受益。对答案的解释能否提高 few-shot
任务表现?请注意,这个问题并不关注可解释性作为帮助用户理解模型的手段;相反,我们关注的是,few-shot explanations
是否能够帮助模型本身 "理解" 任务,正如通过性能评估的那样(参考 《Symbolic behaviour in artificial intelligence》
)。
这个问题是有趣的,有多种原因。实际上,它有可能改善 few-shot
性能。但更根本的是,这个答案揭示了一个科学问题,即语言模型表现出什么样的 in-context learning
能力,这是一个正在争论的话题(例如 《Rethinking the role of demonstrations: What makes in-context learning work?》
、《Do prompt-based models really understand the meaning of their prompts?》
)。
几个趋同的研究结果表明,解释可能会改善 few-shot
表现。首先,具有显式指令或任务描述的 prompting
是使语言模型适应新任务的一种有效方式《Pretrain, prompt, and predict: A systematic survey of prompting methods in natural language processing》
)。此外,为语言模型分解推理过程的步骤,可以提高 few-shot
表现。对 few-shot prompt
中的样本的解释同样可以支持推断出正确的任务,从而提高下游的任务表现。
语言模型可以从解释中获益,而不一定要以类似人类的方式 "理解" 解释(参见 《Why ai is harder than we think》
)。解释在人类话语中很普遍,因此,语言模型在训练中会遇到一些解释,这些解释(由编写解释的人类)旨在澄清 understanding
和改善 future reasoning
。例如,网上有许多考试答案,其中包含问题、答案、以及对这些答案的解释,这些解释可以帮助预测该考试中后续问题的答案。这些数据模式可能足以让人学会在看到解释后更好地回答后续问题。
我们并不是第一个探索 explanations
的人;鉴于人们对 prompt tuning
越来越感兴趣,还有其他关于 in-context
中的辅助信息如何影响模型性能的工作,以及大量 prompting
之外的工作(如 training or tuning with explanations
)。与之前的工作相比,我们特别关注 post-answer explanations
的效果,而 COT
在答案之前提供 chains of reasoning
。pre-answer explanations
和 post-answer explanations
对模型推理和评价有不同的影响,并提供了不同的科学见解。此外,我们在一个明显具有挑战性和多样性的任务集上进行评估,并包括仔细的对比和分析。
我们强调以下的贡献:
我们对 40
个不同的、具有挑战性的语言任务进行了注释(对样本进行解释),同时发布了这些 annotations
。
我们在具有或没有 few-shot
样本、解释、指令、以及控制条件(control conditions
)的 prompting
之后,评估了几个语言模型。
在 few-shot prompt
中,对样本的解释可以提高大型模型的性能;即使没有 tuning
,它们的性能也超过了对应的 control conditions
。
使用小型验证集来调优或选择的解释可以产生更大的效果。
我们用尊重任务、items
和 prompt elements
之间的依赖性的分层统计模型来分析我们的结果。我们强调了这些方法的更广泛的价值。
COT
是把解释放在答案之前,而这篇论文是把解释放在答案之后。这是算法上的唯一区别。放在答案之后的好处是:在推断期间,由于不需要推断出解释而直接推断出答案,因此效率更高。
相关工作:最近的观察表明,语言模型可以通过几个样本来完成任务(GPT-3
,GPT-2
),这激发了关于这种学习的基础是什么的讨论:例如,《An explanation of in-context learning as implicit bayesian inference》
提出,in-context learning
是一种隐式贝叶斯推断的形式。其他研究者质疑所发生的是否真的是 "学习",或者仅仅是恢复以前经历过的任务(MetaPrompt
)。例如,《Rethinking the role of demonstrations: What makes in-context learning work?》
观察到带有随机标签的 prompts
对常见的 NLP
任务(如entailment
)的表现只有轻微的影响。在讨论中,我们将描述我们的结果对理解语言模型的 in-context learning
的贡献。
Task instructions
:许多先前的工作都将任务指令作为 zero-shot prompts
(MetaPrompt
、《Pretrain, prompt, and predict: A systematic survey of prompting methods in natural language processing》
),或作为 few-shot prompt
的一部分(例如 《Cross-task generalization via natural language crowdsourcing instructions》
)进行探索。模型对这些 prompts
中的任务框架很敏感,并且可以从显式地将问题分解为多个步骤中获益(《Reframing instructional prompts to gptk’s language》
)。《How many data points is a prompt worth?》
估计,至少在训练分类器时,task prompts
的价值可以值得很多样本。
In-context explanations
和 reasoning decomposition
:
《Cross-task generalization via natural language crowdsourcing instructions》
探讨了包含任务描述和带有解释的样本的 prompts
(以及其他特征,如 guidelines
)。然而,他们并没有估计 explanations
的独立效果,也没有与 control conditions
进行比较。
《Few-shot self-rationalization with natural language prompts》
和 《Reframing human-AI collaboration for generating free-text explanations》
使用 few-shot prompting
来鼓励语言模型解释他们的答案,但产生的解释是为了用户解释,而不是为了提高任务表现。
《Unsupervise dcommonsense question answering with self-talk》
表明,"self-talk"
(从模型中采样答案来支持问题,并在上下文中加入这些答案)可以改善问题的回答。
最近的其他工作表明,模型可以从分解推理过程(该推理过程导致答案)的样本中获益(COT
),特别是当它们被增强了 external scratchpads
以存储中间计算时(《Show your work: Scratchpads for intermediate computation with language models》
、《Teaching autoregressive language models complex tasks by demonstration》
)。这些分解可以被看作是一种特殊的解释。然而,与COT
这样密切相关的工作相比,我们在 prompt
中的答案之后提供解释,而不是在答案之前提供 reasoning chains
。然而,我们还是观察到了这些答案后的解释所带来的好处(甚至在一些像算术这样的任务中,计算中间步骤也是有用的)。这是一个关键的区别,与 explanations
能够为模型提供的独特好处有关。此外,与许多先前的工作相比,我们在更广泛的挑战性任务上进行评估,包括更广泛的 matched controls
,并提供更深入的统计分析。
用指令或解释来训练语言模型:之前的各种工作已经探讨了用任务指令训练或调优语言模型、以及用解释来训练。许多专注于用解释进行调优的工作使用了诸如 span highlighting
或 word highlighting
的方法,而不是自然语言解释,见《Explanation-based human debugging of nlp models: A survey》
的评论。虽然这些更广泛的前期工作与 “解释在自然语言处理中可能是有用” 的这一总体想法有关,但它并没有立即影响到 in-context explanations
如何影响模型(其中,模型没有以任务指令或解释来训练)这一问题。然而,显式地用解释或指令进行训练的模型可能会从 in-context explanations
中显示出更多的好处(FLAN
)。
NLP
之外的 explanations
:用解释进行训练也显示出在 language
之外的领域的好处。例如,解释已经被用于训练或调优计算机视觉的模型、用于通过 program induction
来解决数学问题、或关系推理和强化学习。
缩放和涌现: 虽然语言模型的损失可以随着模型的大小表现出可预测的缩放性(《Scaling laws for neural language models》
),但这些平滑的变化可以导致特定行为的质量差异(《Predictability and surprise in large generative models》
):"more is different"
(《More is different: broken symmetry and the nature of the hierarchical structure of science》
)。举几个例子来说:
GPT-3
观察到算术任务的表现随着规模的增加而急剧转变。
FLAN
发现,只有大型语言模型才能从 instruction fine-tuning
中泛化到执行新任务的 zero-shot
。
我们发现,解释的好处随着模型规模的扩大而涌现,这与之前的这些发现是一致的。未来更大的(或其他改进的)模型可能会表现出更大的好处。
数据集:BIG-bench
中选择了 40
个任务和子任务的子集,这些任务跨越了各种推理类型、技能、领域。例如,metaphor_boolean
要求识别一个句子是否正确地转述了另一个句子(如下 Figure 1
所示)。
关于所有使用的任务和选择过程,见附录 A
。
语言模型:一组参数从 1B
到 280B
不等的语言模型(《Scaling language models: Methods, analysis & insights from training gopher》
)。
用解释来标注样本: 如果用更多的样本来调优 prompt
,"few-shot"
的表现结果会产生误导(《True few-shot learning with language models》
)。为了避免类似的问题,我们首先探索 untuned explanations
的原始效益。为了创建 untuned explanations
,一个作者在每个数据集中随机选择的 15
个任务实例(question/answer pairs
)上标注了 "expert" explanations
,这些解释将帮助人类理解问题和答案之间的关系。评估这些 untuned explanations
将低估 optimal explanations
的好处,但因此提供了一个有代表性的估计,即在一个新任务上增加解释(而没有调优)的预期好处。随后,我们探讨了在一个小的验证集上为 performance
而调优的 explanations
所带来的好处。
在 prompt
中添加解释会改变其他 prompt features
,如总长度、内容。为了确定这些 lower-level features
之一是否驱动了 explanations
的效果,我们制作了各种 control explanations
,与语义级别、单词级别、句子级别内容的各个方面相匹配(如下图所示):
scrambled explanations
:为了确保好处不是由 word-level
特征引起的,我们与单词被随机混洗过的 explanations
进行比较。
true non-explanations
:为了检验重要的是解释的内容,我们与有效的、相关的、但非解释的陈述内容进行比较。
other item explanation
:最后,我们评估了这些好处是否是由于解释(explanation
)和说明(explanandum
)之间的直接关系,而不是语言的某些其他特征。为了做到这一点,我们把 few-shot prompt
的样本拿出来,对解释进行了排列组合,使解释与问题或答案不一致,但 prompt
中包含的整体句子集合是相同的。
一个独立的、condition-blind
的作者对一个 explanations
子集的质量进行评分,这些解释明显好于中性或 true non-explanations
(附录 B.3
)。我们还为每项任务标注了指令和 control non-instructions
(见附录 B
),从而扩大prompts
集合(该集合被我们用来评估 explanations
),从而使我们的结果更有可能推广到新的 settings
。
Prompts and evaluation
:我们为每个任务(见 Figure 1
)构建了几个 0-shot prompts
和 5-shot prompts
,这些 prompts
是任务指令(none
、instruction
、non-instruction
)和样本解释(none
、other item explanation
、true non-explanation
、scrambled explanation
)可能组合的一个子集。当然,在0-shot prompts
中不可能有explanations
,我们省略了 control explanations with (non-) instructions
的组合,以减少 query
的数量。我们用一条空行将 prompt examples
分开。
当我们将 explanations
应用于一个样本时,我们将它们放在答案之后的一行并以"Explanation:"
开始(参考 Figure 1
);这与之前探索在答案之前解释推理的工作形成对比(例如 《Show your work: Scratch pads for intermediate computation with language models》
、COT
)。在答案之后进行解释的一个好处是,无论是否提供解释,evaluation
程序都是相同的,模型将试图在 explanation
之前产生一个答案。相比之下,答案之前的 explanations
需要改变evaluation
程序,并且需要在评价期间对 explanations
进行更多的计算。这些方法也提供了不同的科学含义,见讨论部分。
我们在每个 prompt
下,在所有的 task dataset items
(除了 prompts
中包含的 items
)上对模型性能进行评估。我们仅限于多项选择任务,以 prompt
和问题为条件来评估模型对每个答案选项的可能性(参考 Figure 1
)。我们不按答案长度对可能性进行归一化处理,但在一个问题中,答案的长度通常是相似的,而且在一些初步实验中,这种归一化处理并没有提高性能。我们贪婪地从集合中选择可能性最高的答案,并根据任务所定义的答案分数(可能允许多个正确答案或部分评分)对模型的准确率进行评分。
Tuning or selecting explanations
:未针对模型和任务进行调优的 explanations
只提供了 explanations
的潜在好处的弱下限。例如,更好的explanations
可能是由对任务或模型更熟悉的专家来做的。为了提供一些关于更优的 explanations
的潜在好处的见解,我们进行了两个 tuning
实验。
Selecting examples and explanations
:我们从为每项任务标注的 15
个样本中选择了一些样本来建立一个 5-shot prompt
。我们贪婪地选择了在 15 prompt items
中预测其余样本的正确答案的最佳表现的样本。也就是说:
我们创建了一个在其余 14
个问题上表现最好的 1-shot prompt
。
然后通过将其余每个样本附加到这个 1-shot prompt
上,创建了 14
个 2-shot prompt
,等等。
相对于真正的验证集来说,这种方法稍有 biased
,但这种bias
只会让我们低估潜在的好处。作为对照,我们比较了在不包括解释的情况下选择样本:即我们在相同的样本集合上进行相同数量的选择,只是省略了 explanations
,或者选择含有 control explanations
的样本。这个实验评估了在通过简单地选择样本来 tuning prompts
时,explanations
的好处。
Hand-tuned explanations
:对于在所有条件下表现都很差的五项任务,我们从表现最好的 untuned explanations prompt (without instructions)
开始,并编辑 explanations
的文字,试图提高验证集(其他 prompts
的 10
个样本)的表现。这个过程通常涉及相对较小的编辑,例如,更多的 "language-like"
或教学性的解释(见附录 B.6
)。手工调优使我们能够得到更优的 explanations
的更紧的性能下界。
请注意,在上述每种情况下,tuning
是在我们标注过的其他样本的小型验证集上进行的,但 tuned prompts
随后在其余任务样本的更大集合上进行测试。
分析:为了更精确地估计 prompt
的不同部分对性能的影响,我们转向 hierarchical/ multilevel modeling
方法。具体来说,我们拟合 hierarchical logistic regressions
,该 hierarchical logistic regressions
考虑到我们结果的多重嵌套的、异质的结构。
例如,这些模型考虑了整体任务难度、以及每个问题的特异性的难度所带来的依赖性。这些模型还考虑了不同的 prompt conditions
共享内容的事实:例如,一组解释被应用于一组特定的 few-shot examples
。最后,这些模型还考虑到 few-shot examples, explanations, and instructions
对不同任务的表现有不同影响的可能性。这些模型通过估计每个 hierarchy
的特异性效果(idiosyncratic effect
)的参数来说明每个因素:例如,一个参数用于每个任务的难度、一个参数用于每个问题(嵌套于每个任务中)的难度、以及一个参数用于每个不同的 explanations
集合的效果。完整的模型规格见附录 D.1.
。
在 Figure 2
中,我们展示了在 prompt
中加入不同类型的内容所产生的性能改善的效果大小的估计。每个 point
都估计了该 prompt component
的效果,同时控制和聚合了 prompt
的其他 components
的效果。
在 prompt
中加入 few-shot examples
,相对于 zero-shot prompt
,大大改善了成绩。
答案的 untuned explanations
也能提高成绩,其效果约为 few-shot examples
的 1/3
。 tuned explanations
具有更大的效果。
instructions
能稍微提高成绩,但比 explanations
的效果要小。
在 Figure 3
中,我们展示了不同 explanation
类型带来的好处的分布情况:相对于 matched conditions without explanation
,log-score
的提高。
untuned explanations
具有不同的效果,但平均来说是有益的。
同时选择样本和解释比单独选择样本带来更一致的改善。
至少在我们评估的五个任务中,hand-tuning explanations
提供了更多的好处。
我们还发现,在 prompts with or without task instructions
、或者 non-instructions
中,untuned explanations
的效果并没有很大的变化(Figure 5
)。
单个任务的结果可以在附录 D.7
中找到。
只有大型模型从 untuned explanations
中受益: Figure 4
显示了不同模型规模的 untuned explanations
的平均效果的原始总结。
untuned explanations
对最大的模型的平均性能有一个适度的提高,较小的模型没有受益。
hierarchical regression
证实了较大的模型从解释中明显受益(附录 D.1.2
)。
untuned explanations
超越了 matched control conditions
:control explanations
和 non-instructions
对于最大的模型来说是中性的或有害的。也就是说,相对于 control conditions
,真正的解释,即使是 untuned explanations
,似乎有独特的好处。
我们在 Figure 7
中描述了 explanations
和 controls
的这种平均效果。真正的 explanations
甚至超过了带有其它样本的 explanations
的 prompt
,这表明好处取决于样本和解释之间的关系,而不是 lower-level
特征。 hierarchical regression
证实,对于最大的模型来说, untuned explanations
明显优于所有 control conditions
(附录 D.1.3
)。
explanations
对特定的任务类型有独特的好处吗:如上所述,我们使用的任务是用内容关键词来标注的。我们创建了从常识到数学的 8
个 keyword clusters
,并在每个 keyword cluster
中探讨了 explanations
的效果(Figure 8
)。解释的好处在各 cluster
中显得相当一致。然而,每个 cluster
都相对较小,所以对结果的解释不应过于可信。
在 Figure 6
中,我们显示了在一个 prompt
中加入 explanations
所带来的改善,并与该 prompt
的基线分数作对比。在中等规模的得分的情况下,有一个耐人寻味的凸起,表明有可能出现 "zone of proximal development"
效应。然而,有几个混杂因素,例如不同任务的答案选项数量不同,影响了可能的分数。尽管如此,这种可能性还是值得在未来的工作中进行调查。
在 Figure 10
中,我们显示了在不同的模型规模下,针对 zero-shot prompt
和 few-shot prompts
,instructions
和 non-instructions
的平均效果。
explanations
能改善 few-shot learning
吗:是的,但好处取决于模型的规模和 explanation
的质量。对于一个大型模型来说,即使是 untuned explanations
也能带来适度但明显的性能改善:这种好处大约是最初添加 few-shot examples
的三分之一,但却是添加 task instructions
的两倍。因此,即使不进行 tuning
, explanations
也能提高大型语言模型的 few-shot
性能。
此外,为任务调优 explanations
(使用一个小的验证集)可以大大增加其好处:
首先,针对 prompt
来选择 examples with explanations
比选择 examples alone
提供更大的性能改进。
其次,在一个固定的样本集合上手工调优 explanations
可以提供更大的好处,甚至在具有挑战性的任务上。
虽然性能还远远不够完美,但这些发现表明:explanations
可以改善 few-shot prompting
。
为什么 post-answer explanations
是有趣的: 与一些相关的工作( 《Show your work: Scratch pads for intermediate computation with language models》
、COT
)相比,我们专注于在答案之后提供解释,而不是在答案之前提供 chains of reasoning
。虽然COT
没有观察到 post-answer explanations
的好处,但我们的结果更加 positive
,可能是由于他们的任务需要 more iterative reasoning
的事实。除了这种差异,pre-answer
和 post-answer
的解释模式在测试时也有不同的影响,对模型的 in-context inference
也有不同的科学意义(scientific implications
)。
在测试期间,post-answer explanations
并不影响 evaluation pipeline
,因为模型在产生 explanation
前会产生一个答案。相比之下,pre-answer chains-of-reasoning
需要 pre-answer chains-of-reasoning
从模型输出中解析出答案。为了获得最佳性能,pre-answer reasoning
和 post-answer explanations
可能有互补的、可组合的好处。事实上,《STaR: Bootstrapping reasoning with reasoning》
使用了 post-answer-hint
的 "合理化" 作为他们 bootstrapped training procedure
的一部分。将问题分解成一系列的步骤往往是有用的,但有些 explanations
是整体性的,只有在知道答案后才有意义。
从科学的角度来看,这两种方法代表了模型可以从 explanations
中获益的不同机制:
pre-answer chains of reasoning
可以让模型在回答前输出一个推理过程并逐步处理问题。
相比之下,post-answer explanations
只能通过改变 task inference
,抽象地塑造推理过程。因为在我们所有的 prompt conditions
下,模型在问题和答案之间有同等数量的处理步骤,解释的效果归因于关于模型如何处理问题和可能答案的变化。
因此,explanations
的好处来自于 in-context learning
过程中相当复杂的高阶推理,正如我们接下来讨论的那样。
我们的研究结果对语言模型的 in-context learning
能力有什么暗示:语言模型适应 prompt
的过程是有争议的。例如,《Rethinking the role of demonstrations :What makes in-context learning work?》
提出了一个有趣的观点,即 GPT-3
在普通任务(如 entailment
)上的表现几乎与 prompt
中的随机答案一样好,因此,他们质疑这些模型是否真的在上下文中 "学习"。在我们的 explanations
和 matched controls
之间的比较,使我们能够测试 explanations
的表面特征(superficial features
)是否驱动了它们的好处。
具体而言,other item explanation prompt
包含与 real explanation prompt
相同的句子;explanations
只是与不同的样本进行配对。最大的模型显示,即使相对于这个 closely-matched control
,real explanations
也有明显的优势。事实上,对照组似乎并不比 no explanations
更好。这表明,最大的模型在处理 target question
的答案时,使用了样本和它们相应的 explanations
之间的关系,而不是简单地依赖 prompt
中的单词分布或句子分布。因此,最大的模型似乎确实在上下文中表现出一些相当复杂的高阶推理。
虽然这些观察结果并不排除模型只是利用解释来回忆训练中看到的任务的可能性,但我们使用的 BIG-bench collaboration
任务是对抗性采样从而是独特的、具有挑战性的,这使得这种可能性有点小。一个可能与过去的发现相调和的情况是,模型是 "懒惰的",在模型可以依赖 low-level
特征的时候依赖 low-level
特征,而只在需要 high-level
特征的挑战性环境中使用 high-level
特征(参见《When classifying arguments, bert doesn’t care about word order... except when it matters》
)。然而,要完全解决这些问题,还需要进一步调查。
explanations
与 instructions
的关系如何:虽然之前的工作发现,task instructions
比样本更有效(例如 Metaprompt
),但我们发现,task instructions
的效果比 few-shot examples or explanations
的效果更小。这可能是由于之前的工作在很大程度上执行了 tuning instructions
,从而使 prompts
可以说不是 "zero-shot"
的;也可能与我们评估的任务有关,这些任务是对抗性采样的。具有挑战性的任务可能更难描述,相比较于 explaining with examples
。无论如何,explanations
在不同的 instruction conditions
下提供类似的好处。因此 explanations
与 instructions
可以是互补的。
我们的工作与人类语言处理(human language processing
)有什么关系:由于我们受到人类使用 explanation
的认知工作的启发,并且鉴于积累的证据表明语言模型可以预测大量的 human neural language processing
(《The neural architecture of language: Integrative modeling converges on predictive processing》
、《Shared computational principles for language processing in humans and deep language models》
),自然要问我们的工作是否有认知意义(cognitive implications
)。然而,语言模型和人类都从 explanations
中受益的事实并不意味着他们一定是通过相同的机制受益。事实上,我们观察到的 explanations
的好处比人们对人类的预期好处要小。然而,请注意,我们的许多任务,如评估数学归纳论证(mathematical induction arguments
),对许多人类来说是具有挑战性的,即使 with instructions, examples, and explanations
。
human response
和 model response
之间的差异可能部分源于语言模型的贫乏经验,它们没有经历过语言所指的更广泛的背景或情况。相比之下,human explanations
从根本上说是实用性和交流性的:解释的目的是在特定的对话和背景下传达一种意义。人类为理解 explanations
而进行的推理过程大概是由这种互动经验形成的。因此,在更丰富的互动环境中训练的模型可能从 explanations
中受益更多(《Symbolic behaviour in artificial intelligence》
)。相应地,explanations
可以为未来调查人类和模型语言处理的相似性和差异性提供一个有趣的环境。
我们的研究方法有什么好处:随着研究人员对人工智能表现出的越来越复杂的行为进行研究(《Symbolic behaviour in artificial intelligence》
),我们认为采用行为科学的实验和分析工具将有越来越多的好处。我们特别强调 hierarchical regressions
的价值,它从统计学上说明了数据的依赖性和不同类型的 observed variation
。如果不对这些因素进行建模,就会导致诸如 "stimulus-as-fixed-effect fallacy"
(《The language-as-fixed-effectfallacy: A critique of language statistics in psychological research》
)等问题:将刺激或数据集效应误认为是更普遍的原则。因此,适当的 hierarchical models
对可推广的研究至关重要(《The generalizability crisis》
)。我们鼓励其他研究人员采用这些分析工具。
局限性:
我们使用的数据集有什么好处和坏处:使用 BIG-bench collaboration
的任务,使我们能够在相似的格式中收集一组多样化的、具有挑战性的任务。这些任务涵盖了可能在标准数据集中没有得到很好体现的技能。然而,这些特异的、对抗性采样的任务可能因此不能代表通常应用 language model
的任务。这种差异可能会放大或压制我们的效果。
explanation annotations
:本文的一位作者对这个数据集进行了注释,方法是阅读相应的 BIG-Bench
问题和解决方案,然后尝试写一个解释,帮助人类理解答案。尽管这个过程允许对那些原本可能难以获得注释的任务进行专家注释(例如需要理解数学归纳的任务),但它也有相应的局限性。此外,由于仅有一个作者对解释进行了注释,它们可能是有偏的。
模型和训练:用指令来训练或微调的模型(《Training language models to follow instructions with human feedback》
)可能更受益于 explanations
。事实上,调优一个模型以利用 prompt
中的 explanations
可能会改善结果,这将是未来工作的一个令人兴奋的方向。
此外,添加 explanations
会延长 prompt
,而目前的语言模型通常有一个固定的上下文长度,这限制了可以解释的样本的数量。因此, explanations
在未来的、能处理更长上下文的模型中可能更有用。
explanations
所提供的改进程度:我们强调,虽然包括 answer explanations
会在统计学上带来明显的性能改善,但它不会产生完美的性能或完全鲁棒的行为:事实上,如果不进行 tuning
,好处是不大的。然而,正如大型模型从 explanations
中获益更多一样,我们希望未来的模型将进一步获益;而且 explanations
可以与其他技术相结合,产生更大的改进。
论文:
《Chain of Thought Prompting Elicits Reasoning in Large Language Models》
。
NLP
领域最近被语言模型彻底改变。扩大语言模型的规模已被证明可以带来一系列的好处,比如提高性能和样本效率(sample efficiency
)。然而,事实证明,仅仅扩大模型规模并不足以在诸如算术、常识推理、以及符号推理等具有挑战性的任务中取得高的效果。
我们探讨了如何通过一种简单的方法来解锁大型语言模型的推理能力。我们的方法由两个想法驱动:
首先,用于算术推理的技术可以从自然语言的理由(这些理由导致最终正确答案)中获益。之前的工作通过从头开始训练(《Program induction by rationale generation: Learning to solve and explain algebraic word problems》
)、或微调一个 pretrained model
(《Training verifiers to solve math word problems》
)从而为模型赋予能力来生成自然语言形式的中间步骤;此外还有使用 formal language
代替自然语言的神经符号方法。
其次,大型语言模型提供了令人振奋的前景,即通过 prompting
进行 in-context few-shot learning
。也就是说,与其为每个新的任务微调一个单独的 language model checkpoint
,不如简单地用一些 input-output
示例(这些示例用于阐述任务)来 "prompt"
模型。值得注意的是,这在一系列简单的问答任务中是成功的(GPT-3
)。
然而,上述两种想法都有关键的局限性:
对于rationale-augmented
的 training
和 finetuning
方法来说,创建关于高质量的rationales
的一个大数据集是很昂贵的,这比普通机器学习中使用的简单的 input–output pairs
要复杂得多。
对于 GPT-3
使用的传统的 few-shot prompting
方法,在需要推理能力的任务上效果很差,而且通常不会随着语言模型规模的增加而有实质性的改善(Gohper
)。
在本文中,我们结合了这两种思想的优势从而避免各自的局限性。具体而言,在给定一个 prompt
的条件下,我们探索了语言模型对推理任务进行 few-shot prompting
的能力,其中给定的 prompt
由三要素组成:<input, chain of thought, output>
。chain of thought: COT
是一系列中间的自然语言推理步骤(这些中间步骤导致了最终输出),我们把这种方法称为 chain-of-thought prompting
。下图中显示了一个 prompt
的例子。
我们对算术推理、常识推理、以及符号推理的 benchmark
进行了实证评估,显示 chain-of-thought prompting
优于标准的 prompting
,有时达到惊人的程度。下图展示了这样一个结果:在math word
问题的 GSM8K benchmark
上,使用 PaLM 540B
的 chain-of-thought prompting
比标准 prompting
超出很多,并取得了新的 SOTA
性能。 prompting only
很重要,因为它不需要大量的训练数据集,而且单个 model checkpoint
可以执行许多任务而不损失通用性。这项工作强调了大型语言模型如何通过关于任务的几个示例以及自然语言数据来进行学习(比方说,通过大型训练数据集自动学习 inputs
和 outputs
的基本模式)。
COT
只有在使用100B
参数的模型时才会产生性能提升,这对于中小模型不利。
相关工作:这项工作受到了许多研究领域的启发,我们将在论文的附录 C
中详细介绍。在这里,我们描述两个方向、以及也许是最相关的一些论文。
第一个相关方向是使用中间步骤(intermediate steps
)解决推理问题。
《Program induction by rationale generation: Learning to solve and explain algebraic word problems》
通过一系列中间步骤,率先提出了使用自然语言推理来解决数学应用题的思想。他们的工作与使用 formal language
进行推理的文献形成了鲜明对比。
《Training verifiers to solve math word problems》
扩展了《Program induction by rationale generation: Learning to solve and explain algebraic word problems》
的方法,创建了一个更大的数据集,并使用它来微调 pretrained language model
,而不是从头开始训练模型。
在程序合成(program synthesis
)领域,《Show your work: Scratchpads for intermediate computation with language models》
利用语言模型,通过首先逐行预测中间计算结果从而来预测 Python
程序的最终输出,并表明他们的 step-by-step
预测方法比直接预测最终输出的效果更好。
自然,这篇论文也与最近大量关于 prompting
的工作密切相关。自从 GPT-3
提出的 few-shot prompting
流行以来,一些通用的方法已经提高了模型的 prompting
能力,例如自动学习 prompts
(《The power of scale for parameter-efficient prompt tuning》
)、或给模型描述任务的指令(FLAN
、T0
、《Training language models to follow instructions with human feedback》
)。尽管这些方法改进或增加了 prompt
的输入部分(例如,附加在 inputs
之前的指令),我们的工作采取了用一个正交的方向来 augment
带有 chain of thought
的模型的输出。
在解决复杂的推理任务(如多步骤的 math word
问题)时,考虑一下自己的思维过程。典型的做法是将问题分解成中间步骤,并在给出最终答案之前解决每个中间步骤。例如,After Jane gives 2 flowers to her mom she has 10 ... then after she gives 3 to her dad she will have 7 ... so the answer is 7.
。 本文的目标是赋予语言模型以产生类似的 chain of thought
的能力:一系列连贯的中间推理步骤,从而得出问题的最终答案。我们将证明,对于 few-shot prompting
,如果在范例中提供 chain-of-thought reasoning
的阐述,那么足够大的语言模型可以产生 chains of thought
。
下图显示了一个模型产生 chain of thought
来解决一个 math word
问题的例子,如果没有 chain of thought
则模型就会得到错误的答案。在这种情况下, chain of thought
类似于解决方案,但我们仍然选择将其称为 chain of thought
,以更好地捕获到idea
:它模仿了 step-by-step thought process
从而得出答案。另外,解决方案/解释通常在最终答案之后(而不是在答案之前)。
作为一种促进语言模型推理的方法,chain-of-thought prompting
有几个吸引人的特性:
首先,chain of thought
原则上允许模型将多步骤问题分解为中间步骤,这意味着更多的计算可以被分配给需要更多推理步骤的问题。
第二,chain of thought
为模型的行为提供了一个可解释的窗口,提示它如何得出一个特定的答案,并提供机会来调试推理路径(reasoning path
)出错的地方。尽管完全描述 support an answer
的模型的计算仍然是一个悬而未决的问题。
第三,chain-of-thought reasoning
可用于 math word
问题、常识推理、以及符号操作等任务,并有可能适用于人类通过语言可以解决的任何任务(至少在原则上)。
最后,chain-of-thought reasoning
可以很容易地在足够大的现成语言模型中被激发出来,只需将 chain of thought sequences
的样例纳入 exemplars of few-shot prompting
中即可。
在实证实验中,我们将观察 chain-of-thought prompting
对算术推理(arithmetic reasoning
)、常识推理(commonsense reasoning
)、以及符号推理(symbolic reasoning
)的效果。
我们首先考虑 Figure 1
中形式的 math word
问题,它可以衡量语言模型的算术推理能力。虽然对人类来说很简单,但算术推理是一项语言模型经常陷入困境的任务。令人震惊的是,当与 540B
参数的语言模型一起使用时,chain-of-thought prompting
在几个任务上的表现与特定任务的微调模型相当,甚至在具有挑战性的 GSM8K
基准上达到了新的SOTA
。
benchmark
:GSM8K
、SVAMP
、ASDiv
、AQuA
、MAWPS
。这些都是 math word
问题的数据。一些例子如下表所示。
方法:
standard prompting
:GPT-3
推广的标准的 few-shot prompting
,其中语言模型在测试期间被馈入 in-context exemplars
(input-output pair
)从而得到输出。如 Figure 1
的左图所示。
chain-of-thought prompting
:在 few-shot prompting
中用一个关于答案的 chain of thought
来 augment
每个样例。如 Figur3 1
的右图所示。
由于大多数数据集只有一个 evaluation split
,我们手动组成了八个具有 chains of thought
的 few-shot exemplars
从而用于prompting
。Figure 1
的右图显示了一个 chain of thought exemplar
,所有八个的案例如 Table 20
所示。这些特殊的 exemplars
没有经过 prompt engineering
。
为了研究这种形式的 chain-of-thought prompting
是否能在一系列的 math word
问题上成功地引起推理,我们对所有的基准都使用了这一组八个 chain of thought exemplars
,除了 AQuA
,因为 AQuA
是多选题而不是自由回答。对于AQuA
,我们使用了训练集中的四个样例和解答,如 Table 21
所示。
语言模型:
GPT-3
:我们使用了 text-ada-001
、text-babe-001
、text-curie-001
和 text-davinci-002
,据推测它们对应于InstructGPT
模型的 350M
、1.3B
、6.7B
和 175B
参数。
LaMDA
:该模型有 422M
、2B
、8B
、68B
和 137B
参数。
PaLM
:该模型有 8B
、62B
和 540B
参数。
UL2 20B
。
Codex
:OpenAI API
中为 code-davinci-002
。
我们通过贪心解码从模型中采样。尽管后续工作表明,chain-of-thought prompting
可以通过在许多 sampled generations
中采取 majority final answer
(即,多数投票机制)来改进(《Self-consistency improves chain of thought reasoning in language models》
)。
对于 LaMDA
,我们报告了五个随机种子的平均结果,其中每个种子都有不同的随机混洗的 exemplars
顺序。由于 LaMDA
的实验没有显示出不同种子之间的巨大差异,为了节省计算量,我们报告了所有其他模型的 single exemplar order
(即,采用了固定的顺序)的结果。
结果:Figure 4
总结了 chain-of-thought prompting
的最强结果,Table 2
展示了每个 model collection
、模型大小、以及 benchmark
上的所有结果。
首先,Figure 4
显示,chain-of-thought prompting
是模型规模的一种涌现能力(emergent ability
)(《Emergent abilities of large language models》
)。也就是说,chain-of-thought prompting
对小模型的性能没有积极影响,只有在使用 100B
参数的模型时才会产生性能提升。我们定性地发现,较小规模的模型产生了流畅的但不合逻辑的 chains of thought
,导致了比 standard prompting
更低的性能。
其次,chain-of-thought prompting
对于更复杂的问题有更大的性能提升。例如:
对于 GSM8K
(具有最低的 baseline
性能的数据集), GPT-3 175B
和 PaLM 540B
模型的性能提高了一倍以上。
另一方面,对于 SingleOp
( MAWPS
中最简单的子集,只需要一个步骤就能解决),性能的提高要么是负数,要么是非常小,如 Table 3
所示。
第三,通过 GPT-3 175B
和 PaLM 540B
进行的 chain-of-thought prompting
与之前的 SOTA
相比更胜一筹,后者通常在 labeled training dataset
上对特定任务的模型进行微调。Figure 4
显示了 PaLM 540B
是如何使用 chain-of-thought prompting
在 GSM8K
、SVAMP
和 MAWPS
上达到新的 SOTA
的(不过请注意,standard prompting
已经超过了 SVAMP
的现有最佳水平)。在另外两个数据集上,即 AQuA
和 ASDiv
,采用 chain-of-thought prompting
的 PaLM 540B
达到了 SOTA
的2%
差距以内(参考 Table 2
)。
为了更好地理解为什么 chain-of-thought prompting
有效,我们通过 LaMDA 137B
对 GSM8K
手动检查了模型生成的 chains of thought
。在模型返回正确的最终答案的 50
个随机例子中,除了两个巧合得出正确答案的例子外,所有生成的 chains of thought
在逻辑上和数学上也都是正确的(见论文附录 D.1
,Table 8
给出了正确的模型生成的 chains of thought
的例子)。
我们还随机检查了模型给出错误答案的 50
个随机例子。这个分析的结论是:
46%
的 chains of thought
几乎是正确的,除了一些小错误(calculator error
、symbol mapping error
、或缺少一个推理步骤)。
其他 54%
的 chains of thought
在语义理解或语义连贯性方面有重大错误(见论文附录 D.2
)。
为了略微了解为什么 scaling
能提高 chain-of-thought
的推理能力,我们对 PaLM 62B
所犯的错误进行了类似的分析,以及这些错误是否通过 scale
到 PaLM 540B
而得到修复。结论是:将 PaLM
扩展到 540B
可以修复 62B
模型中很大一部分的 one-step missing error
和语义理解错误(见附录 A.1
,以及图 Figure 9
所示)。
消融研究:鉴于使用 chain-of-thought prompting
所观察到的好处,一个自然的问题是:即是否可以通过其他类型的 prompting
来实现同样的性能改进。Figure 5
显示了一个消融研究,有三种不同的chain of thought
变体,如下所述。
只有方程(equation
):chain-of-thought prompting
可能有帮助的一个原因是它产生了待评估的数学方程,因此我们测试了一个变体,即模型在给出答案前只被提示从而输出一个数学方程。
Figure 5
显示,equation only prompting
对 GSM8K
的帮助不大,这意味着 GSM8K
中问题的语义太有挑战性,如果没有 chain of thought
中的自然语言推理步骤,就不能直接转化为方程。
然而,对于只有一步或两步的问题的数据集,我们发现 equation only prompting
确实提高了性能,因为方程可以很容易地从问题中得出(如 Table 6
所示)。
仅仅包含可变的计算:另一个直觉是,chain of thought
允许模型在更难的问题上花费更多的计算(即 intermediate tokens
)。为了从 chain-of-thought reasoning
中分离出可变的计算( variable computation
)的影响,我们测试了一种配置:在这种配置中,模型被提示输出关于 "."
的一个序列("..."
),其数量等于解决问题所需的方程中的字符数。这个变体的表现与 baseline
差不多,这表明可变的计算本身并不是 chain-of-thought prompting
成功的原因,而且通过自然语言来表达 intermediate steps
似乎也有好处。
答案之后的 chain of thought
:chain-of-thought prompting
的另一个潜在好处可能仅仅是,这种 prompts
允许模型更好地获取在预训练中获得的相关知识。因此,我们测试了另一种配置,即 chain of thought prompt
只在答案之后给出,以隔离模型是否真正依赖于所产生的 chain of thought
来给出最终答案。这个变体的表现与 baseline
差不多,这表明 chain of thought
中体现的串行推理( sequential reasoning
)除了激活知识外,还有其他的作用。
《Can language models learn from explanations in context?》
采用了Reasoning after answer
的方案,并表明该方案要比标准的prompting
更好。与这里的结论矛盾。
《Can language models learn from explanations in context?》
的解释是:任务的不同。
Chain of Thought
的鲁棒性:对 exemplars
的敏感性是 prompting
方法的一个关键考虑因素。例如,改变 few-shot exemplars
的排列组合可以使 GPT-3
在 SST-2
上的准确率从接近随机( 54.3%
)到接近 SOTA
( 93.4%
)(《Calibrate before use: Improving few-shot performance of language models》
)。在这里,我们评估了对不同标注员所写的 chains of thought
的鲁棒性。除了上述使用 Annotator A
编写的 chains of thought
的结果外,本文的另外两位合著者(Annotators B and C
)也为相同的 few-shot exemplars
独立编写了 chains of thought
(见 Table 29, 30
)。Annotator A
还按照 《Training verifiers to solve math word problems》
给出的解决方案的风格,写出了另一条比原来的更简洁的 chain of thought
。
下图显示了 GSM8K
和 MAWPS
上 LaMDA 137B
的这些结果(其他数据集的消融结果见 Table 6, Table 7
)。尽管不同的 chain of thought annotations
之间存在方差,正如在使用 exemplar-based prompting
时所预期的那样,所有的 chain-of-thought prompts
都比 standard baseline
的表现要好很多。这一结果意味着,成功使用 chain-of-thought
并不取决于特定的语言风格。
为了证实成功的 chain-of-thought prompting
对其他 exemplars
的作用,我们还用从 GSM8K
训练集随机抽取的三组 eight exemplars
进行了实验,这是一个独立的数据源(这个数据集中的样本已经包括了像 chain of thought
一样的推理步骤)。 Figure 6
显示,这些 prompts
的表现与我们手动编写的样例相当,也大大超过了 standard prompting
的表现。
除了对标注员、独立编写的chains of thought
、不同样例、以及各种语言模型的鲁棒性之外,我们还发现,chain-of-thought prompting
对算术推理的不同的exemplar orders
、以及不同的样例数量(如 Table 6
所示)都很鲁棒。
虽然 chain of thought
特别适用于 math word
问题,但 chain of thought
的基于语言的性质实际上使其适用于一类广泛的常识推理问题,这些问题涉及在通用背景知识的假设下,对物理和人类交互进行推理。常识推理(commonsense reasoning
)是与世界交互的关键,但目前的自然语言理解系统仍无法做到。
benchmark
:五个涵盖不同的常识推理类型的数据集。
CSQA
:流行的常识推理数据集,它提出了关于世界的常识性问题,涉及复杂的语义,通常需要先验知识。
StrategyQA
:要求模型推断出一个 multi-hop strategy
来回答问题。
我们从 BIG-bench
的工作中选择了两个专门的评价集:
Date Understanding
:涉及从给定的上下文中推断出一个日期。
Sports Understanding
:涉及确定一个与体育有关的句子是可信的还是不可信的。
SayCan
:涉及将自然语言指令映射到离散集的(discrete set
)的机器人动作序列中。
下图显示了所有数据集中带有 chain of thought annotations
的例子。
Prompts
:我们遵循与上一节相同的实验设置。
对于 CSQA
和 StrategyQA
,我们从训练集中随机选择了一些样本,并为它们手动组成了 chains of thought
,以作为 few-shot exemplars
。
两个 BIG-bench
任务没有训练集,所以我们在评估集中选择了开头的十个样本作为 few-shot exemplars
,并报告了评估集的其余部分的结果。
对于 SayCan
,我们使用了 《Do as I can, not as I say: Grounding language in robotic affordances》
使用的训练集中的六个样本,同时也使用了手动组成的 chains of thought
。
结果:下图展示了 PaLM
的这些结果( LaMDA
、GPT-3
和不同模型比例的完整结果见 Table 4
)。可以看到:
对于所有的任务,扩大模型的规模提高了 standard prompting
的性能。
chain-of-thought prompting
导致了进一步的收益,对 PaLM 540B
似乎获得了最大的改进。通过 chain-of-thought prompting
,PaLM 540B
取得了相对于 baseline
的强大性能,在 StrategyQA
方面超过了之前的 SOTA
(75.6% vs 69.4%
),在 sports understanding
方面超过了无辅助的体育爱好者(95.4% vs 84%
)。
这些结果表明,chain-of-thought prompting
也能提高需要一系列常识性推理能力的任务的表现(尽管注意到在 CSQA
获得了小的增益)。
我们最后的实验评估考虑了符号推理(symbolic reasoning
),这对人类来说很简单,但对语言模型来说有潜在的挑战性。我们表明,chain-of-thought prompting
不仅使语言模型能够完成在 standard prompting setting
下具有挑战性的符号推理任务,而且还能促进 length
泛化到比见过的 few-shot exemplars
更长。
任务:两个 toy
任务:
最后一个字母的拼接:这个任务要求模型将一个姓名中的最后一个字母连接起来(例如,"Amy Brown" -> "yn"
)。我们通过随机组合姓名普查数据(https://namecensus.com/
)中前一千名的名字和姓氏来产生全名。
硬币翻转:这项任务要求模型回答,在人们投掷或不投掷硬币之后,硬币是否仍然是正面朝上(例如,"A coin is heads up. Phoebe flips the coin. Osvaldo does not flip the coin. Is the coin still heads up?" -> "no"
)。
由于这些符号推理任务的构造是 well-defined
,对于每个任务,我们都考虑了一个 in-domain
测试集,其中样本的 step
数与 training/few-shot exemplars
相同;还有一个 out-of-domain: OOD
测试集,其中评估的样本比training/few-shot exemplars
中的步骤更多。
我们的实验设置使用与前两节相同的方法和模型。我们再次为每项任务的 few-shot exemplars
手动组成 chains of thought
,如 Figure 3
所示。
结果:PaLM
的这些 in-domain
和 OOD
评估结果见下图所示,LaMDA
的结果见 Table 5
。
对于 PaLM 540B
, chain-of-thought prompting
导致了几乎 100%
的解决率(注意,standard prompting
已经解决了PaLM 540
的硬币翻转问题,尽管 LaMDA 137B
没有)。
请注意,这些 in-domain
评估是 " toy
任务",因为完美的解决结构已经由 few-shot exemplars
中的 chains-of-thought
提供;模型所要做的就是用测试期间的样本中的新符号重复同样的步骤。
然而,小模型还是失败了:只有在 100B
的模型参数规模下,才会出现对这三个任务的 unseen symbols
进行抽象操作的能力。
至于 OOD
评估,standard prompting
对这两项任务都失败了。通过 chain-of-thought prompting
,语言模型实现了向上的scaling
曲线(尽管性能低于 in-domain setting
)。因此,chain-of-thought prompting
促进了长度泛化,对于足够规模的语言模型。
我们已经探索了 chain-of-thought prompting
作为一种简单的机制来激发大型语言模型中的多步骤的推理行为。
我们首先看到,chain-of-thought prompting
在算术推理上有很大程度的改进,产生的改进比消融实验强得多,而且对不同的标注员、范例、以及语言模型都很鲁棒。
接下来,关于常识推理的实验强调了 chain-of-thought reasoning
的语言性质如何使其普遍适用。
最后,我们表明,对于符号推理,chain-of-thought prompting
有助于 OOD
泛化到更长的序列长度。
在所有的实验中,chain-of-thought reasoning
只是通过提示一个现成的语言模型来引起的。在撰写本文的过程中,没有对语言模型进行微调。
作为模型 scale
的结果,chain-of-thought reasoning
的涌现一直是一个普遍的主题。对于许多推理任务来说,standard prompting
有一个平坦的比例曲线,而 chain-of-thought prompting
会导致 scaling
曲线急剧增加。chain-of-thought prompting
似乎扩大了大型语言模型可以成功执行的任务集合:换句话说,我们的工作强调了 standard prompting
只为大型语言模型的能力提供了一个下限。这一观察很可能提出了更多的问题,例如,随着模型规模的进一步扩大,我们还能期望推理能力有多大的提高?哪些其他的 prompting
方法可以扩大语言模型所能解决的任务范围?
局限性:
我们首先限定,尽管 chain-of-thought
模仿了人类推理者的思维过程,但这并没有回答神经网络是否真的在 "推理",我们将其作为一个开放性问题。
第二,尽管在 few-shot setting
下,手动地 agument
具有 chains of thought
的样例的成本很低;但在微调的场景下,这种标注成本可能是令人望而却步的(尽管这有可能通过 synthetic data generation
、或者 zero-shot generalization
来克服)。
第三,不能保证推理路径的正确性。改进语言模型的 factual generation
是未来工作的一个开放方向。
最后,chain-of-thought reasoning
的涌现仅仅发生在大模型中,使得它在现实世界的应用中 serve
成本很高。进一步的研究可以探索如何在较小的模型中诱发推理。
论文:
《Self-Consistency Improves Chain of Thought Reasoning in Language Models》
尽管语言模型在一系列 NLP
任务中表现出了显著的成功,但它们的推理能力往往受到限制,而这个限制不能仅仅通过增加模型规模来克服。为了解决这一不足, 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
提出了 chain-of-thought prompting
,即提示语言模型生成一系列短句,模仿一个人在解决一个任务时可能采用的推理过程。例如,给定问题: "如果停车场有 3
辆车,还有 2
辆车到达,那么停车场有多少辆车?"。语言模型不是直接回答 "5"
,而是被提示用整个 chain-of-thought
来回答: "停车场里已经有 3
辆车了。还有 2
辆到达。现在有 3+2=5
辆车。答案是 5
"。据观察,在各种多步骤推理任务中,chain-of-thought prompting
能显著提高模型性能。
在本文中,我们引入了一种新的解码策略,称为自一致性(self-consistency
),以取代 chain-of-thought prompting
中使用的贪婪解码策略。self-consistency
策略进一步地大幅度提高了语言模型的推理性能。自一致性利用了这样的直觉:复杂的推理任务通常有多条推理路径可以达到正确答案(《Individual differences in reasoning: Implications for the rationality debate?》
)。一个问题越是需要深思熟虑和分析(《Intuition and reasoning: A dual-process perspective》
),就有越多样化的推理路径来找到答案。
下图用一个例子说明了 self-consistency
方法。我们首先用 chain-of-thought prompting
来提示语言模型,然后不是贪婪地解码最佳推理路径,而是提出一个 "sample-and-marginalize"
的解码程序:
我们首先从语言模型的解码器中采样,以产生一组不同的推理路径。
每个推理路径可能导致一个不同的最终答案,因此我们通过边际化( marginalizing
)所采样到的推理路径,从而在 final answer set
中找到最一致的答案从而作为最佳答案。
这样的方法类似于人类的经验,即如果多种不同的思考方式导致了相同的答案,那么人们对最终答案的正确性就有更大的信心。与其他解码方法相比,self-consistency
避免了困扰贪婪解码的重复性和局部最优性等问题,同时缓解了单个 sampled generation
的随机性。
这种方法要求答案是确定的、唯一的。对于开放式的问题(如,抽取一篇文章的摘要),那么无法应用这个方法。
self-consistency
比之前的方法简单得多,这些方法要么训练一个额外的 verifier
(《Training verifiers to solve math word problems》
),要么在给定额外的人类标注的情况下训练一个 re-ranker
以提高 generation
的质量(《Lamda: Language models for dialog applications》
)。相反,self-consistency
是完全无监督的,与 pre-trained language model
一起现成工作,不需要额外的人类标注,并避免任何额外的训练、辅助模型或微调。self-consistency
也不同于典型的 ensemble
方法(在 ensemble
方法中,多个模型被训练,并且每个模型的输出被汇总起来),它更像一个 "self-ensemble"
,在单个的语言模型之上工作。
我们在广泛的算术推理任务和常识推理任务上对四种不同规模的语言模型评估了 self-consistency
:公共的 UL2-20B
、GPT-3-175B
、LaMDA-137B
、PaLM-540B
。在所有四个语言模型上, self-consistency
在所有任务中都比 chain-of-thought prompting
有明显的改善。具体而言,当与 PaLM-540B
或 GPT-3
一起使用时, self-consistency
在算术推理任务中达到了 SOTA
,包括 GSM8K
(+17.9%
的绝对准确率提升)、SVAMP
(+11.0%
的绝对准确率提升)、AQuA
(+12.2%
的绝对准确率提升),以及诸如 StrategyQA
(+6.4%
的绝对准确率提升)和 ARCchallenge
(+3.9%
的绝对准确率提升)等常识推理任务。在额外的实验中,我们显示 self-consistency
可以有力地提高 NLP
任务的性能,在这些任务中,与 standard prompting
相比,添加 chain-of-thought
可能会损害性能(《The unreliability of explanations in few-shot prompting for textual reasoning》
)。我们还表明, self-consistency
明显优于 sample-and-rank
、beam search
、ensemble-based
方法,并且对采样策略和 imperfect prompts
具有鲁棒性。
相关工作:
语言模型的reasoning
:众所周知,语言模型在推理任务中很吃力,如算术推理、逻辑推理和常识推理(《Intuition and reasoning: A dual-process perspective》
)。之前的工作主要集中在改善推理的专用方法上。与之前的工作相比,self-consistency
适用于广泛的推理任务,不需要任何额外的监督或微调,同时还能大幅提高 《Chain of thought prompting elicits reasoning in large language models》
提出的 chain-of-thought prompting
方法的性能。
语言模型中的 sampling and re-ranking
:
文献中提出了多种语言模型的解码策略,例如 temperature sampling
、top-k sampling
、nucleus sampling
、minimum Bayes risk decoding
以及 typical decoding
。其他的一些工作试图显式地促进解码过程中的多样性。
re-ranking
是提高语言模型的 generation quality
的另一种常见方法。
《Lamda: Language models for dialog applications》
收集额外的人类标注来训练一个 re-ranker
用于 response filtering
。
《Training verifiers to solve math word problems》
训练一个 "verifier"
来 re-rank
所生成的解决方案。与仅仅微调语言模型相比,这大大提高了数学任务的求解率。
《Measuring and improving consistency in pretrained language models》
通过用额外的 consistency loss
来扩展预训练,提高了 factual knowledge extraction
的一致性。
所有这些方法都需要训练一个额外的re-ranker
、或收集额外的人类标注,而 self-consistency
不需要额外的训练、微调、或额外的数据收集。
抽取 reasoning path
:以前的一些工作考虑了特定的方法从而用于识别推理路径( reasoning path
),例如:
构建 semantic graph
(《Exploiting reasoning chains for multi-hop science question answering》
)。
学习 RNN
来检索维基百科图上的推理路径(《Learning to retrieve reasoning paths over wikipedia graph for question answering》
)。
用人类标注的推理路径对数学问题进行微调(《Training verifiers to solve math word problems》
)。
或者用基于启发式的伪推理路径训练一个extractor
(《Multi-hop question answering via reasoning chains》
)。
最近,推理过程中多样性的重要性已经被注意到,但只是通过 task-specific training
来利用,或者通过在所提取的推理路径上应用额外 QA
模型(《Multi-hop question answering via reasoning chains》
),或者通过在 commonsense knowledge graph
中引入潜在变量(《Diversifying content generation for commonsense reasoning with mixture of knowledge graph experts》
)。
与这些方法相比,self-consistency
要简单得多,不需要额外的训练。我们提出的方法只是将推理路径的generation
与解码器的采样结合起来,利用聚合来找到最一致的答案,无需额外的模块。
语言模型的 consistency
:之前的一些工作表明,语言模型在对话(《Towards a human-like open-domain chatbot》
)、explanation generation
(《Make up your mind! adversarial generation of inconsistent natural language explanations》
)和 factual knowledge
提取(《Measuring and improving consistency in pretrained language models》
)中会出现不一致的问题。
《Consistency of a recurrent language model with respect to incomplete decoding》
用 "consistency"
来指在recurrent language model
中生成一个无限长的序列。
《Improving coherence and consistency in neural sequence models with dual-system, neuro-symbolic reasoning》
通过增加一个受 System-2
启发的逻辑推理模块,改善了 System 1
模型的样本的逻辑一致性。
在本文中,我们关注的是一个稍微不同的"consistency"
概念,即利用不同推理路径之间的答案一致性来提高准确率。
人类的一个突出方面是,人们的思维方式不同。我们很自然地认为,在需要深思熟虑的任务中,很可能有几种方法来解决这个问题。我们提出,这样的过程可以通过语言模型解码器的sampling
在语言模型中进行模拟。例如,如 Figure 1
所示,一个模型可以对一个数学问题产生几个貌似合理的回答,而这些回答都能得出相同的正确答案(第一个输出和第三个输出)。由于语言模型不是完美的reasoner
,模型也可能产生一个不正确的推理路径、或在其中一个推理步骤中犯错(例如在第二个输出),但这种解决方案不太可能得出相同的答案。也就是说,我们假设正确的推理过程(即使它们是多样化的),往往比不正确的推理过程在最终答案上有更大的一致性。
我们通过提出以下 self-consistency
方法来利用这一直觉:
首先,一个语言模型通过一组人工编写的 chain-of-thought exemplars
来被提示。
接下来,我们从语言模型的解码器中采样一组候选输出,生成一组多样化的候选推理路径。self-consistency
与大多数现有的采样算法兼容,包括temperature sampling
、top-k sampling
、以及 nucleus sampling
。
最后,我们通过 marginalizing out
被抽样的推理路径,并从 generated answers
中选择最一致的答案来汇总答案。
更具体而言:假设被生成的答案 prompt
和一个问题,self-consistency
引入一个额外的潜在变量 tokens
序列,然后组合得到
作为一个例子,考虑 Figure 1
中的第三个输出:前几句 "She eats 3 for breakfast ... So she has 9 eggs * $2 = $18."
构成了 "The answer is $18"
)中的答案 18
被解析为 self-consistency
通过对 majority vote
),即
在下表中,我们展示了通过使用不同的答案聚合策略对一组推理任务的 test accuracy
。除了多数投票,我们还可以在汇总答案时用 (prompt, question)
的条件下模型生成 GPT-3
),即:
其中:token
为条件的情况下生成第 token
tokens
的总数。
在下表中,我们显示,采取 "unweighted sum"
,即直接对 "normalized weighted sum"
的结果非常相似。我们仔细观察了模型的输出概率,发现这是因为对于每个 generations
视为 "similarly likely"
。
此外,当汇总答案时,下表中的结果显示,与未归一化的方法相比,"归一化"的加权和产生了更高的准确率。为了完整起见,在下表中我们还报告了采取 "加权平均" 的结果,即每个
下图中没有给出
Unweighted avg
,因为Unweighted avg
就是等价于Unweighted sum
。
self-consistency
在开放式文本生成、以及有固定答案的最佳文本生成之间探索了一个有趣的空间。推理任务通常有固定的答案,这就是为什么研究人员普遍考虑贪婪的解码方法。然而,我们发现,即使预期的答案是固定的,在推理过程中引入多样性也是非常有益的;因此,我们利用采样来实现这一目标。应该注意的是,self-consistency
只适用于最终答案来自固定答案集合的问题,但原则上,如果能在多个 generations
之间定义一个良好的一致性指标(例如,两个答案是否一致或相互矛盾),这种方法可以扩展到开放式文本生成问题。
任务和数据集:考虑如下的 reasoning benchmark
:
算术推理: Math Word Problem Repository
(包括 AddSub, MultiArith, ASDiv
)、AQUA-RAT
、GSM8K
、SVAMP
。
常识推理:CommonsenseQA
、StrategyQA
、AI2 Reasoning Challenge: ARC
。
符号推理:
last letter concatenation
:,例如,输入是 "Elon Musk"
、输出应该是 "nk"
。
来自 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
的Coinflip
:一枚硬币是正面朝上的,经过若干次翻转之后,硬币是否还是正面朝上?
语言模型和 prompts
:
UL2
:一个具有 20B
参数的 encoder-decoder
模型,在 a mixture of denoisers
上训练。UL2
是完全开源的,在zero-shot SuperGLUE
上具有比 GPT-3
类似的或更好的性能,只有 20B
参数因此更便于计算。
GPT-3
:有 175B
参数。我们使用 Codex
系列中的两个公共引擎 code-davinci-001
和 code-davinci-002
来帮助 reproducibility
。
LaMDA-137B
:一个稠密的从左到右的、decoder-only
的语言模型,有 137B
参数,在网络文档、对话数据、以及维基百科的混合体上进行预训练。
PaLM-540B
:一个稠密的从左到右的 decoder-only
语言模型,有 540B
参数,在一个由 780B tokens
组成的高质量语料库上进行了预训练,其中包括过滤后的网页、书籍、维基百科、新闻文章、源代码、以及社交媒体对话。
我们在 few-shot setting
下进行所有的实验,没有训练或微调语言模型。为了进行公平的比较,我们使用了与 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
相同的 prompts
:
对于所有的算术推理任务,我们使用相同的 8
个手动编写的 exemplars
组成的集合。
对于每个常识推理任务,我们从训练集中随机选择 4-7
个样例,并使用手动编写的 chain-of-thought prompts
。
所有 prompts
的全部细节,如下表所示。
采样方案:为了采样不同的推理路径,我们采用了与 GPT-3
、《The curious case of neural text degeneration》
建议的类似设置,用于 open-text generation
。具体而言:
对于 UL2-20B
和 LaMDA-137B
,我们应用了 T=0.5
的 temperature sampling
,并在概率最高的 top-k (k=40) tokens
处截断。
对于 PaLM-540B
,我们应用了 T=0.7, k=40
。
而对于 GPT-3
,我们使用 T=0.7
,没有 top-k
截断。
我们在后续章节中提供了一个消融研究,以表明 self-consistency
对采样策略和超参数通常是鲁棒的。
我们报告了 10
次运行中的 self-consistency
的结果,在每次运行中,我们从解码器的中独立采样了 40
个输出。我们比较的 baseline
是带有贪婪解码的chain-of-thought prompting
,被称为 CoT-prompting
。
算术推理:如下表所示,self-consistency
在所有四个语言模型中的算术推理性能都比 chain-of-thought prompting
有明显提高。更令人惊讶的是,当语言模型的规模增加时,收益变得更加显著,例如,我们看到 UL2-20B
的绝对准确率提高了+3% ~ 6%
,但 LaMDA- 137B
和 GPT-3
则提高了 +9% ~ 23%
。
对于在大多数任务上已经取得高准确率的大型模型(如 GPT-3, PaLM-540B
),在 AQuA
和 GSM8K
等任务上,self-consistency
仍然贡献了显著的额外收益(绝对准确率 +12% ~ 18%
)。通过 self-consistency
,我们在几乎所有的任务上都取得了SOTA
结果: self-consistency
是无监督的、且是任务无关的,这些结果与现有的方法(其中现有的方法需要 task-specific training
、或者需要用成千上万个样本进行微调)相比更有优势。
常识推理和符号推理:Table 3
显示了常识推理和符号推理任务的结果。同样,self-consistency
在所有四个语言模型中都产生了很大的收益,并在 6
个任务中的 5
个任务中获得了 SOTA
结果。
对于符号推理,我们测试了out-of-distribution:OOD setting
,其中 input prompt
包含 2-letters
或 2-flips
的例子,但我们测试了 4-letters
和 4-flips
的例子(这种设置更具挑战性,因为 PaLM-540B
或 GPT-3
已经可以实现完美的· in-distribution
准确率)。在这种具有挑战性的 OOD setting
中,与具有足够模型规模的 CoT-prompting
相比,self-consistency
的收益仍然相当可观。
为了显示所采样到的推理路径数量的影响,我们在下图中绘制了关于不同sampled paths
的数量(1, 5, 10, 20, 40
)的准确率(10
次运行的均值和标准差)。结果显示,采样更多数量的推理路径(如 40
个)会带来持续更好的性能,进一步强调了在推理路径中引入多样性的重要性。在 Table 4
中,我们用两个任务中的几个样本表明,与贪婪解码相比,self-consistency
产生了一个更丰富的推理路径集合。
然而,采样更多的推理路径,需要花费的成本也更高:
40
个推理路径带来40
倍的推理成本。
《The unreliability of explanations in few-shot prompting for textual reasoning》
表明:在 few-shot in-context learning
中,与 standard prompting
相比,有时 chain-of-thought prompting
可能会损害性能。在这里,我们在一组常见的NLP
任务中利用 self-consistency
进行了一项研究,看看它是否可以帮助弥补这个 gap
。这些任务包括:
闭卷问答任务:BoolQ
、HotpotQA
。
自然语言推理任务:e-SNLI
、ANLI
、RTE
。
PaLM-540B
上的结果如下表所示。对于一些任务(如 ANLI-R1
、e-SNLI
、RTE
),与 standard prompting
相比,添加 chain-of-thought
确实会损害性能,但 self-consistency
能够鲁棒地提升性能并超过 standard prompting
,使其成为 few-shot in-context learning
中添加 rationales
的可靠方法从而用于常见的 NLP
任务。
我们进行了一系列额外的研究,并表明 self-consistency
明显优于现有的方法,包括 sample-and-rank
、beam search
和 ensemble-based
的方法。
与 Sample-and-Rank
方法的比较:一种常用的提高 generation quality
的方法是 sample-and-rank
,即从解码器中采样多个序列,然后根据每个序列的对数概率进行排序(《Towards a human-like open-domain chatbot》
)。我们在 GPT-3 code-davinci-001
上比较了 self-consistency
与 sample-and-rank
,方法是从解码器中采样出与 self-consistency
相同数量的序列,并从排名靠前的序列中获取最终答案。结果如下图所示。虽然 sample-and-rank
通过额外的 sampled sequences
和 ranking
,确实提高了准确率,但与self-consistency
相比,其增益要小得多。
与 Beam Search
的比较:在下表中,我们在 UL2-20B
上将 self-consistency
与 beam search decoding
进行了比较。为了进行公平的比较,我们报告了在相同数量的 beams
和推理路径下的准确率。在这两项任务中,self-consistency
都明显优于 beam search
。注意 self-consistency
也可以采用 beam search
来解码每个推理路径(结果显示为 "Self-consistency using beam search"
),但其性能比 self-consistency with sampling
要更差。原因是 beam search
产生的输出的多样性较低(《Mutual information and diverse decoding improve neural machine translation》
);而在 self-consistency
中,推理路径的多样性是取得更好性能的关键。
与 Ensemble-based
方法的比较:我们进一步将 self-consistency
与 ensemble-based
方法进行比较,从而用于 few-shot learning
。具体而言,我们考虑通过以下方式进行 ensembling
:
prompt order permutation
:我们将 prompt
中的示例随机排列 40
次,以缓解模型对 prompt order
的敏感性。
multiple sets of prompts
(《Making pre-trained language models better few-shot learners》
):我们手动编写 3
组不同的prompts
。
我们在这两种方法中对贪婪解码的答案采取多数投票,作为一个 ensemble
。下表显示,与 self-consistency
相比,现有的 ensemble-based
方法取得的收益要小得多。
此外,请注意,self-consistency
不同于典型的 model-ensemble
方法:
在 model-ensemble
方法中,多个模型被训练,它们的输出被汇总。
self-consistency
的作用更像是在单个语言模型之上的 "self-ensemble"
。
我们在附录A.1.3
中额外展示了 ensembling multiple models
的结果,其中 model-ensembles
的表现比 self-consistency
差很多。
理论上讲,多个
prompts
也能提供多样性,同一组prompts
的不同排列也能提供多样性。读者猜测:除了多样性之外,还需要强调一致性。Self-Consistency
是在同一个模型的同一组prompts
的同一个排列上进行的,因此一致性更好。
我们进行了一些额外的实验来分析 self-consistency
方法的不同方面,包括它对采样策略和超参数的鲁棒性,以及它在 imperfect prompts
和 non-natural-language
推理路径下是如何工作的。
Self-Consistency
对采样策略和 scaling
的鲁棒性:在 PaLM-540B
上,我们通过改变 temperature sampling
中的 top-k sampling
中的 nucleus sampling
中的 self-consistency
对采样策略和超参数是鲁棒的,如左图所示。
右图显示,self-consistency
有力地提高了 LaMDA-137B
模型系列在所有规模上的性能。由于某些能力(如算术)只有在模型达到足够的规模时才会出现,因此较小的模型的增益相对较低。
这里面的温度仍然较小,使得输出分布与均匀分布较远。如果温度超参数设置很大,那么输出分布就是均匀分布,最终结果很可能较差。
Self-Consistency
改善了 Imperfect Prompts
的鲁棒性:对于使用人工构建 prompts
的 few-shot learning
,人类标注员在创建 prompts
时有时会犯一些小错误。我们进一步研究了 self-consistency
是否有助于提高语言模型对 imperfect prompts
的鲁棒性。我们在下表中显示了结果:虽然 imperfect prompts
降低了贪婪解码的准确率(17.1 -> 14.9
),但 self-consistency
可以填补 gap
并有力地改善结果。
此外,我们发现 consistency
(就与 final aggregated answer
一致的 decodes
的百分比而言)与准确率高度相关(如下图所示,在 GSM8K
上)。这表明,人们可以使用 consistency
作为一个指标来估计模型的置信度。即,self-consistency
赋予了模型 "知道自己不知道" 的某种能力。
即,如果多个采样之间的一致性较低,那么可以认为模型结果的置信度较低。
这个可以推广到
generation
任务:如果多个generation
结果之间的相似度较低,那么置信度较低。相似度可以通过单词重叠的比例来衡量。
Self-Consistency
适用于 Non-Natural-Language
推理路径、以及 Zero-shot CoT
:我们还测试了 self-consistency
概念对其他形式的 intermediate reasoning
的通用性,如方程式:例如,从 "There are 3 cars in the parking lot already. 2 more arrive. Now there are 3 + 2 = 5 cars."
, 到 "3+2=5"
)。
结果显示在 Table 8
中("Prompt with equations"
):self-consistency
仍然通过生成中间方程来提高准确性;然而,与生成自然语言的推理路径相比,收益要小一些,因为方程要短得多,在解码过程中产生多样性的机会也少。
此外,我们测试了 self-consistency with zero-shot chain-of-thought
(《Large language models are zero-shot reasoners》
),并显示 self-consistency
对 zero-shot CoT
也有效,并显著提高了结果(+26.2%
)。
self-consistency
的一个局限性是它会产生更多的计算成本。在实践中,人们可以尝试少量的路径(如 5
个或 10
个)作为起点,以实现大部分的收益,同时不产生太多的成本,因为在大多数情况下,性能很快就饱和了(Figure 2
)。
作为未来工作的一部分,人们可以使用 self-consistency
来产生更好的监督数据来微调模型,这样在微调之后,模型单次推理运行中就可以给出更准确的预测。
此外,我们观察到,语言模型有时会产生不正确或无意义的推理路径(例如,Table 4
中的 StrategyQA
例子,两个 population number
并不完全正确),需要进一步的工作来更好地支持模型的 rationale generation
。
论文:
《Large Language Models are Zero-Shot Reasoners》
scaling up
语言模型的规模是最近自然语言处理的革命的关键因素。大型语言模型的成功往往归功于 few-shot learning
或 zero-shot learning
。它可以通过简单地对少数样本(few-shot learning
)、或描述任务的指令(zero-shot learning
)作为模型的条件输入来解决各种任务。调节语言模型的方法被称为 "prompting"
(《Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing》
)。手动地或自动地设计 prompts
已成为NLP
的一个热门话题。
与 LLM
在直观的和单步的 system-1
任务中的出色表现相比,其中具有 task-specific few-shot/zero-shot prompting
,即使是100B
或更多参数规模的语言模型在需要缓慢和多步推理的 system-2
任务中也曾陷入困境(《Scaling language models: Methods, analysis & insights from training gopher》
)。为了解决这一缺陷,COT
、Self-Consistency COT
提出了 chain of thought: COT prompting
,其中 COT prompting
为 LLM
提供 step-by-step reasoning examples
,而不是标准的 question and answer examples
(如下图 Figure 1(a)
所示)。这样的 chain of thought demonstrations
有助于模型生成一个推理路径(reasoning path
),该推理路径将复杂的推理分解成多个简单的步骤。值得注意的是,有了 CoT
,reasoning
性能就能更好地满足 scaling laws
,并随着语言模型的大小而跳跃式增长。例如,当与 540B
参数的 PaLM
模型相结合时,在几个 benchmark reasoning tasks
中,chain of thought prompting
比标准的 few-shot prompting
明显提高了性能,例如在 GSM8K
从 17.9% -> 58.1%
。
CoT prompting
的成功,以及其他许多 task-specific prompting
的工作,经常被归因于 LLM
的 few-shot learning
能力。然而我们表明:LLM
是优雅的 zero-shot reasoner
,通过添加一个简单的 prompt
,"Let's think step by step"
,从而在回答每个问题之前促进 step-by-step thinking
(如 Figure 1 (d)
所示)。尽管简单,我们的 Zero-shot-CoT
还是成功地以 zero-shot
的方式生成了一条合理的推理路径,并在标准的 zero-shot
方法失败的情况下达到了正确答案。重要的是,我们的 Zero-shot-CoT
是通用的和任务无关的,不像之前的 task-specific prompt engineering
,后者的形式是 few-shot examples
或 zero-shot templates
。我们的 Zero-shot-CoT
可以促进各种推理任务的 step-by-step
回答,包括算术推理、符号推理、常识推理、以及其他逻辑推理任务,而无需修改每个任务的 prompt
。
我们在 Table 2
中对 Zero-shot-CoT
与其他 prompting baselines
进行了经验评估。虽然我们的 Zero-shot-CoT
在精心制作的 task-specific step-by-step examples
中表现不佳,但 Zero-shot-CoT
与 0-shot baseline
相比取得了巨大的分数提升,例如:使用 InstructGPT 175B
模型,在 MultiArith
上从 17.7% -> 78.7%
、在 GSM8K
上从 10.4% -> 40.7%
。我们还用另一个现成的大型模型 PaLM 540B
来评估 Zero-shot-CoT
,在 MultiArith
和 GSM8K
上显示出类似的改进幅度。重要的是,在我们 single fixed prompt
下,zero-shot LLM
有一个明显更好的 scaling
曲线,可与 few-shot CoT baseline
相媲美。我们还表明,除了 Few-shot-CoT
需要人为地设计 multi-step reasoning prompts
之外,如果 prompt example question
类型和 task question
类型不匹配,它们的性能就会恶化,这表明对每个任务的 prompt
设计的高度敏感性。相比之下,这种单个 prompt
在不同推理任务中的通用性暗示了 LLM
未被开发和未被研究的 zero-shot
基础能力,如通用逻辑推理等 higher-level
的广泛的认知能力。虽然充满活力的 LLM
领域是从卓越的 few-shot learner
的前提下开始的(GPT-3
),但我们希望我们的工作能鼓励更多的研究来揭示隐藏在这些模型中的high-level
、多任务的 zero-shot
能力。
相关工作和讨论:
LLM
的推理能力:一些研究表明,pre-trained model
通常不擅长推理(reasoning
),但通过使其产生 step-by-step reasoning
,其能力可以大幅提高,要么通过微调、要么通过 few-shot prompting
(相关工作的总结见 Table 6
)。与大多数先前的工作不同,我们专注于 zero-shot prompting
,并表明在各种需要复杂的 multi-hop thinking
的任务中,一个 single fixed trigger prompt
大大增加了 LLM
的 zero-shot reasoning
(Table 1
),特别是当模型被 scaled up
时(Figure 3
)。它还能在不同的任务中产生合理的、可理解的 chain of thought
,即使最后的预测是错误的,参考原始论文的附录 B
、附录 C
(下面的 Table 12
是一部分表格,全部表格参考论文的附录部分)。
与我们的工作类似,《Prompt programming for large language models: Beyond the few-shot paradigm》
证明了一个 prompt
,"Let’s solve this problem by splitting it into steps"
,会促进一个简单算术问题的多步推理。然而,他们将其作为一个 task-specific example
,并没有对各种各样的推理任务在 baseline
上进行定量评估。
《Unsupervised commonsense question answering with self-talk》
提议将常识性问题分解为一系列的 information seeking
问题,如 "what is the definition of [X]"
。它不需要 demonstrations
,但每项推理任务都需要大量的人工的 prompt engineering
。
我们的结果强烈地表明,LLM
是优雅的 zero-shot reasoner
,而之前的 《Chain of thought prompting elicits reasoning in large language models》
往往只强调 few-shot learning
,例如,没有 zero-shot baseline
的报告。我们的方法不需要耗时的微调或昂贵的 sample engineering
,并且可以与任何 pre-trained LLM
相结合,作为所有推理任务的最强的 zero-shot baseline
。
LLM
的 zero-shot
能力:GPT-2
表明,LLM
在许多 system-1
任务中具有出色的 zero-shot
能力,包括阅读理解、翻译和摘要。《Multitask prompted training enables zero-shot task generalization》
、《Training language models to follow instructions with human feedback》
表明,LLM
的这种 zero-shot
能力可以通过显式地微调模型以遵循指令来提高。虽然这些工作的重点是 LLM
的 zero-shot
性能,但我们关注的是 system-1
任务之外的许多 system-2
任务,鉴于平坦的scaling
曲线,这被认为是对 LLM
的巨大挑战。此外,Zero-shot-CoT
与 instruction tuning
是正交的;它增加了 Instruct GPT3, vanilla GPT3, PaLM
的 zero-shot
(见 Figure3
)。
From Narrow (task-specific) to Broad (multi-task) Prompting
:大多数 prompts
都是 task-specific
的。虽然 few-shot prompts
是由于 task-specific in-context samples
,因此,大多数 zero-shot prompts
也集中在 per-task engineering (of templates)
。借用 《On the measure of intelligence》
的术语,这些 prompts
可以说是在激发 LLM
的 "narrow generalization"
或 task-specific
技能。另一方面,我们的方法是一个multi-task prompt
,激发 LLM
的 "broad generalization"
或广泛的认知能力,如逻辑推理或system-2
本身。我们希望我们的工作可以作为一个参考,不仅可以加速对 LLM
的逻辑推理的研究,而且可以发现LLM
的其他的广泛的认知能力。
训练数据集的细节:该工作的一个局限性是缺乏针对 LLM
的训练数据集细节的公开信息,例如 GPT 001 vs GPT 002
、original GPT3 vs Instruct-GPT
,以及 PaLM
模型的数据。然而,所有最近的大型模型( InstructGPT 001 or 002, Original GPT3, PaLM
)从 Zero-shot
到 Zero-shot-CoT
的性能大增,以及在算术任务和非算术任务中的一致改进,表明这些模型不太可能是简单的记忆,而是捕获了一种任务无关的多步骤推理能力从而用于通用的 problem solving
。虽然大多数结果是基于 InstructGPT
的,因为它是性能最好的 open-access LLM
,但关键结果在 PaLM
上复现,而且 InstructGPT
的数据集细节也证实它不是专门为多步骤推理而设计的。
局限性和社会影响:我们的工作是基于针对大型语言模型的 prompting
方法。LLM
已经在来自互联网的各种数据源的大型语料库中进行了训练,并显示出捕捉和放大了训练数据中发现的 bias
。 prompting
是一种方法,该方法寻求利用语言模型捕获到的模式,这些模式有利于各种任务,因此 prompting
也有同样的缺点。也就是说,我们的方法是一种更直接的方式来探究 pre-trained LLM
内部的 complex reasoning
,消除了之前的 few-shot
方法中的 in-context learning
的混杂因素,并可以导致对 LLM
中的 bias
进行更加 unbiased
的研究。
我们简要回顾一下构成这项工作的基础的两个核心概念: large language model and prompting
的出现、以及用于多步骤推理的 chain of thought: CoT prompting
。
large language models and prompting
:语言模型是一个旨在估计文本上的概率分布的模型。最近,通过更大的模型规模、更大的数据进行 scaling improvements
,使 pre-trained
的大型语言模型能够在许多下游的 NLP
任务中表现出惊人的能力。
除了经典的 "pre-train and fine-tune"
范式(《Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing》
),规模到 100B+
参数的模型通过 in context learning
的方式表现出有利于 few-shot learning
的特性(GPT-3
)。其中,在 in context learning
中,人们可以使用被称为 prompt
的文本或模板来强烈引导 generation
来输出目标任务的答案,从而开启一个 "pre-train and prompt"
的时代(《What makes good in-context examples for gpt-3?》
)。在这项工作中,我们把这种具有显式的 few task examples
的 prompts
称作 few-shot prompts
,而把其他仅有模板的 prompts
称为 zero-shot prompts
。
Chain of thought prompting
:多步骤算术推理 benchmarks
、以及逻辑推理 benchmarks
特别地挑战了大型语言模型的 scaling laws
(《Scaling language models: Methods, analysis & insights from training gopher》
)。 chain of thought: CoT prompting
,是 few-shot prompting
的一个实例,通过将 few-shot examples
中的答案修改为 step-by-step
的答案从而提出了一个简单的解决方案,并在这些困难的 benchmarks
中取得了显著的性能提升,尤其是当与PaLM
这样的超大型语言模型结合时。
Figure 1
的最上面一行显示了标准的 few-shot prompting
和 (few-shot) CoT prompting
。值得注意的是,在处理这种困难的任务时,few-shot learning
被认为是给定的,在最初的工作中甚至没有报告 zero-shot baseline
的表现(《Chain of thought prompting elicits reasoning in large language models》
)。为了区别于我们的方法,在本工作中,我们将 《Chain of thought prompting elicits reasoning in large language models》
的方法称为 Few-shot-CoT
。
我们提出了 Zero-shot CoT
,一种用于 chain of thought reasoning
的 zero-shot template-based prompting
。它与原始的 chain of thought prompting
不同,因为它不需要 step-by-step few-shot examples
,它与之前的大多数 template prompting
(《Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing》
)不同,因为它本身是任务无关的,用单个模板就能激发广泛的任务的 multi-hop reasoning
。我们方法的核心思想很简单,如 Figure 1
所述:添加 " Let’s think step by step"
,或添加类似的文本(见 Table 4
),从而抽取 step-by-step reasoning
。
两阶段的 prompting
:虽然 Zero-shot-CoT
在概念上很简单,但它使用了两次 prompting
来提取推理和答案,如 Figure 2
所解释。相比之下,zero-shot baseline
(见 Figure 1
的左下方)已经使用了 "The answer is"
的 prompting
形式,从而以正确的格式提取答案。few-shot prompting
,无论是标准的或 CoT
的,通过显式地设计 few-shot example answers
以这种格式结束,从而避免了这种 answer-extraction prompting
的需求(见 Figure 1
的右上角和左上角)。总之,Few-shot-CoT
需要对每个任务的具备特定答案格式的 a few prompt examples
进行仔细的人力工程,而 Zero-shot-CoT
需要的工程较少,但需要对 LLM
提示两次。
第一次提示:推理提取(reasoning extraction
)。 在这一步中,我们首先使用一个简单的模板 "Q: [X]. A: [T]"
将输入的问题 prompt
[X]
是 [T]
是手工制作的 trigger sentence
chain of though
。例如,如果我们使用 "Let’s think step by step"
作为 trigger sentence
,prompt
"Q: [X]. A: Let’s think step by step."
。更多的 trigger examples
见 Table 4
。
prompted text
第二次提示:答案提取(answer extraction
)。在第二步,我们使用所生成的句子 prompted sentence
具体来说,我们简单地将三个元素拼接起来,如 "[X'] [Z] [A]"
,其中[X']
表示第一次的 prompted text
[Z]
表示第一步产生的句子 [A]
表示用于提取答案的 trigger sentence
。这一步的 prompt
是 self-augmented
的,因为该 prompt
包含由同一语言模型所生成的句子
在实验中,我们根据答案格式的不同,使用略有不同的 answer trigger
。例如:
对于多选题问答,我们使用 "Therefore, among A through E, the answer is"
。
而对于需要数字答案的数学问题,我们使用"Therefore, the answer (arabic numerals) is"
。
answer trigger
句子的清单见 Table 9, Table 10
(left
表示用于 answer extraction
的默认 prompts
,right
为常规的 prompts
)。最后,语言模型将 prompted text
作为输入,生成句子 Table 11
。
任务和数据集:我们在来自四类推理任务的 12
个数据集上评估了我们的方法,包括算术推理、常识推理、符号推理、以及其他逻辑推理任务。每个数据集的详细描述见附录 A.2
。
算术推理任务:六个数据集,SingleEq, AddSub, MultiArith, AQUARAT, GSM8K, SVAMP
。
SingleEq, AddSub
包含比较容易的问题,不需要多步计算就能解决任务。
MultiArith, AQUA-RAT, GSM8k, SVAMP
是更具挑战性的数据集,需要多步推理来解决。
常识推理任务:CommonsenseQA, StrategyQA
。
CommonsenseQA
提出的问题具有复杂的语义,通常需要基于先验知识进行推理。
StrategyQA
要求模型推断出一个隐含的 multi-hop reasoning
来回答问题。
符号推理任务:Last Letter Concatenation, Coin Flip
。
Last Letter Concatenation
要求模型将每个单词的最后一个字母连接起来。对于每个样本,我们使用随机选择的四个名字。
Coin Flip
要求模型回答在人们翻转或不翻转硬币后,硬币是否仍然是正面朝上。我们创建了四次翻转或不翻转的样本。
虽然这些任务对人类来说很容易,但语言模型通常表现出平坦的 scaling
曲线。
其它逻辑推理任务:BIG-bench
中的两个评估集合,Date Understanding
和 Tracking Shuffled Objects
。
Date Understanding
要求模型从上下文中推断出日期。
Tracking Shuffled Objects
测试的是模型在给定其初始状态和对象混洗序列的情况下,推断对象最终状态的能力。我们的数据集跟踪了三个 shuffled objects
。
模型:十七个模型。主要的实验是用 Instruct-GPT3
(text-ada/babbage/curie/davinci-001
和 text-davinci-002
)、原始的 GPT3
( ada, babbage, curie, davinci
)和 PaLM
(8B, 62B, 540B
)。此外,我们使用 GPT-2
、GPT-Neo
、GPT-J
、T0
和 OPT
进行 model scaling
的研究。语言模型的大小从0.3B
到 540B
不等。我们既包括标准的模型(如 GPT-3
和 OPT
),也包括遵循指令的变体(如 Instruct-GPT3
和 T0
)。模型描述细节见附录 A.3
。除非另有说明,我们在整个实验中都使用 text-davinci-002
。
baseline
:我们主要将我们的 Zero-shot-CoT
与标准的 Zero-shot prompting
进行比较。对于 Zero-shot
实验,与 Zero-shot-CoT
类似的 answer prompts
被作为默认使用。详见 Table 9, Table 10
。
为了更好地评估 LLM
在推理任务上的 zero-shot
能力,我们还将我们的方法与 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
中的 Few-shot
和 Few-shot-CoT
基线进行了比较,使用的是相同的 in-context examples
。
在整个实验中,我们对所有的方法都使用了贪婪解码。对于zero-shot
方法,其结果是确定的。对于 few-shot
方法,由于 in-context examples
的顺序可能会影响结果(《Fantastically ordered prompts and where to find them: Overcoming few-shot prompt order sensitivity》
),我们在所有方法和数据集中只用固定的种子运行一次实验,以便与 zero-shot
方法进行公平的比较。 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
的研究表明,在 CoT
实验中,样本的顺序并没有造成大的差异。
清理答案:在模型通过 answer extraction
输出一个文本之后,我们的方法只提取答案文本中首先满足答案格式的部分(参考 Figure 2
)。例如,如果 answer prompting
在算术任务中输出 "可能是375
和 376
",我们就提取第一个数字 " 375
",并将其设置为模型预测值。在多选题的情况下,我们遇到的第一个大字母被设置为预测值。更多细节见 Table 11
。标准的 Zero-shot
也遵循同样的思路。
对于 Few-shot
和 Few-shot-CoT
方法,我们遵循 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
,首先从模型输出中提取 "The answer is "
之后的答案文本,并应用相同的 answer cleansing
来解析答案文本。如果在模型输出中没有找到 "The answer is "
,我们就从文本的后面进行搜索,并将第一个满足答案格式的文本设置为预测值。
Zero-shot-CoT vs. Zero-shot
:如下表所示,Zero-shot-CoT
在六个算术推理任务中的四个(MultiArith, GSM8K, AQUA, SVAM
)、所有符号推理任务、和所有其他逻辑推理任务上大大超越了 zero-shot prompting
。我们的方法在其余两个算术推理任务( SingleEq
和 AddSub
)中表现平平,这是意料之中的,因为它们不需要多步骤推理。
在常识推理任务中,Zero-shot-CoT
并没有提供性能提升。这是意料之中的,因为 COT
也报告说,即使 Few-shot-CoT
在Lambda(135B)
上也没有提供性能提升,但在与大得多的 PaLM(540B)
模型结合时,确实改善了 StrategyQA
,这可能也适用于我们的情况。更重要的是,我们观察到许多生成的 chain of thought
在逻辑上是正确的,或者只包含人类可以理解的错误(见 Table 3
),这表明 Zero-shot-CoT
确实能引起更好的常识推理,即使任务指标没有直接反映它。我们在附录 B
中提供了由 Zero-shot-CoT
为每个数据集生成的样本。
与其他 baseline
的比较:下表比较了 Zero-shot-CoT
和基线在两个算术推理基准(MultiArith, GSM8K
)上的表现。standard prompting
(第一个 block
)和 chain of thought prompting
(第2
个 block
)之间的巨大差距表明,这些任务在没有激发多步骤推理的情况下是困难的。Instruct GPT-3 (175B)
和 PaLM (540B)
模型都获得了重大改进。
虽然 Zero-shot-CoT
的性能自然低于 Few-shot-CoT
,但它的性能大大超过了标准的、每个任务八个样本的 Few-shot prompting
。
对于 GSM8K
,Instruct GPT-3(175B)
的 Zero-shot-CoT
的性能也优于微调的 GPT-3
、以及大型模型(PaLM, 540B
)的 standard few-shot prompting
。使用 PaLM
的进一步实验结果见附录 D
。
模型大小对 zero-shot reasoning
是否重要:下图比较了 MultiArith / GSM8K
上各种语言模型的性能。在没有 chain of thought reasoning
的情况下,随着模型规模的增加,性能不会增加、或者增加缓慢,也就是说,曲线大多是平的。与此相反,对于Original/Instruct GPT-3
和 PaLM
来说,随着模型规模的增大,chain of thought reasoning
的性能急剧增加。当模型大小较小时,chain of thought reasoning
并不有效。这个结果与 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
中的 few-shot
实验的结果一致。附录 E
显示了使用更多种类的语言模型的广泛实验结果,包括 GPT-2, GPT-Neo, GPT-J, T0, OPT
。我们还手动调查了所生成的 chain of thought
的质量,大型的模型明显表现出更好的推理能力(每个模型的 sampled output
见附录 B
)。
Error Analysis
:为了更好地理解 Zero-shot-CoT
的行为,我们手动调查了由具有 Zero-shot-CoT prompting
的 Instruct-GPT3
所生成的随机选择的样本。样本见附录 C
,其中的一些观察结果包括:
在常识推理(CommonsenseQA
)中,即使最后的预测不正确,Zero-shot-CoT
也经常产生灵活合理的 chain of thought
。当模型发现难以缩小到一个答案时,Zero-shot-CoT
经常输出多个答案选择(参考 Table 3
)。
在算术推理(MultiArith
)中,Zero-shot-CoT
和 Few-shot-CoT
在错误模式方面表现出很大的差异。
首先,Zero-shot-CoT
倾向于在得到正确的预测后输出不必要的推理步骤,这导致预测变为不正确的预测。Zero-shot-CoT
有时也不开始推理,只是重新表述输入的问题。
相比之下,当所生成的 chain of thought
包括三元运算时(如 (3+2) * 4
),Few-shot-CoT
往往会失败。
prompt selection
如何影响 Zero-shot-CoT
:我们验证了 Zero-shot-CoT
对 input prompts
的稳健性。下表总结了使用 16
个不同模板(分为三类)的性能。
具体来说,遵从 《Do prompt-based models really understand the meaning of their prompts?》
,这些类别包括指导性的(鼓励推理)、误导性的(不鼓励推理或鼓励推理但方式错误)、以及不相关的(与推理无关)。结果表明,如果文本是以鼓励 chain of thought reasoning
的方式写的,即模板属于 "instructive"
类别,那么性能就会提高。然而,准确率的差异是显著的,这取决于句子。在这个实验中,"Let’s think step by step."
取得了最好的结果。有趣的是,我们发现不同的模板鼓励模型以相当不同的方式表达推理(见附录 B
,每个模板的输出样本)。相反,当我们使用误导性或不相关的模板时,性能并没有提高。如何为 Zero-shot-CoT
自动创建更好的模板仍然是一个开放的问题。
prompt selection
如何影响 Few-shot-CoT
:下表展示了使用来自不同数据集的 examples
(CommonsenseQA to AQUA-RAT
和 CommonsenseQA to MultiArith
)时 Fewshot-CoT
的性能。这两种情况下的 domain
是不同的,但CommonsenseQA and AQUA-RAT
的 answer format
是相同的。令人惊讶的是,来自不同领域(从常识推理到算术推理)但具有相同答案格式(多项选择)的 chain of thought examples
,在 Zero-shot
(对于 AQUA-RAT
)上取得了显著的性能提升,通过相对于 Zero-shot-CoT
或 Few-shot-CoT
可能带来的相对改善作为指标。
相比之下,当使用不同答案类型的样本时(对 MultiArith
而言),性能增益就变得很低了,这证实了之前的工作(《Rethinking the role of demonstrations: What makes in-context learning work?》
),即 LLM
主要利用 few-shot examples
来推断重复格式,而不是推断任务本身。然而,在这两种情况下,结果都比 Zero-shot-CoT
差,这肯定了 Few-shot-CoT
中 task-specific sample engineering
的重要性。
Zero-shot-CoT
无需考虑examples
的迁移,因为它不需要few-shot examples
。
论文:
《Automatic Chain of Thought Prompting in Large Language Models》
大型语言模型(LLM
)通过将多步骤问题分解为中间步骤,在复杂的推理任务中表现抢眼。这种推理过程是由最近的一项技术引起的:chain-of-thought: CoT prompting
(《Chain of thought prompting elicits reasoning in large language models》
)。
CoT prompting
可以分为两个主要范式:
一种范式是:在 test question
后添加一个类似于 "Let’s think step by step"
的单个 prompt
,以促进 LLM
中的 reasoning chains
(《Large language models are zero-shot reasoners》
)。由于这种 prompting
范式与任务无关,不需要 input-output demonstrations,
,因此被称为 Zero-Shot-CoT
(下图的左边)。通过 Zero-Shot-CoT
,LLM
被证明是优雅的 zero-shot reasoner
。
Zero-Shot-CoT
其实也拼接了reasoning demonstrations
,只是它的demonstrations
是由模型自动生成的(而不是人工生成的)。
另一种范式是具有一个接一个的人工 reasoning demonstrations
的 few-shot prompting
(《Chain of thought prompting elicits reasoning in large language models》
) 。每个 demonstration
都有一个问题和一个 reasoning chain
。reasoning chain
由一个理由( rationale
,即一系列中间的推理步骤)和一个预期答案组成。由于所有的 demonstrations
都是手工设计的,这种范式被称为 Manual-CoT
(下图的右边)。
在实践中,Manual-CoT
获得了比 Zero-Shot-CoT
更强的性能。然而,这种优越性能取决于手工设计的有效 effective demonstrations
。具体来说,对于 demonstrations
,Manual-CoT
涉及到为问题及其 reasoning chain
的设计所做的不小的努力。此外,人们针对 task-specific demonstrations
的设计需要做出更多的努力:不同的任务(如算术推理和常识推理任务)需要不同的 demonstrations
方式。
为了消除这种手工设计,我们主张采用另一种 Auto-CoT
范式来自动构建带有问题和 reasoning chains
的 demonstrations
。具体来说,Auto-CoT
利用 LLM
的 "Let’s think step by step" prompt
,为 demonstrations
来 one-by-one
地生成 reasoning chains
;也就是说,"let’s think not just step by step, but also one by one"
。然而,我们发现,这一挑战不能通过简单的解决方案来有效解决。例如,给定数据集的一个测试问题,检索语义相似的问题并调用 Zero-Shot-CoT
来生成 reasoning chains
会失败。尽管 LLM
是优雅的 zero-shot reasoner
,但它们并不完美:Zero-Shot-CoT
仍然会在 reasoning chain
中犯错。
为了缓解来自 Zero-Shot-CoT
的 reasoning chain mistakes
的影响,我们的分析表明,demonstration questions
的多样性是关键所在。基于这一洞察,我们提出了一种自动构建 demonstrations
的 Auto-CoT
方法。Auto-CoT
包括两个主要步骤:
首先,将一个给定的数据集的所有问题划分为几个 clusters
。
聚类通过一个
pre-trained sentence encoder
来进行,如SBERT
。
其次,从每个 cluster
中选择一个有代表性的问题,并使用简单启发式的 Zero-Shot-CoT
生成它的 reasoning chain
。
核心思想有两个:
通过
Zero-Shot-CoT
来人工构造 ”伪“examples
,从而进行Few-Shot-CoT
。构造的时候选择多样化的样本,并且过滤掉不满足条件的样本(这个条件是人工定义的规则)。
我们在十个 benchmark reasoning tasks
上评估了 Auto-CoT
,包括:算术推理(MultiArith, GSM8K, AQUA-RAT, SVAMP
)、常识推理(CSQA, StrategyQA
)、符号推理(Last Letter Concatenation, Coin Flip
)。实验结果显示,在 GPT-3
上,Auto-CoT
的性能始终与需要人工设计的 Manual-CoT
相匹配,甚至超过了后者。这表明,LLM
可以通过自动构建 demonstrations
来进行 CoT reasoning
。
相关工作:这里回顾了构成这项工作的基础的两条研究路线:针对多步骤推理的 chain-of-thought: CoT chain-of-thought
、以及用于诱导 LLM
从 demonstrations
中学习的 in-context learning
。
Chain-of-thought Prompting
:CoT prompting
是一种诱导 LLM
产生中间推理步骤(这些中间推理步骤导致最终答案)的 gradient-free
技术。
《Chain of thought prompting elicits reasoning in large language models》
正式研究了语言模型中的 CoT prompting
的 topic
。这项技术诱导 LLM
产生一系列连贯的中间推理步骤,从而导致问题的最终答案。研究表明,LLM
可以通过 zero-shot prompting: Zero-Shot-CoT
(《Large language models are zero-shot reasoners》
)、或手动编写的 few-shot demonstrations
(Manual-CoT
)(《Chain of thought prompting elicits reasoning in large language models》
)进行 CoT reasoning
。
Zero-Shot-CoT
:《Large language models are zero-shot reasoners》
表明 LLM
是一个优雅的 zero-shot reasoner
,其生成的理由已经反映了 CoT reasoning
。这一发现激发了我们的工作,即利用 self-generated rationales
用于 demonstrations
。
在最近的一项工作中(《Star: Bootstrapping reasoning with reasoning》
),通过 LLM
来生成理由被证明是实用的。在他们的工作中,一个 LLM
被提示从而生成理由,然后那些导致正确答案的理由被选中。这种选择需要一个带有 annotated answers
的问题的训练数据集。
相比之下,我们的工作考虑了一个更具挑战性的场景,即只给出一组测试问题(没有训练数据集),遵循 《Chain of thought prompting elicits reasoning in large language models》
和 《Large language models are zero-shot reasoners》
的 CoT prompting
的研究。
Manual-CoT
:Manual-CoT
通过有效的 manual demonstrations
来激发 CoT reasoning
能力,从而实现更强的性能。用于 reasoning process
的 demonstrations
是人工设计的。然而,人们在设计问题及其 reasoning chains
方面的努力是不容易的。最近的研究并没有解决这个问题,而是主要集中在手工制作更复杂的 demonstrations
、或者利用 ensemble-like
方法。
一个趋势是问题分解。在 least-to-most prompting
中(《Least-to-most prompting enables complex reasoning in large language models》
),复杂的问题被简化为子问题,然后这些子问题被依次解决。
另一个趋势是对一个测试问题的多个推理路径进行投票。《Self-consistency improves chain of thought reasoning in language models》
引入了一种 self-consistency
解码策略,采样 LLM
的多个输出,然后对最终答案采取多数票。
《Rationale-augmented ensembles in language models》
和 《On the advance of making language models better reasoners》
在输入空间中引入随机性,以产生更多不同的输出从而用于投票。他们使用人工设计的 demonstrations
作为种子集合,并生成额外的理由(rationales
):从种子集合中 hold out
一个问题,并使用剩余的 demonstrations
来生成 LLM
对这个问题的理由。
与上述依靠人工设计的 demonstrations
的研究路线不同,我们的工作打算消除人工设计并保持具有竞争力的性能。
In-Context Learning
:CoT prompting
与 in-context learning: ICL
密切相关。ICL
使 LLM
能够通过馈入一些 prompted examples
来执行一个目标任务。在没有梯度更新的情况下,ICL
允许单个模型普遍地执行各种任务。有各种研究思路来提高 ICL
的性能:
检索与测试实例相关的 demonstrations
,其中流行的做法是为给定的 test input
动态地检索相关的训练样本。
用细粒度的信息进行 augmenting
,如加入任务指令。
操纵 LLM
的输出概率,而不是直接计算 target labels
的可能性。
尽管 ICL
很成功,但研究表明,ICL
的 strength
可能会因 in-context demonstrations
的选择而有很大差异(《Few-shot parameter-efficient fine-tuning is better and cheaper than in-context learning》
)。详细来说,prompt
的格式,如措辞、或者 order of demonstrations
,可能会导致性能的波动。最近的一项工作 《Rethinking the role of demonstrations: What makes in-context learning work?》
甚至质疑 ground-truth input-output mapping
的必要性:在样本中使用不正确的标签只稍微降低了性能。
然而,现有的对 ICL
的分析主要是基于标准的分类数据集和多选数据集,这些数据集只有简单的 <input -> output> mapping
。我们发现,这些发现可能并不适用于具有更复杂的 <input -> rationale -> output> mapping
的 CoT prompting
场景。例如,<input -> rationale> mapping
或 <rationale -> output> mapping
中的错误都会导致性能急剧下降 (参考附录 A.1
)。
如前所述,ICL
的性能取决于人工制作的 demonstrations
。正如在 Manual-CoT
中所报告的,在一个符号推理任务中,使用不同标注员所写的 demonstrations
会带来高达 28.2%
的准确率差异;而在大多数任务中,改变 demonstrations
的顺序会带来不到 2%
的变化。这表明,Auto-CoT
的关键挑战在于自动构建具有良好的 questions and their reasoning chains
的 demonstrations
。
回顾一下,Manual-CoT
在 demonstrations
中手工制作了几个(例如 8
个)问题。随着 similarity-based retrieval
方法被广泛用于 prompting LLM
(《Learning To Retrieve Prompts for In-Context Learning》
、《Selective annotation makes language models better few-shot learners 》
),一个有希望的候选解决方案是利用 similarity-based retrieval
来采样 demonstration questions
。我们遵循 CoT
研究中更具挑战性的假设,即只给出一组测试问题(没有训练数据集)。遵循 《What makes good in-context examples for gpt-3?》
,我们使用 Sentence-BERT
来编码问题。对于测试数据集中的每个问题 demonstration questions
我们设计了一个 Retrieval-Q-CoT
方法,从而检索基于余弦相似度的 top-k
个相似问题(例如,similarity-based
方法进行比较,我们还测试了一种基于更加多样化的方法:Random-Q-CoT
,对于每个测试问题,它随机采样
Retrieval-Q-CoT
和 Random-Q-CoT
都调用 Zero-Shot-CoT
来为每个采样到的问题 reasoning chain
LLM
是优雅的 zero-shot reasoners
。除非另有说明,否则我们使用 GPT-3 175B
(text-davinci-002
)作为LLM
。在 high level
,Retrieval-Q-CoT
和 Random-Q-CoT
都将 pair
( reasoning chain
,其中这个被预测的 reasoning chain
包含最终答案(像 Figure 1
的右图)。
令我们惊讶的是,Retrieval-Q-CoT
在算术数据集 MultiArith
上的表现低于 Random-Q-CoT
(如下表所示)。请注意,这些检索方法最初是在有 annotated labels
的任务中提出的,然而,调用 Zero-Shot-CoT
并不能保证 reasoning chains
的完全正确。因此,我们假设 Retrieval-Q-CoT
的性能较差是由 Zero-Shot-CoT
的 incorrect reasoning chains
造成的。为了测试这个假设,我们在另外两个数据集 GSM8K
和 AQuA
上实验 Retrieval-QCoT
,这两个数据集包含带有 annotated reasoning chains
的训练集。结果如下表表示。在有 annotated reasoning chains
的 setting
下,Retrieval-Q-CoT
甚至超过了 Manual-CoT
。这一结果表明,当有 human annotations
时,Retrieval-Q-CoT
是有效的。
虽然 human annotations
是有用的,但这种人工努力是不容易的。然而,通过 Zero-Shot-CoT
自动生成 reasoning chains
的性能低于 Manual-CoT
,特别是当 question sampling
的挑战没有得到解决时。为了设计出更有效的 Auto-CoT
,我们需要更好地理解其挑战。
原始的
Zero-Shot-CoT
并没有采用in-context examples
,而这里的Random-Q-CoT
和Retrieval-Q-CoT
借鉴了Zero-Shot-CoT
自动生成理由、答案的能力,从而构造一批 ”伪“ 样本用于in-context examples
。既然
Zero-Shot-CoT
可以这么做,那么所有的Zero-shot
方法也可以参考这种方式从而成为Few-shot
方法。
由于 Retrieval-Q-CoT
像在 Manual-CoT
中一样使用了一些 prompting demonstrations
,因此 Retrieval-Q-CoT
预计也会有竞争性的表现。然而,Retrieval-Q-CoT
中的 reasoning chains
(包括理由和答案)是由 Zero-Shot-CoT
生成的:它们可能有错误,导致错误的答案。让我们简单地把具有错误答案的 demonstrations
称为 wrong demonstrations
。直观地说,在检索到与某个测试问题相似的其它问题后,由 Zero-Shot-CoT
引导的 wrong demonstrations
可能会误导同一个 LLM
对该测试问题进行错误答案的相似推理(即,复制错误)。我们把这种现象称为相似性误导(misleading by similarity
)。我们将研究相似性误导是否造成了 Retrieval-Q-CoT
的低质量的表现。
首先,我们在 MultiArith
数据集中的所有 600
个问题上调用了 Zero-Shot-CoT
。在这些问题中,我们收集了 128
个问题(记做 Zero-Shot-CoT
产生了错误的答案(错误率:21.3% = 128/600
)。正如我们提到的,通过额外的 demonstrations
,Retrieval-Q-CoT
和 Random-Q-CoT
有望比 Zero-Shot-CoT
表现得更有竞争力。
在 Zero-Shot-CoT
失败的问题中,我们把那些Retrieval-Q-CoT
或 Random-Q-CoT
仍然失败的问题称为它们的 unresolved questions
。我们用 unresolved questions
的数量除以 128
( unresolving rate
)。较高的未解决率意味着一种方法更有可能仍然像 Zero-Shot-CoT
那样犯错。下图显示,Retrieval-Q-CoT
的未解决率( 46.9%
)远远高于 Random-Q-CoT
(25.8%
)。这表明,针对测试问题,在相似的问题被采样的情况下,Retrieval-Q-CoT
受到了相似性误导的负面影响。
为了说明 Retrieval-Q-CoT
的 unresolved questions
往往是相似的,我们在下表中提出了一个案例。在左边的部分,检索到的 demonstration questions
与测试问题相似,询问 "how long will it take him to cook the rest?"
。由 Zero-Shot-CoT
生成的 reasoning chains
产生了关于 "the total of"
而不是 "the rest"
的答案。
遵从 demonstrations
,Retrieval-Q-CoT
也因为误解了 "the rest "
的含义而失败。相比之下,Random-Q-CoT
更正确地理解了 "the rest"
,而没有犯在 demonstrations
中的相似错误,这要归功于相对更多样化的(即,随机的)demonstrations
。
受 Table 2
中观察结果的启发,我们使用 k-means
将所有 600
个测试问题划分为 cluster
,其中每个 cluster
都包含相似的问题。有了这些 cluster
和由 Zero-Shot-CoT
生成的 reasoning chains
,现在我们很好奇某些 cluster
是否包含 Zero-Shot-CoT
经常失败的问题。因此,我们计算每个 cluster
的错误率(具有有错误的 Zero-Shot-CoT
答案的问题数量除以问题总数)。
如下图所示,有一个 cluster
(Cluster 2
)存在较高的 Zero-Shot-CoT
错误率(52.3%
)。这种现象可能是广泛的,因为 Zero-Shot-CoT
可能缺乏一些技能来解决目标任务中的一些常见问题。为了描述的方便,我们把错误率最高的 cluster
称为 frequent-error cluster
(例如,下图中的 Cluster 2
)。因此,以 zero-shot
方式生成的 reasoning chains
的不完善所带来的风险是:通过使用 similarity-based
的方法,在 frequent-error cluster
内检索出多个相似的问题。对于 frequent-error cluster
中的测试问题,Retrieval-Q-CoT
更容易构建具有多个相似 wrong demonstrations
。因此,Retrieval-Q-CoT
经常犯类似于 Zero-Shot-CoT
的错误,Figure 2
中较高的 unresolving rate
就重申了这一点。
到目前为止的分析令人信服地表明,LLM
仍然不是完美的 zero-shot reasoner
。因此,我们的目标是缓解其 Zero-Shot-CoT
的错误的影响,特别是在设计 Auto-CoT
时缓解相似性误导。
正如我们将在后面展示的(实验部分),呈现一小部分错误(例如,8
个 wrong demonstrations
中的 1
或 2
个)不会损害测试问题的整体 reasoning
性能。假设所有 wrong demonstrations
的问题都属于同一个 frequent-error cluster
;那么从每个不同的 cluster
中采样一个问题将导致高于 7/8 = 87.5%
的机会来构建所有 8
个 correct demonstrations
。由于不同的 cluster
反映了问题的多样化的语义,这种 clustering-based sampling
方法可以被认为是 diversity-based
的,这与 similarity-based
的 Retrieval-Q-CoT
形成了鲜明对比。
一方面,具有多样性的 sampling questions
可以缓解相似性误导的影响。
另一方面,如果我们把每个 demonstration
当作一种技能,多样化的 demonstration
似乎覆盖了解决目标问题的更多备选技能:即使 demonstrations
中仍然存在一小部分错误(例如,1/8 = 12.5%
),性能也不会受到负面影响(如下图所示)。
尽管如此,clustering-based sampling
方法仍然可能构建出一小部分 wrong demonstrations
,例如来自 frequent-error cluster
中的问题。正如我们稍后所显示的,其中一些 wrong demonstrations
可以用启发式方法消除。例如,wrong demonstrations
往往伴随着长的问题和长的理由。使用简单和通用的启发式方法,比如只考虑较短的问题和较短的理由,可以进一步帮助缓解不完善的 Zero-Shot-CoT
能力的影响。
简单的启发式方法的效果:问题不超过 60 tokens
、理由不超过 5 reasoning steps
。对于算术推理(除了 AQuA
,因为它是多项选择题),要求答案出现在理由中(从而缓解 rationale-answer mismatches
)。
这种启发式规则强烈依赖于具体的任务,而且依赖于人工的经验。
对于满足上述要求的问题、理由、以及答案,对于第 cluster
的候选 demonstration
我们在使用简单的启发式方法来构建 demonstration
之前、以及之后的三次运行来量化其效果。结果如下表所示。可以看到,简单的启发式方法减少了构建 demonstrations
时错误理由的平均数量。
下图进一步描述了使用和不使用简单的启发式方法时的错误率。错误率的计算方法是错误理由的平均数除以 demonstrations
的数量。我们看到,在大多数任务中,我们的方法可以将错误率控制在 20%
以下( 7/10
)。
基于前面所述的观察和考虑,我们提出了一种 Auto-CoT
方法来自动构建带有 questions and reasoning chains
的 demonstrations
。Auto-CoT
包括两个主要阶段:
问题聚类:将给定数据集的问题划分为几个 clusters
。
demonstration sampling
:从每个 cluster
中选择一个有代表性的问题,并使用简单启发式的 Zero-Shot-CoT
生成其 reasoning chain
。
整个过程如下图所示。
Question Clustering
:由于 diversity-based clustering
可能会缓解相似性误导,我们对一组给定的问题
我们首先通过 Sentence-BERT
为 vector representation
。contextualized vectors
被平均化,从而形成一个 fix-sized
的 question representation
。
然后,我们用 k-means
聚类算法处理 question representations
,产生 question clusters
。对于每个 cluster
cluster
这个 question clustering
阶段的算法如下所示。
Demonstration Sampling
:在第二阶段,我们需要为这些被采样到的问题生成 reasoning chains
,然后采样 demonstrations
(这些 demonstrations
需要满足我们的 selection criteria
)。
更具体而言,我们为每个 cluster
demonstration
cluster
selection criteria
。换句话说,更接近 cluster
cluster
prompted input
被表述为: [P]
是一个单个 prompt
"Let’s think step to step
"。这个构造好的输入被馈入一个使用 Zero-Shot-CoT
的 LLM
,从而输出由理由 reasoning chain
。然后,通过拼接问题、理由、以及答案,构建第 cluster
的候选 demonstration
与 《Chain of thought prompting elicits reasoning in large language models》
中手工制作 demonstrations
的 criteria
类似,我们的 selection criteria
遵循简单的启发式方法,从而鼓励来采样较简单的问题和理由:对于 demonstration
60 tokens
、理由 5 reasoning steps
,则选中该 demonstration
并记做
这个人工定义的规则是否通用?读者觉得可能针对不同的任务需要设计不同的规则。
Demonstration Sampling
算法如下所示。在对所有 clusters
进行 demonstration sampling
后,将有 demonstrations
demonstrations
被用来 augment
一个测试问题 in-context learning
。具体而言,输入是所有demonstrations
LLM
从而获得 reasoning chain
,最后是答案(Figure 4
的右边)。
这里我们给出主要的实验结果。更多的实验细节和结果可以参考论文的附录部分。
任务和数据集:三类推理任务的十个基准数据集。
算术推理:MultiArith, GSM8K, AddSub, AQUA-RAT, SingleEq, SVAMP
。
常识推理:CSQA, StrategyQA
。
符号推理:Last Letter Concatenation, Coin Flip
。
实现:除非另有说明,我们使用 text-davinci-002
版本的 GPT-3 175B
。我们选择这个 LLM
是因为它在 public LLM
中具有最强的 CoT reasoning
性能,如 《Large language models are zero-shot reasoners》
和 《Chain of thought prompting elicits reasoning in large language models》
的报告。我们还评估了 Codex
模型(code-davinci-002
)作为 LLM
。遵从 《Chain of thought prompting elicits reasoning in large language models》
,除了 AQuA
和 Letter
(CSQA
(StrategyQA
(demonstrations
数量
baseline
:Zero-Shot
、Zero-Shot-CoT
、Few-Shot
、Manual-CoT
。
Zero-Shot-CoT
和 Manual-CoT
如 Figure 1
所示。
Zero-Shot baseline
将一个测试问题与 prompt "The answer is"
拼接起来作为 LLM
的输入。
Few-Shot baseline
与 Manual-CoT
具有相同的 LLM
输入,只是删除了所有demonstrations
的理由。
Auto-CoT
在十个数据集上的有竞争力的表现:下表比较了三类推理任务的十个数据集的准确率。
Zero-Shot
和 Zero-Shot-CoT
的结果取自 《Large language models are zero-shot reasoners》
。
Few-Shot
和 Manual-CoT
的结果取自《Chain of thought prompting elicits reasoning in large language models》
。
Auto-CoT
的结果是三次随机运行的平均值。
总的来说,Auto-CoT
始终与需要手工设计 demonstrations
的 CoT
范式的性能相匹配,甚至超过了后者。由于人工设计的成本,Manual-CoT
可能为多个数据集设计相同的 demonstrations
(例如,算术数据集中的 5/6
)。相比之下,Auto-CoT
更灵活,更加 task-adaptive
:每个数据集都能得到自己的 demonstrations
,而且这些 demonstrations
是自动构建的。
Question Clustering
的可视化:下图直观地显示了 10
个数据集的 question clustering
(用 PCA
投影)。该图表明,存在通用的模式,不同的模式可能由来自不同 cluster
的问题来刻画。
这可能是一种例外,因为数据集的作者在创建数据集的时候可能就是分类别来创建的。而真实场景下,数据的聚类分布可能区分度更差。
我们在附录D
中介绍了 Auto-CoT
的 constructed demonstrations
。其中 MultiArith
的 demonstrations
如下:
使用 Codex LLM
的有效性:为了评估使用不同 LLM
的 Auto-CoT
的有效性,这里我们将 LLM
改为 Codex
模型。如下表所示,与使用 GPT-3 (text-davinci-002) LLM
的 Table 3
相比,Codex LLM
导致 Manual-CoT
的性能提高。尽管如此,使用 Codex LLM
,Auto-CoT
的整体性能与 Manual-CoT
相比仍然具有竞争力,为 Auto-CoT
的有效性提供了额外的经验证据。
Wrong Demonstrations
的效果:回顾我们在前面的讨论,可能存在 wrong demonstrations
(其答案是错误的)。为了了解多样性是否能减轻这种影响,我们设计了 In-Cluster Sampling baseline
,通过从与 test question
的同一 cluster
中随机采样问题来构建 demonstrations
。下图比较了在 MultiArith
上不同数量的 wrong demonstrations
的准确率。与 In-Cluster Sampling
相比,Auto-CoT
(使用 diversity-based clustering
)受 wrong demonstrations
的影响较小:即使遇到 50%
的 wrong demonstrations
,其性能也没有明显下降。
更具挑战性的 Streaming Setting
:CoT
研究通常假设一个完整的数据,其中包含所有的测试问题。基于给定的数据集,Auto-CoT
采样一些问题从而构建 demonstrations
。然而,现在我们考虑的是一个更具挑战性的 streaming setting
,其中每次到达一小批测试问题(例如
为了应对这一挑战,我们将 Auto-CoT
扩展为一个 bootstrapping
的版本 Auto-CoT*
:
首先,初始化一个空集合
然后,当第一个 batch
的问题 Zero-Shot-CoT
(由于 reasoning chain
question-chain pairs
然后,当 batch b
(reasoning chains
构建 demonstrations
(就像 Auto-CoT
),对每个 demonstrations
从而进行 in-context reasoning
。将 question-chain pairs
从第二个
batch
开始,就进行Auto-CoT
的算法。
下图比较了在这种 streaming setting
下,在 MultiArith
数据集上,每个 batch
(
对于 batch 1
,Auto-CoT*
和 Zero-Shot-CoT
获得相同的准确率。
从 batch 2
开始,Auto-CoT*
的表现与 Manual-CoT
相当。
这一结果表明,我们的方法在更具挑战性的 streaming setting
中仍然有效。
论文:
《Least-to-Most Prompting Enables Complex Reasoning in Large Language Models》
尽管深度学习在过去十年中取得了巨大的成功,但人类智能和机器学习之间仍然存在巨大的差异:
(1)
:给定一个新的任务,人类通常只需要通过一些 demonstration examples
就可以学会完成,而机器学习则需要大量的标记数据来进行模型训练。
(2)
:人类可以清楚地解释其预测或决策的基本原理,而机器学习基本上是一个黑盒子。
(3)
:人类可以解决比他们以前见过的任何问题更加困难的问题;而对于机器学习,训练样本和测试样本通常处于同一难度水平。
最近提出的 chain-of-thought prompting
方法(《Chain of thought prompting elicits reasoning in large language models》
)为缩小人类智能和机器智能之间的差距迈出了重要一步。它结合了自然语言理由(natural language rationale
)和 few-shot prompting
(GPT-3
)的思想。当与 self-consistency
解码(《Self-consistency improves chain of thought reasoning in language mod》
)进一步整合,而不是使用典型的贪婪解码时,在许多具有挑战性的自然语言处理任务上, few-shot chain-of-thought prompting
在很大程度上超过了文献中的 SOTA
结果,这些 SOTA
结果是由专门设计的神经模型在数百倍的标注样本的训练下得到的,同时 few-shot chain-of-thought prompting
也是完全可解释的。
然而,chain-of-thought prompting
有一个关键的局限性:它在需要泛化到解决比 demonstration examples
更难的问题的任务上往往表现不佳,比如组合泛化(compositional generalization
)。为了解决这种从易到难的泛化问题,我们提出了 least-to-most prompting
。它包括两个阶段:
首先将一个复杂的问题分解成一系列较容易的子问题。
然后依次解决这些子问题,其中,解决一个给定的子问题是由以前所解决的子问题的答案来推动的。
这两个阶段都是通过 few-shot prompting
来实现的,因此在这两个阶段都不存在训练或微调。下图显示了一个 least-to-most prompting
的使用案例。
注意,传递给模型的
prompt
包括:说明如何分解复杂问题的examples
(图中没有显示),然后是要分解的具体问题(如图所示)。这些子问题类似于
CoT
的 ”理由”,然而这里的 “理由” 是模型自动生成的而不是人工撰写的。
Auto-CoT
也是通过模型自动生成 “理由”, 但是Auto-CoT
是通过单步来一次性生成所有 ”理由“;而这里是单步生成一个 ”理由“。
术语 "least-to-most prompting"
借用自教育心理学(《A comparison of most-to-least and least-to-most prompting on the acquisition of solitary play skills》
),它被用来表示一种技术,该技术使用渐进的 prompts
序列来帮助学生学习新技能。关于符号操作、组合泛化、以及数学推理的经验结果表明, least-to-most prompting
确实可以泛化到比 demonstrations
的问题更难的问题。
相关工作:
compositional generalization
:SCAN
是一个广泛使用的基准,用于评估组合泛化。在其所有的 split
中,最具挑战性的是length split
,它要求模型泛化到比训练序列更长的测试序列。之前在 SCAN
上有良好表现的工作大多提出了神经符号(neural-symbolic
)架构和语法归纳(grammar induction
)技术。与现有的工作不同,我们证明,没有专门设计的模型架构和符号组件来提高 compositional generalization
能力, least-to-most prompting
在任何 split
(包括 length split
)上都能达到 99.7%
的准确率,只需要少量的 demonstration examples
,而且不需要任何训练或微调。
easy-to-hard generalization
:除了组合泛化,还有许多其他任务,测试样本比训练样本需要更多的推理步骤来解决,例如,last-letter-concatenation
任务。
《Neural logicmachines》
提出 Neural Logic Machin: NLM
用于 inductive learning
和逻辑推理。在小规模任务(如小尺寸块状世界)上训练的 NLM
可以完美地推广到大规模任务(如大尺寸块状世界)。
《Can you learn an algorithm? generalizing from easy to hard problems with recurrent networks》
表明,为解决具有少量递归步骤的简单问题(如小尺寸迷宫或国际象棋谜题)而训练的递归网络,可以通过在推理过程中执行额外的递归来解决更复杂的问题(如大尺寸迷宫或国际象棋谜题)。
在我们的方法中,我们通过将一个复杂的问题分解成一系列较容易的问题来实现 easy-to-hard generalization
。
任务分解:
《Unsupervised question decomposition for question answering》
将一个 multi-hop
问题分解成若干独立的 single-hop
子问题,这些子问题由一个现成的问答模型来回答。然后,这些答案被汇总从而形成最终的答案。问题分解和答案汇总都是由训练好的模型实现的。
《Shepherd pre-trained language models to develop a train of thought: An iterative prompting approach》
通过将 prompts
建模为连续的虚拟 tokens
,并通过 iterative prompting
从语言模型中逐步激发相关的知识,来进行 multi-hop QA
。
与这些方法不同,我们的方法不涉及任何训练或微调。此外,least-to-most prompting
中产生的子问题通常是相互依赖的,必须按照特定的顺序依次解决,这样一些子问题的答案就可以作为解决其他子问题的 building block
。
《Seqzero: Few-shot compositional semantic parsing with sequential prompts and zero-shot models 》
通过基于规则的系统将一个问题分解成与 SQL query
相对应的 slot-filling
自然语言 prompts
的序列,将自然语言问题翻译成SQL query
。
《AI chains: Transparent and controllable human-AI interaction by chaining large language model prompts》
提出将大型语言模型的步骤链接起来,使一个步骤的输出成为下一个步骤的输入,并开发了一个交互式系统供用户构建和修改 chains
。
least-to-most prompting
链接了问题分解和子问题解决的过程。
least-to-most prompting
教导语言模型如何通过将一个复杂的问题分解为一系列较简单的子问题来解决。它由两个连续的阶段组成:
分解:这一阶段的 prompt
包含展示分解的 constant examples
,然后是待分解的具体问题。
子问题的解决。这个阶段的 prompt
由三部分组成:
演示如何解决子问题的 constant examples
。
已经回答的子问题以及生成答案所组成的列表(可能是空的)。
接下来要回答的问题。
在 Figure 1
所示的例子中,语言模型首先被要求将原始问题分解为子问题。传递给模型的 prompt
包括:说明如何分解复杂问题的 examples
(图中没有显示),然后是要分解的具体问题(如图所示)。语言模型发现,原始问题可以通过解决一个中间问题来回答 "How long does each trip take?"
。
在下一个阶段,我们要求语言模型依次解决 problem decomposition
阶段所得到的子问题。
原始问题被附加为最后的子问题。
求解过程以向语言模型传递一个 prompt
而开始,这个 prompt
包括:说明问题如何解决的例子(图中未显示),然后是第一个子问题 "How long does each trip take?"
。
然后,我们采用语言模型所生成的答案("... each trip takes 5 minutes."
),并通过将所生成的答案附加到前一个 prompt
中来构建下一个 prompt
,然后是下一个子问题(在这个例子中,这恰好是原始问题)。
然后,新的 prompt
被传回语言模型,由该模型返回最终答案。
least-to-most prompting
可以与其他提示技术相结合,如 chain-of-thought
和 self-consistency
,但并不是必须得。另外,对于某些任务,least-to-most prompting
中的两个阶段可以合并,形成 single-pass prompt
。
任务:last-letter-concatenation
,其中输入是一个单词列表,输出是列表中每个单词的最后一个字母的拼接。
当测试列表与 prompt exemplars
中的列表具有相同的长度时,chain-of-thought prompting
做得很完美。然而,当测试列表比 prompt exemplars
中的列表长很多时,它的表现就很差。我们表明,least-to-most prompting
克服了这一限制,在长度泛化方面明显优于 chain-of-thought prompting
。
Least-to-most prompting
:Table 1
展示了任务分解阶段,Table 2
展示了子问题的解决阶段。
Chain-of-thought prompting
:chain-of-thought prompt
如下表所示。它使用的列表与 Table 2
中的 least-to-most prompt
相同。唯一区别是:对第二个列表("think, machine, learning"
)的回答是从头开始建立的,而不是使用第一个列表("think, machine"
)的输出。
实验结果:我们采用 GPT-3 code-davinci-002
。不同 prompting
方法的结果如下表所示。
任务:SCAN
,它需要将自然语言命令映射到动作序列,如下表所示。
实验结果如下表所示。
least-to-most prompting
:
任务:GSM8K
、DROP
。
我们特别感兴趣的是看大型语言模型结合 least-to-most prompting
是否能解决比 prompts
中看到的更难的问题。在这里,我们只是通过解题步骤的数量来衡量难度。
prompt
:
第一部分:"“Let’s break down this problem . . ."
,展示原始问题如何被分解为更简单的子问题;第二部分:展示如何求解子问题。
chain-of-thought prompting
:移除了 least-to-most prompting
的第一部分内容。
实验结果:
prompts
分解通常不能很好地泛化到不同的领域中。因此对于不同的领域,必须设计新的 prompt
从而进行任务分解,以达到最佳性能。
在同一领域内,decomposition
的泛化甚至会有困难。我们观察到,如果为大型语言模型提供那些具有挑战性的问题的正确分解,GSM8K
中几乎所有的问题都能被准确地解决。这一发现并不令人惊讶,而且与我们解决数学问题的经验相吻合。每当我们成功地将一个数学问题分解成我们可以解决的更简单的子问题时,我们基本上就解决了原始问题。