论文浅尝 | 思维树:使用大语言模型反复思考解决问题

news2024/11/17 9:28:34

39fbe2b9ed3cfff7b44287a600bbfae8.png

笔记整理:许泽众,浙江大学博士,研究方向为知识图谱上的神经符号推理

链接:https://arxiv.org/abs/2305.10601

1. 动机

语言模型是一种强大的工具,可以用于各种需要数学、符号、常识或知识推理的任务。然而,现有的语言模型推理方法通常只能进行基于单词的、从左到右的决策过程,这意味着它们在需要探索、策略性预测或初始决策至关重要的任务上可能表现不佳。为了解决这些挑战,本文提出了一个新的语言模型推理框架,“Tree of Thoughts”(ToT),它能够在思想(thoughts)之间进行多样化的推理路径探索,其中每个思想是一个连贯的文本单元,作为问题解决的中间步骤。ToT允许语言模型通过考虑多种不同的推理路径并自我评估选择来决定下一步行动,以及在必要时进行前瞻或回溯以做出全局决策。本文在三个新颖的问题解决任务上展示了ToT显著提高了语言模型的问题解决能力:24点游戏、创意写作和迷你填字游戏。例如,在24点游戏中,使用链式思维(CoT)提示的GPT-4只能解决4%的任务,而我们的方法达到了74%的成功率。我们还通过系统地消除分析了不同选择如何影响模型性能,并讨论了未来更好地训练和使用语言模型的方向。

2. 方法

模型的整体架构如下:

03b0379646e6539dfeaa4ac9c8fd0d81.png

左边三个模型是其主要对比的baseline,都是提出prompt激活大模型能力的方法。可以看到ToT的主要区别和基本思路是1、将一个大问题分解成多个步骤的子问题,逐步解决问题;2、在每一步上,都提出多个可能的解决方法;3、判断每一步的最优解,然后在上一步的决策基础上生成下一步的多个解决方案,直到完成问题。

那么以上思路需要面对四个问题:1、如何将中间过程分解为思路步骤;2、如何从每个状态生成潜在的思路;3、如何启发式地评估状态;4、使用什么搜索算法。

论文给出的思路是:

1、如何将中间过程分解为思维步骤。这一步要求根据不同的问题特点,设计和拆分合适的思维步骤。思维步骤应该足够小,以便LM能够生成有意义和多样的候选方案,但也足够大,以便LM能够评估它们对问题解决的贡献。 

2、如何从每个状态生成潜在思维。这一步要求给定一个树节点,即一个包含输入和已有思维序列的状态,使用LM来生成一些可能的下一步思维。有两种生成策略:一种是从sample中独立采样思维,适用于思维空间丰富的情况;另一种是使用propose来顺序提出思维,适用于思维空间受限的情况。两者的区别在于前者只需要根据已有的thought多次单独生成当前一步的thought,后者需要一次性将当前一步若干个可能的thought全部生成,并且要求每个thought不能相同。

3、如何启发式地评估状态。这一步要求利用LM对不同的状态进行评估,作为搜索算法的启发式指导。有两种评估策略:一种是对每个状态单独给出一个数值或分类的评价,基于少量的前瞻模拟和常识推理;另一种是让LM在不同的状态之间进行投票式选择,基于对比和分析。这一步选择最佳状态也是将已有的输出重新输入模型中,让LLM进行打分。

4、什么样的搜索算法。这一步要求根据树的结构和问题的性质,选择合适的搜索算法来探索树上的节点。本文中考虑了两种简单的搜索算法:广度优先搜索(BFS)和深度优先搜索(DFS),并留下了更高级的搜索算法(如A*,MCTS)作为未来工作。

3. 实验

4540152320ae3b7cc5b97477cc9090ae.png

这篇文章在三个任务上进行了实验。分别是计算24点,创意写作和填字游戏。任务样例如上图所示。

对于24点游戏,其结果如下:

9fe167d6a79658151bb8af58dd6bdb1d.png

表2显示,IO、CoT和CoT-SC这三种方法在这个任务上表现不佳,成功率只有7.3%、4.0%和9.0%。相比之下,ToT在分支数量为b=1时就已经达到了45%的成功率,而b=5时则达到了74%。另外还考虑了一个IO/CoT的最优设置,通过使用最优的k个样本(1≤k≤100)来计算成功率。为了比较IO/CoT(最优的k)和ToT,我们考虑计算ToT在b=1···5时每个任务访问的树节点数,并将5个成功率映射到图3(a)中,将IO/CoT(最优的k)视为在一个bandit中访问k个节点。结果显示CoT比IO更具可扩展性,100个CoT样本的最优结果达到了49%的成功率,但仍然比在ToT中探索更多节点(b>1)要差。

对于写作任务:

1d439cb66676c25ba37c0a6156dd6411.png

图5(a)显示了100个任务的平均GPT-4分数,其中ToT(7.56)被认为比IO(6.19)和CoT(6.93)平均生成更连贯的段落。虽然这样的自动指标可能有噪音,但图5(b)通过显示人类在100对段落中有41对更喜欢ToT而只有21对更喜欢CoT来证实了这一发现(另外38对被认为“相似连贯”)。最后,迭代细化在这个自然语言任务上更有效,其中它将IO的连贯性分数从6.19提高到7.67,将ToT的连贯性分数从7.56提高到7.91。我们认为这可以被视为ToT框架中思想生成的第三种方法,即新的思想可以通过改进旧的思想而不是独立或顺序生成而产生。

对于填字任务:

78f9cb58bfbd198f717787a1807a322f.png

表3显示,IO和CoT提示方法的词级成功率低于16%,而ToT显著提高了所有指标,达到了60%的词级成功率。文章认为这是因为IO和CoT缺乏尝试不同线索、改变决策或回溯的机制。

4. 总结

这篇论文提出了一种用大型语言模型(LLM)进行有目的的问题解决的新框架,叫做“思维树”(ToT)。ToT将任何问题视为一个思维树的搜索问题,其中每个节点是一个包含输入和一系列中间思维的状态,每个思维是一个有意义的语言序列。ToT利用LLM来生成和评估不同的思维候选,并结合搜索算法来探索不同的推理路径。作者在三个需要非平凡的规划或搜索的新任务上展示了ToT的效果,分别是24点游戏、创意写作和迷你填字游戏。实验结果表明,ToT显著提高了LLM的问题解决能力,相比于现有的方法,具有更高的通用性、模块性、适应性和便利性。


OpenKG

OpenKG(中文开放知识图谱)旨在推动以中文为核心的知识图谱数据的开放、互联及众包,并促进知识图谱算法、工具及平台的开源开放。

0c67c133a6d4d5ce3fe1d92673b4491c.png

点击阅读原文,进入 OpenKG 网站。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识MyBatis(一)基于配置文件下的一些增删改查

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录 MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架 创建好m…

手机+卫星的科技狂想

最近硬件圈最火热的话题之一,应该就是突然上线、遥遥领先的华为Mate 60 Pro了。 其中,CPU和类5G网速是怎么实现的,是大家特别关注的问题。相比之下,卫星通话这个功能,讨论度就略低一些(没有说不火的意思&am…

62、SpringBoot 使用RestTemplate 整合第三方 RESTful 服务

这节的要点: 就是弄两个项目 , 从 端口9090 这个项目,通过 restTemplate, 去访问 端口8080 的项目,并获取8080项目的数据。 ★ RESTful服务包含两方面的含义 1. 自己的应用要暴露一些功能供别人来调用。此时我们是服…

postgresql-DML

DML 语句 创建示例表插入数据插入单行数据插入多行数据复制数据返回插入的数据 更新数据单表更新跨表更新返回更新后的数据 删除数据单表删除跨表删除返回被删除的数据 合并数据MERGE 语句INSERT ON CONFLICT DML 语句与 CTE 创建示例表 CREATE TABLE dept (department_id int…

面向Ai设计的Mojo编程语言支持下载,当前只有Linux系统版本

据了解,Mojo是Modular AI公司开发的专门面向AI设计的编程语言,号称比Python快68000倍。 Mojo现已开放本地下载运行,除了编译器之外,Mojo SDK还包括一整套开发者和IDE工具,并用来构建和迭代 Mojo应用。 公司方面表示&…

leetcode 589. N 叉树的前序遍历(java)

N 叉树的前序遍历 题目描述前序遍历后序遍历 题目描述 难度 - 简单 LC - 589.N叉树的前序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例…

RK3399平台开发系列讲解(内核调试篇)USB摄像头快速测试

🚀返回专栏总目录 文章目录 一、检测设备二、安装必要的库三、 mjpeg-stream 安装四、实时预览沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇介绍如何快速测试 USB 摄像头。 一、检测设备 将 USB 摄像头插上,查看是否找到设备,输入指令:v4l2-ctl --list-d…

vuex中actions异步调用以及读取值

项目场景: 提示:这里简述项目相关背景: 将根据segmentId查出来的合同信息托管到vuex中,让每个人都可以获取到合同信息 描述以及问题点 1:调用vuex异步函数的语法是 this.$store.dispatch(actions方法名,值) 2&#…

JUC并发编程--------线程安全篇

目录 什么是线程安全性问题? 如何实现线程安全? 1、线程封闭 2、无状态的类 3、让类不可变 4、加锁和CAS 并发环境下的线程安全问题有哪些? 1、死锁 2、活锁 3、线程饥饿 什么是线程安全性问题? 我们可以这么理解&#…

计算机竞赛 基于设深度学习的人脸性别年龄识别系统

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习机器视觉的…

如何设计一个复杂的业务系统

一、设计要干啥 作为一个企业级应用架构,自然会把专注点转移到业务应用功能性设计本身上来。现在来说对于一个复杂业务架构进行设计,我们要想做到又快又好,无非是两种情况:一是架构师本身对业务理解很深、能力超强、炉火纯青&…

QT QMdiArea控件 使用详解

本文详细的介绍了QMdiArea控件的各种操作,例如:新建界面、源代码、添加界面、移除一个子窗口、设置活动子窗口、子窗口级联排列、子窗口平铺排列、关闭当前子窗口、关闭当前子窗口、返回当前子窗口、返回当前子窗口、返回子窗口列表、信号槽、单击信号、…

使用python-docx对doc文档修改页眉时,遇到的一点小问题

之前在百度和google搜到的也修改页眉的方式,代码如下 import docx # 打开 Word 文档 doc docx.Document(sample.docx) # 遍历每个节 for section in doc.sections: # 获取节的页眉 header section.header # 获取页眉中的段落 p header.paragraphs[0] # 替换段落…

冒泡排序、选择排序、插入排序、希尔排序

冒泡排序 基本思想 代码实现 # 冒泡排序 def bubble_sort(arr):length len(arr) - 1for i in range(length):flag Truefor j in range(length - i):if arr[j] > arr[j 1]:temp arr[j]arr[j] arr[j 1]arr[j 1] tempflag Falseprint(f第{i 1}趟的排序结果为&#…

基于51单片机+DS1302时钟模块+4位数码管显示

一、DS1302时钟模块简介 二、绘制Proteus 仿真电路图 三、编写51单片机代码 #include "DS1302.h"// 位定义 sbit DS1302_DATA P3^3; sbit SCLK P3^2; sbit RST P3^1;// 向DS1302写一个字节 void DS1302_Write_Byte(unsigned char addrOrData) {unsigned char i;f…

RocketMQ的架构及概念

RocketMQ就是一个消息中间键用于实现异步传输与解耦 那什么是消息中间键呢? 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展…

CSP 201312-1 出现次数最多的数

答题 用两个map&#xff0c;一个map记录每个数出现的次数并降序排序&#xff0c;另一个map将次数作为键&#xff0c;数本身作为值&#xff0c;降序排序&#xff0c;搞定 #include<iostream> #include<map> using namespace std; int main(){map<int,int,great…

arm栈推导

按照栈生长方向分&#xff1a;可以分为递增栈&#xff08;向高地址生长&#xff09;&#xff1b;递减栈&#xff08;向低地址生长&#xff09; 按照sp执行位置来分&#xff1a;满栈&#xff08;sp指向栈顶元素的位置&#xff09;&#xff1b;空栈&#xff08;sp指向即将入栈的…

ChatGPT 和 Elasticsearch:APM 工具、性能和成本分析

作者&#xff1a;LUCA WINTERGERST 在本博客中&#xff0c;我们将测试一个使用 OpenAI 的 Python 应用程序并分析其性能以及运行该应用程序的成本。 使用从应用程序收集的数据&#xff0c;我们还将展示如何将 LLMs 成到你的应用程序中。 在之前的博客文章中&#xff0c;我们构建…

SpringBoot+Vue 整合websocket实现简单聊天窗口

效果图 1 输入临时名字充当账号使用 2 进入聊天窗口 3 发送消息 &#xff08;复制一个页面&#xff0c;输入其他名字&#xff0c;方便展示效果&#xff09; 4 其他窗口效果 代码实现 后端SpringBoot项目&#xff0c;自行创建 pom依赖 <dependency><groupId…