如何提升大模型的推理和规划能力:思维链 CoT + 由少至多提示 Least-to-Most Prompting

如何提升大模型的推理和规划能力

    • 思维链 - CoT
      • 思维链改进:Auto-CoT
    • 由少至多提示 - Least-to-Most Prompting

思维链 - CoT

最初的语言模型都是基于经验的,只能根据词汇之间的相关性输出答案,根本没有思考能力……

但是从使用思维链后,大模型已经是有思考能力的。能进行一定的推理。

2021年,OpenAI在训练神经网络过程中有一个意外发现。

神经网络他可以很好地模仿现有的数据,很少犯错误。

可是如果你给他出个没练过的题目,他还是说不好。于是你就让他继续练。

继续训练好像没什么意义,因为现在只要是模仿他就都能说得很好,只要是真的即兴发挥他就不会。

但你不为所动,还是让他练。


1 0 2 10^2 102 1 0 5 10^5 105 训练完全没有成果。

就这样练啊练,惊奇地发现,他会即兴演讲了!给他一个什么题目,他都能现编现讲,发挥得很好!

  • 一千步乃至一万步,模型对训练题的表现已经非常好了,但是对生成性题目几乎没有能力
  • 练到10万步,模型做训练题的成绩已经很完美,对生成性题也开始有表现了
  • 练到100万步,模型对生成性题目居然达到了接近100%的精确度

这就是量变产生质变。研究者把这个现象称为「开悟(Grokking)」。

2022年8月,谷歌大脑研究者发布一篇论文,专门讲了大型语言模型的一些涌现能力,包括少样本学习、突然学会做加减法、突然之间能做大规模、多任务的语言理解、学会分类等等……

而这些能力只有当模型参数超过1000亿才会出现 —— 涌现新能力的关键机制,叫 思维链

此前的模式是直接让模型输出结果,而忽略了其中的思考过程。

人类在解决包括数学应用题在内的,涉及多步推理的问题时,通常会逐步书写整个解题过程的中间步骤,最终得出答案。如果明确告知模型先输出中间推理步骤,再根据生成的步骤得出答案,是否能够提升其推理表现呢?

除了将问题输入给模型外,还将类似题目的解题思路和步骤输入模型,使得模型不仅输出最终结果,还输出中间步骤,从而提升模型的推理能力的方法。

思维链就是当模型听到一个东西之后,它会嘟嘟囔囔自说自话地,把它知道的有关这个东西的各种事情一个个说出来。

思维链是如何让语言模型有了思考能力的呢?

比如你让模型描写一下“夏天”,它会说:“夏天是个阳光明媚的季节,人们可以去海滩游泳,可以在户外野餐……”等等。

只要思考过程可以用语言描写,语言模型就有这个思考能力。

怎么用思维链呢?

思维链的主要思想是通过向大语言模型展示一些少量的样例,在样例中解释推理过程。

那大语言模型在回答提示时也会显示推理过程,这种推理的解释往往会引导出更准确的结果。

既然如此,只要我们设置好让模型每次都先思考一番再回答问题,ta就能自动使用思维链,ta就有了思考能力。

CoT(链式思考)已被证实能够改善大型AI模型在算术、常识和符号推理等任务上的表现。

用户发现,当他们在问题中添加“让我们一步步来思考”时,模型仿佛被施了魔法,之前答错的数学题突然能够正确解答,原本无理的论述变得有条有理。

不过,CoT对模型性能的提升与模型的大小成正比关系,模型参数至少达到100亿才有效果,达到1000亿效果才明显。

研究中指出,处理策略性问题通常需要大量的世界知识。

然而,小型模型由于其有限的参数,往往难以存储这些庞大的知识信息,这限制了它们在产生正确推理步骤方面的能力。

思维链改进:Auto-CoT

使用了人工构造的思维链。然而,由不同人员编写的推理范例,在准确率上存在高达 28.2% 的差异。

因此,如果能够自动构建具有良好问题和推理链的范例,则可以大幅度提升推理效果。

Auto-CoT 可以让机器从各种问题中学习,生成多种多样的推理链。

这个方法首先把类似的问题分成不同的组,然后从每一组中挑选出代表性的问题,并让机器学习如何解答这些问题。

  • 问题向量表示:使用 Sentence-BERT 对问题进行编码。
  • 聚类算法:使用 K-means 根据问题的向量表示进行聚类。
  • 排序:根据问题到聚类中心的距离进行排序。
  • 范例构建:选择距离中心近的问题,并生成推理链。
  1. Clustering(聚类): 将类似问题通过聚类算法分组,如图中的几个小圆圈所示。

  2. LLM Demo Construction(LLM 示范构建): 根据选择的标准,从每个问题簇中抽取一个代表性的问题,并利用语言模型构建出问题的解决步骤或推理链,即“Let’s think step by step…”的过程。

  3. Sampling by Selection Criteria(按选择标准抽样): 从每个簇中选取问题并生成推理链,这可能包括使用问题本身作为提示输入到模型中,并观察模型如何一步一步解决问题。

  4. Test Question(测试问题): 这是一个实际例子,说明了如何将上述方法应用于一个具体的问题——宠物店的问题。在这个例子中,解释了宠物店如何根据出售的小狗数量和每个笼子里的小狗数量来决定需要多少笼子。

这种方法可以提升大型语言模型处理复杂、多步骤问题的能力,尤其是需要详细解释步骤的场合中。

以及强调多样性在构建有效范例中的重要性。

 
也还有一些研究人员提出了对思维链提示的改进方法,例如从训练样本中选取推理最复杂的样本来形成示例样本,被称为 Complex-CoT。

也有研究者指出可以从问题角度考虑优化思维链提示,通过将复杂的、模糊的、低质量的问题优化为模型更易理解的高质量问题,进一步提升思维链提示的性能,被称为 Self-Polish。

 


由少至多提示 - Least-to-Most Prompting

通过引导模型首先将复杂问题分解为多个较为简单的子问题,然后逐一解决这些子问题,可引导模型得出最终解答,这种策略被称为 由少至多提示。

当面对复杂任务或者问题时,人类通常倾向于将其转化为多个更容易解决的子任务/子问题,并逐一解决它们,得到最终想要的答案或者结果。

这种能力就是通常所说的任务分解能力。

基于这种问题解决思路,研究人员们提出了由 少至多提示 (Least-to-Most Prompting)方法。

主要包含两个阶段:

  • 问题分解阶段
  • 逐步解决子问题阶段

在问题分解阶段中,模型的输入包括 k×[原始问题,子问题列表] 的组合,以及要测试的原始问题;

在逐步解决子问题阶段中,模型的输入包括 k×[原始问题,m×(子问题,子答案)] 元组,以及要测试的原始问题和当前要解决的子问题。

阶段 1:问题简化

  • 在这个阶段,原始问题是关于Amy在水滑梯关闭前可以滑多少次的。问题的复杂性在于它包含多个步骤的计算。

阶段 2:顺序解决子问题

为了解决这个问题,语言模型采取了分步骤的方法,将原始问题分解为两个子问题。

  • 子问题 1: 首先,模型被问到每次滑行需要多少时间。这是解决原始问题的第一步,因为只有知道了每次滑行的时间,我们才能计算出Amy在水滑梯关闭前可以滑多少次。

    模型的答案是:每次滑行需要5分钟(爬上去需要4分钟,滑下来需要1分钟)。

  • 子问题 2: 接下来,模型使用了子问题 1 的答案来解决最初的问题——Amy在水滑梯关闭前可以滑多少次。

    模型的答案是:水滑梯在15分钟内关闭,每次滑行需要5分钟,所以Amy可以在水滑梯关闭前滑3次。

通过将一个问题分解成多个更简单的子问题,一个语言模型可以逐步构建答案,并最终解决原始问题。

分步解决问题的逻辑思维,及如何有效地使用语言模型来辅助问题解决过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/338821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阶段七性能测试jmeter报告图表,并发数和Locust

一级目录报告图表 1.聚合报告 重点关心的性能指标: 响应时间 1.观察当前的最大最小值的波动范围 2. 如果波动范围不大,以平均响应时间作为最终的性能响应时间结果 3.如果波动范围很大,以90%(经验的响应时间作为最终性能响应时间…

Linux入门攻坚——13、实战软件安装-搭建Python3.8环境-1

到现在,应该可以进行软件安装的实践了。 前面学习Python时,就像搭建一个Linux的服务器环境,一直没有成功,现在尝试在CentOS6.10上搭建Python3.8环境。 安装软件前,需要的前置条件其一就是网络是连通的,Li…

云边协同的 RTC 如何助力即构全球实时互动业务实践

作者:即构科技 由 51 CTO 主办的“WOT 全球技术创新大会 2023深圳站”于 11 月 24 日 - 25 日召开,即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充,通过边缘容器架构和…

配置DNS主从服务器,实现真反向解析

主服务器 [rootbogon ~]# systemctl stop firewalld.service #关闭防火墙 [rootbogon ~]# setenforce 0 #关闭selinux [rootbogon ~]# systemctl restart named #启动dns服务 [rootbogon ~]# vim /etc/named.conf #进入dns配置文件 options {#监听…

进程内协同:原子操作、互斥、同步和通信的原理

进程内协同,简单来说,就是在一个进程内部,多个执行体(如线程、协程)如何共享资源,如何协同工作以完成一项任务。这涉及到一系列的机制和技术,包括原子操作、互斥、同步和通信等。 那么&#xf…

微前端-无界wujie

无界微前端方案基于 webcomponent 容器 iframe 沙箱,能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。 主项目安装无界 vue2项目:npm i wujie-vue2 -S vue3项目…

Qt5.15.2中加入图片资源

系列文章目录 文章目录 系列文章目录前言一、加入图片资源二、代码 前言 以前用的Qt5.15.2之前的版本,QtCreator默认的工程文件是*.pro,现在用5.15.2创建工程默认的工程文件是CMameList.txt,当然在创建项目时,仍然可以使用pro工程文件用QtCr…

C#,入门教程(24)——类索引器(this)的基础知识

上一篇: C#,入门教程(23)——数据类型转换的一点基础知识https://blog.csdn.net/beijinghorn/article/details/124187182 工业软件首先要求高可靠性、高可维护性。 作为工业软件的开发者,我们对语言重载的需求是:“不可或缺”。 …

第6章 SpringBoot缓存管理

学习目标 了解SpringBoot的默认缓存 熟悉SpringBoot中Redis的缓存机制及实现 掌握SpringBoot整合Redis的缓存实现 缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问问题。在实际开发中,尤其是用户访问量较大的网站,为了提高服…

12、Kafka ------ Kafka 生产者API 用法(代码演示生产者发送消息到指定主题)

目录 Kafka 生产者API 用法(代码演示)生产者API 介绍依赖:介绍:使用生产者API发送消息步骤: 生产者发送消息代码演示:1、创建一个Maven项目2、依赖3、代码4、演示结果5、一些参数理解 Kafka 生产者API 用法…

乐意购项目前端开发 #4

一、Home页面组件结构 结构拆分 创建组件 在 views/Home 目录下创建component 目录, 然后在该目录下创建5个组件: 左侧分类(HomeCategory.vue)、Banner(HomeBanner.vue)、精选商品(HomeHot.vue)、低价商品(Homecheap.vue)、最新上架(HomeNew.vue) 引用组件 修改 views/Home…

5.2 内容管理模块 - 课程发布需求分析、分布式技术方案

内容管理模块 - 课程发布 - 分布式技术方案、 课程发布需求分析 文章目录 内容管理模块 - 课程发布 - 分布式技术方案、 课程发布需求分析一、分布式事务技术方案1.1 本地事务1.2 分布式事务1.3 CAP理论1.4 分布式事务控制方案 二、课程发布2.1 需求分析2.2 数据模型2.2.1 课程…

EasyRecovery2024专业免费的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、等所有类型的介质上恢复数据。

Ontrack EasyRecovery Home是一款企业级的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、硬件RAID及软件RAID等所有类型的介质上恢复数据。支持恢复误删除、磁盘格式化、磁盘重新分区、磁盘逻辑坏道等原因而丢失的数据。支持RAID重建!Ontrack EasyReco…

python基础学习-01

Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构,它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言: 开发过程中没有了编译这个环节。类似于PHP和Perl语言。…

「环境配置」使用Windows自带工具清理C盘空间

​ Windows电脑操作系统一般是安装在磁盘驱动器的C盘中,一旦运行,便会产生许多垃圾文件,C盘空间在一定程度上都会越来越小。伴随着电脑工作的时间越久,C盘常常会提示显示其内存已不足。本文记录笔者清理机器的步骤。 一、使用Win…

学会这个工具,小白也可制作门窗电子画册

​随着互联网技术的发展,现在制作电子画册已经变得非常简单。如果你是一个新手,也可以通过学习一些技巧来制作门窗电子画册。 那么,如何制作门窗电子画册呢?其实,这个过程并不复杂。只需要一台电脑和一个基本的操作工具…

Flask 3.x log全域配置(包含pytest)

最近使用到flask3.x,配置了全域的log,这边记录下 首先需要创建logging的配置文件,我是放在项目根目录的, Logging 配置 logging.json {"version": 1, # 配置文件版本号"formatters": {"default&qu…

「优选算法刷题」:在排序数组中查找元素的第一个和最后个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&a…

C#调用Newtonsoft.Json将bool序列化为int

使用Newtonsoft.Json将数据对象序列化为Json字符串时,如果有布尔类型的属性值时,一般会将bool类型序列化为字符串,true值序列化为true,false值序列化为false。如下面的类型序列化后的结果如下: public class UserInfo…

LINUX文件fd(file descriptor)文件描述符

目录 1.文件接口 1.1open 1.2C语言为什么要对open进行封装 2.fd demo代码 第一个问题 第二个问题 打开文件流程 引言:在学习C语言的时候,我们见过很多的文件的接口,例如fopen,fwrite,fclose等等,但…