大模型思维链经典论文阅读之——Zero-shot CoT, Manual CoT, AutoCoT

来自:SimpleAI

进NLP群—>加入NLP交流群

ChatGPT 以及 GPT4 作为纯自回归式语言模型,本不应该期待其有什么推理能力,尤其是数学推理,但是他们在基础的推理任务上却十分让我们惊艳(当然肯定不能作为专业的数学解题工具),这让我们非常好奇大模型(LLM)这么多参数里面到底藏了些什么好东西,怎么去激发大模型的潜能给我们带来更多惊喜。

CoT(Chain of thought),思维链,是学者们发现的能够激发LLM通过“思考”来回答一些困难问题的技术,可以显著提高LLM在推理等任务上的正确率。根据猜测,CoT的思想也被用于训练ChatGPT/GPT4,因为它们在回答一些需要推理的任务时,会先给出一步步的推理,再给出答案,而ChatGPT之前的LLM则经常直接给出答案。因此,让我们来一起回顾一下ChatGPT之前,CoT技术如何运用于LLM并提升模型回答的准确性的。

本次主要回顾三篇论文:

  1. CoT 开山之作:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models,NeurIPS2022

  2. Zero-Shot-CoT:Large language models are zero-shot reasoners. NeurIPS2022

  3. AuTo-CoT:Automatic Chain of Thought Prompting in Large Language Models,ICLR2023

一、CoT的起源和开山之作

  • Chain-of-Thought Prompting Elicits Reasoning in Large Language Models,NeurIPS2022

  • Jason Wei, Xuezhi Wang, Dale Schuurmans, Maarten Bosma, Brian Ichter, Fei Xia, Ed Chi, Quoc Le, Denny Zhou(谷歌)

这篇文章很简单很简单,虽然洋洋洒洒写了几十页,但是核心方法一张图就可以表达清楚:

ab10f615a526f08ee40056a38cc3903d.png

一句话:在问LLM问题前,手工在prompt里面加入一些包含思维过程(Chain of thought)的问答示例,就可以让LLM在推理任务上大幅提升。

注意,这里首先是使用 In-Context-Learning(上下文学习)的范式来进行prompt,即在prompt里面添加一些问答对作为“示范”,LLM在看到这些示范之后,就可以更好地进行Zero-shot任务(或者理解成Few-shot吧,毕竟需要提供一些标注的样本)了。

CoT的方法,就是在 In-Context-Learning 的范式中,增加了对推理的示范,从而希望LLM在给出答案的时候,也像模像样地进行推理。

作者在一些代表性LLM中队这样的方法做了大量实验,其中LLMs包括下面这些:

521b13ab180d07b77d79c22773c5fa53.png

实验结果如下:

8a14888c7c27e5f7a4ec4a8fc41bd588.png

CoT的方法,相比于普通的ICL方式,显著提高了模型的推理能力,而且随着模型规模的增大提升的愈发明显。

这种CoT的方法,虽然十分有效,但需要手工写很多推理过程交给模型作为示范,虽然说对于同一类问题我们只用写一套就行了,但是当场景一换,或者问题改变时,之前有效的示范,可能效果就会打折了,因此还是比较费劲的。

于是,很快啊,就有学者提出了名为Zero-shot CoT的方法。

二、不用动手的傻瓜式CoT——Zero-shot CoT

  • Large language models are zero-shot reasoners. NeurIPS2022

  • Takeshi Kojima, Shixiang Shane Gu, Machel Reid, Yutaka Matsuo, Yusuke Iwasawa(东京大学,谷歌)

2c035ff396b20a6b5b689d09bcc14d7f.png

这篇文章发现:大模型,尤其是足够大的模型,可能不需要你费劲吧啦地写一堆CoT来作为prompt了,它自己可能就会推理了,秘诀就是加上一句咒语:“Let's think step by step.”

具体则是需要LLM两次生成:

  1. 先使用 “Let's think step by step.” 让模型自己给出推理过程

  2. 把原始问题以及给出的推理过程再合在一起,让模型抽取出最终答案。

其实第二步是不一定需要的,这里只是为了直接给出答案,所以加了第二步。

下图对比了Zero-shot CoT跟其他方法的差别:

57f06bf99d977478b98d777497cdfb43.png

本文测试的LLMs主要是这些:

aca9143eaf1c1953ce283966908a420f.png

主要效果如下(为了省空间,我只贴出跟Zero-shot的对比了):

be9e315e8d32e66b87f11ef1749da8c6.png

可以看到,这个Zero-shot CoT还是可以显著提升LLM的数学推理能力的。

还有一些跟Few-shot CoT和其他CoT改进版本的对比,这里就不放了,重点是这个工作发现了一些值得思考的问题:

  • Zero-shot CoT和Few-shot CoT在常识推理问题(CommonsenseQA)上,并没有太大的提升(相比于数学推理)。很多时候CoT给不出正确的答案,但是推理过程却是合理且灵活的。Zero-shot CoT在多项选择时,倾向于给出多个答案,很难只给出一个答案。

  • 在数学推理问题上,CoT能有显著的提升,但是Zero-shot CoT和Few-shot CoT犯错误时的特点很不一样:Zero-shot方法在推出正确答案后,可能会继续“画蛇添足”,导致最终错误;另外,Zero-shot有时候干脆不推理,直接重复题目。Few-shot方法则是在生成的推理过程中包含三元运算的时候很容易出错,例如(3+2)*4

总体上,Few-shot CoT(又可以称之为Manual-CoT)的效果还是比Zero-shot CoT更好的,毕竟你手动认真地写了很多示范,努力不会白费嘛。下面介绍的一篇文章,则尝试把二者进行结合,企图既省力、效果又好。

三、通往自动CoT之路?

  • Automatic Chain of Thought Prompting in Large Language Models,ICLR2023

  • Zhuosheng Zhang, Aston Zhang, Mu Li, Alex Smola(上交,亚马逊)

回顾上面讲的 Zero-shot CoT 和 Manual CoT,前者实际上没有使用 In-Context-Learning,而后者使用了 In-Context-Learning。ICL 提供了LLM更多的示范信息,可能能让LLM在输出的时候更加规范。

因此,一个自然的想法就是,能不能利用 Zero-shot CoT 来让 LLM 产生很多带有推理的QA pair,然后把这些QA pair加入到prompt中,构成ICL的上文,再让LLM进行推理。

作者假设的是这样一个场景:我们有一大堆的待测试的问题(没有标注,不知道正确答案和推理过程),我们要怎么利用 LLM 和这么一个无标注问题集合,在不进行手工编写CoT的情况下,提升LLM回答这些模型的质量。

作者的基本思路是这样的:

  • 给定待测试的问题q,从无标注问题集合中,采样一批问题;

  • 使用 GPT-3 作为产生推理过程的工具,即直接使用 “Let's think step by step.” 咒语,来对这一批采样的问题产生推理过程;

  • 把产生的这些问题和推理过程,构成In-Context-Learning的上文加入到prompt中,再让LLM对问题q进行回答。

关键就在于这个采样过程,作者分别先测试了两种简单的采样过程:

  1. 随机采样,Random-Q-CoT

  2. 基于跟待测试q的相似度进行采样,Retrieval-Q-CoT

实验发现,居然随机采样还要更好一些。经过探究,作者发现GPT-3自动产生推理过程是有一定比例出错的,而出错的问题也容易聚集

2f6fb38e69f3fd8bdee9c812e41476c6.png

因此基于相似度搜索的时候,容易导致采样出一批错误的示范,而随机采样的方法,则可能避免聚集性地出错。

基于这样的考虑,作者设计了基于多样性的采样方法,先试用SentenceBERT对所有问题进行聚类,然后从每个cluster中进行采样,示意图如下:

0f7c579325e05aa363244e8767bb53c3.png

具体采样过程则是:

  • 假设需要再In-Context-Learning的时候加入k个示例,则对问题集合聚k类

  • 对于每个cluster中的问题,按照每个问题跟cluster中心点的相似度来排序

  • 每个cluster采样一个问题,距离中心点越近的越优先采样,但是得符合一些规则:

    • 问题不超过60个token,通过Zero-shot-CoT产生的推理步骤不超过5步(也是前人的经验,简单原则)

就这样采样。。。

其实这个方法让人有些不解,因为采样过程是跟要测试的问题无关的,按照我的理解,应该在考虑多样性的同时,还考虑问题跟待测试问题的相关性(不确定是我对本文方法理解错了,如有错误请读者告知)。

总之,这样子就确实在给定一个问题集合的情况下,解放了双手。

Auto-CoT跟Zero-shot、Few-shot CoT的对比实验如下:

67df89d27d5910b1ed18a8a639d21caa.png
image-20230602224952606

这个结果还是令人惊讶的,Auto的方法居然可以比Manual更好。其实有一种解释,Manual方法其实给多个任务都使用的是同一套模板,比方6个数学任务里面5个都使用的同一套示例(为了省力,同时Manual-CoT的论文也不是为了刷榜,而是为了揭示这么一个现象,所以CoT没有进行仔细调优),而Auto-CoT则是每个任务都会有自己的一套示例产生,毕竟问题集合不一样,聚类的结果也会不一样。

总之,这个方法主要证明了基于多样性的采样方法,对于CoT可能是很有效的。(虽然我近期还看了一篇探讨In-Context-Learning的论文得到的结论跟这个是矛盾的,那篇文章揭示了基于相似度的采样可能比基于多样性的采样更好,具体为什么会有这样的矛盾,可能需要更细致的探究)


进NLP群—>加入NLP交流群

猜你喜欢

转载自blog.csdn.net/qq_27590277/article/details/131546280
Cot