LLM o1 中的蒙特卡洛树搜索算法,DeepSeek论文中提到

LLM o1 中的蒙特卡洛树搜索算法,DeepSeek论文中提到

LLM o1 中的蒙特卡洛树搜索算法,DeepSeek论文中提到

凌青羽  2025年02月09日 09:30 上海

蒙特卡洛树搜索算法的核心是:选择与模拟。
蒙特卡洛树搜索算法的主要目标是:给定一个游戏状态来选择最佳的下一步。

前言

在讲解蒙特卡罗树算法之前,我们先玩一个“赌博”游戏。多臂老虎机(Multi-Armed Bandits)。

www.zeeklog.com  - LLM o1 中的蒙特卡洛树搜索算法,DeepSeek论文中提到

多臂老虎机(Multi-Armed Bandits)

游戏规则如下:赌博机有K个摇臂,每次摇动其中的任意一个摇臂,赌博机都会随机吐出一些硬币。现在允许你摇T次,请问如何尝试使得收益最大化。(有限次数的尝试的收益最大化)
思考一下,你会如何尝试?(是下面的玩法中的哪一种类型呢?)

• 纯随机(Random):每次随机选一个摇臂进行摇动。

• 劣势:能算个期望收益,但收益不是最大的。

• 仅探索(Exploration-only):每个摇臂摇动T/K次。

• 相当于每个摇臂摇动的次数都一样。(劣势:浪费次数在收益较差的摇臂上)

• 仅利用(Exploitation-only): 首先对每个摇臂摇动一次,记录收益。随后对剩余的T-K次机会全部摇收益最大的摇臂。

• 劣势:摇动一次记录的收益随机性太强,不可靠)

上述 仅探索(Exploration-only) 与 仅利用(Exploitation-only)所带来的困境也称为 Exploration-Exploitation Dilemma。

为了克服该困境

其它可以尝试的解决算法为:

(1)  -贪心算法:在探索与利用之间进行平衡的搜索算法

具体执行过程为,在第t步,-贪心算法按照如下机制来选择摇动赌博机:

• 以  的概率,选择在过去t-1次摇动赌博机所得平均收益最高的摇臂进行摇动;

• 以  的概率,随机选择一个摇臂进行摇动。
上述贪心算法的不足为没有充分的考虑到每个摇臂被探索的次数。

(2)上限置信区间算法(Upper Confidence Bounds, UCB):为每个动作的奖励期望计算一个估计的范围,优先采用估计范围上限较高的动作。(也是蒙特卡洛树用到的算法)

假设每个摇臂的收益的均值为  ,估计的偏差为  ,则每次根据 的上界选择摇臂。

www.zeeklog.com  - LLM o1 中的蒙特卡洛树搜索算法,DeepSeek论文中提到

选择区间上界对应的摇臂

但如果仅根据 的上界选择摇臂,也没有充分考虑到每个摇臂被探索的次数。因此需要额外引入探索的次数的奖励。(即该节点被探索的越少,我们认为该节点越值得被探索),表示为:

其中j表示第j个摇臂,  表示第j个摇臂的平均收益,C为固定常数,  为截至目前摇动摇臂的总次数,  为第j个摇臂被摇动的次数。

然而,上述多摇臂赌博机每轮只需要做一次决策(即摇动哪根杆子),在一些更复杂的游戏中(例如下围棋、打文明6、打LOL),你的每一步决策都会影响到你的游戏的胜率,你最后的输赢取决于你所有的决策步骤。如何能依据当前的状态做好决策,对于游戏的输赢至关重要。

蒙特卡罗树搜索(Monte Carlo Tree Search,MCTS)

概述

蒙特卡洛树搜索的目的就是选择最优决策。结合了随机模拟的通用性和树搜索的准确性。理论上,任何可以被用{State,Action}所定义且能通过模拟预测结果的问题,都可以用MCTS来解决。
MCTS的具体实现步骤如下图所示,主要包含4部分。

www.zeeklog.com  - LLM o1 中的蒙特卡洛树搜索算法,DeepSeek论文中提到

1. 选择 (Selection)

从根节点R开始,递归地选择最优子节点(通过UCB,后续节点选择展开讲解),直到到达叶子节点L。

2. 探索 (Expansion)

如果L不是终止节点(即它没有结束游戏),则创建一或多个子节点并从中随机选择一个子节点C进行探索。

3. 模拟/仿真 (Simulation、Rollout)

从C运行一个模拟的rollout,直到获得一个结果。(后续节点模拟会举例子展开讲解如何模拟)

4. 反传 (Backpropagation)

用模拟结果(终止节点的代价或游戏的终局分数)更新当前的移动序列,更新模拟路径中节点的奖励均值和被访问次数。注意,反传的过程中,每个节点必须包含两个重要的信息:基于模拟结果的估计值和它被访问的次数。
在完成了反向传播这一步,我们就会持续迭代,回到选择这一步,然后再进行探索仿真,然后再反向传播,再回到选择探索仿真,不断地迭代下去,直到算法结束并且给出最终决策。

在其最简单和最节省内存的实现中,MCTS将在每次迭代中添加一个子节点。不过,根据应用程序的不同,每次迭代添加多个子节点可能是有益的,这个需要通过实验来评估。

节点选择

和刚刚上面提到的赌博机类似,我们在树的递归选择最优子节点时,通常会选择预期收益最大的子节点。因此,我们可以利用上限置信区间算法(Upper Confidence Bounds, UCB)来选择子节点。

其中j表示第j个子节点,  表示第j个子节点的预期收益,C为固定常数,  为截至目前其父节点被访问到的总次数,  为第j个子节点被访问的次数。

可以看到UCB公式在利用已知奖励进行开发的同时,鼓励对未被充分探索的节点进行探索。由于预期收益的估计值基于随机模拟,因此节点必须被多次访问后,这些估计值才变得可靠;MCTS估计值在搜索的初期通常不可靠,但在足够的时间和无限的时间下,会趋向于更可靠的估计值。
在后续的研究中,Kocsis and Szepervari (2006)将UCB扩展到minimax 树搜索中,称之为Upper Confidence Bounds for Trees (UCT)。 UCT=MCTS + UCB。

节点模拟

从子节点C开始,运行一个模拟的输出,直到游戏结束。举个例子:例如说 五子棋,给你一个下到一半的残局(子节点C),让你和AI下十次(模拟十次),如果你赢了九次(获胜 9次),那么这个残局(子节点C)的奖励得分就会很高,反之则比较低。
更详细的示例在的Blog中有描述:

https://blog.csdn.net/qq_41033011/article/details/109034887[1]

LLM o1中的蒙特卡洛搜索树算法

GPT4-o1中(可能)有用到蒙特卡洛搜索树算法,可以在不训练模型的情况下,通过增加模型的推理时间,增强模型的推理性能。
本Blog所讲解的算法主要参考《Accessing GPT-4 level Mathematical Olympiad Solutions via Monte Carlo Tree Self-refine with LLaMa-3 8B- A Technical Report》

MCT Self-Refine (MCTSr)

MCT Self-Refine算法将蒙特卡罗树搜索(MCTS)与大型语言模型(LLMs)结合。通过Self-reflective 驱动 Self-improvement来改进最终LLM输出的结果。
符号定义(建议参考论文原文)

符号 表示

• P 待解决的问题(Problem)

• A 一系列节点,每个节点表示问题P的潜在的答案

• M 一个set,存储每个节点上的一系列的actions,表示对于答案的可能的自我完善的修正

• R 一个function,可以通过对原始答案修改的质量和有效性来采样得到nodes的self-rewards。

• R_a 一个set,用于存储节点a中从函数R中得到的self-rewards的采样的结果。

• T 一个function,用于评估搜索过程是否达到了最大迭代次数或者满足性能需求。

• Q(a) 一个value function,用于评估节点a处的答案的价值;由累积的rewards R_a 和 从子节点中的反传结果得到。

• U(a) 一个function,用于得到节点a处的Q所对应的上限置信区间,用于平衡探索和利用阶段,避免Exploration-Exploitation Dilemma。

• Father(a) 一个function,用于返回节点a的父节点。如果节点a已经是父节点,则返回 null。

• Children(a) 一个function,用于返回节点a的所有的子节点的集合(set)。表示通过执行一系列actions m \in M,所得到的所有的可能的状态。

• N(a) 一个function,用于返回节点a被访问到的次数,用于计算UCB的值,评估被探索和被利用的状态。本质上, N(a) = |R_a|

方法

MCTSr的方法是基于MCTS改进而来,其流程和MCTS很相似,但是结合了LLM:

1. 初始化(Initialization)
建立根节点,即用LLM生成的初始答案或预设响应(如‘I don't know’)构造。来最小化模型过拟合的趋势。

2. 选择(Selection)
为了进一步的探索,利用函数Q来对所有未被探索到的节点的答案进行价值排序。随后选择价值最高的节点进行进一步探索,并且用贪心算法进行细化。

3. Self-Refine
对被选择到的 答案a 进行自我优化。即通过用LLM生成答案反馈m,来指导LLM得到优化后的 答案a'

4. Self-Evaluation

对优化后的 答案a' 计算价值得分 Q。

5. 回传(Backpropagation)

对优化后的答案的价值得分进行回传到其父节点和其他的相关节点,来更新 树的信息。如果任意节点的Q值发生变化,其父节点的Q值也会随之改变。

6. UCT update

在所有节点的Q值被更新后,需要确定候选的节点集合用于进一步的探索和选择。我们需要使用UCT来更新所有节点的UCT值,用于下一次的选择(Selection)。
上述流程会不断迭代,直到满足函数T为止。(即达到最大迭代次数,或得到满意答案)

更多细节展开

• Self-Refine 阶段
在Self-Refine 阶段,模型在多轮对话的提示的引导下,对问题P的答案a进行优化。首先,模型对a产生反思性或批评性评论m。随后,在m的引导下,模型修改a,产生改进版本*a'。*这种迭代的Refine提高了响应的质量,利用结构化的反馈来驱动答案的修正。

• Self-Evaluation 阶段
在对问题P的精炼过程中,由于从答案a到其改写形式的答案a'的马尔可夫性质,我们将答案a的Q值定义为进一步将答案a精炼为更优答案的期望。不像传统的MCTS, Q(s, a)估计状态s中动作a的值,这里的Q(a)来自于答案a的奖励函数值的多个采样。

注意,模型利用 Self-reward 方法来 评估答案a的reward,因此需要提供一个 reward 分数,从 -100到100。如果在没有约束的情况下,模型的reward可能会趋向一个均值,导致不同的答案之间缺乏差异性,为了解决这个问题,对Self-reward方法加了一些约束:

1. Prompt 约束: LLM被要求严格遵循Prompt,来得到reward scoring

2. 满分抑制 (Full Score Suppression):模型被限制提交满分,任何超过95分的分数都会被减去一个常数,来限制高分

3. 重复采样 (Repeated Sampling):通过对被选择的节点进行重复采样,来增强Self-Evaluation的可靠性。
完成采样后,需要对 答案a 计算 价值 Q。为了避免价值Q过于平滑,对其价值Q的计算加入一个 最小价值,来进一步提高答案的评估质量:

其中 Q(a)是对答案a 的 价值评估值。  是一系列由答案a 得到的 reward samples,min  表示最小的 reward。|  | 是一共采样的数量。即通过多次采样和加上最小的reward值,来得到一个Q(a)均值。

• Backpropagation 阶段
在得到所有节点的rewards后,下一步需要将这些rewards反传回其父节点和相关的祖先节点。即可表示为:

其中,Q(a)是仅考虑其reward samples的原始Q值,  表示其一系列子节点的最高的Q值。

• UCT update 和 选择阶段
在完成对所有节点的Q的更新后,下一步是计算每个节点的UCT值,以方便下一轮的迭代与选择。作者利用数学问题优化过程的马尔可夫性质,选择所有叶节点和未完全扩展的节点作为候选集C。
然而,LLM产生的候选状态有很多,如何定义 未完全扩展?作者设置了两种完全扩展的约束:

1. 节点的子节点数量达到了预先定义好的限制。

2. 至少一个子节点Q的值超过了当前节点的Q值

确定候选集C后,如何来从中选择要探索的节点a,作者使用了UCT的公式:

其中 Q(a)表示节点a(答案a)的价值Q。N(·)表示节点a被访问的次数。c是常数,用来平衡 探索和利用困境。

● 停止阶段(函数T)
当搜索结果的改进减少或连续搜索产生重复结果时终止。一旦满足搜索结果,就可以从树中选择最佳答案。

参考与引用

引用链接

[1] https://blog.csdn.net/qq\_41033011/article/details/109034887:https://blog.csdn.net/qq_41033011/article/details/109034887\
[2]https://www.geeksforgeeks.org/ml\-monte\-carlo\-tree\-search\-mcts/:https://www.geeksforgeeks.org/ml-monte-carlo-tree-search-mcts/
[3]https://www.lamda.nju.edu.cn/guolz/introai\-slides/lec4\.pdf:https://www.lamda.nju.edu.cn/guolz/introai-slides/lec4.pdf
[4]https://blog.csdn.net/qq\_41033011/article/details/109034887:https://blog.csdn.net/qq_41033011/article/details/109034887\
[5]https://www.cs.swarthmore.edu/\~mitchell/classes/cs63/f20/reading/mcts.html:https://www.cs.swarthmore.edu/~mitchell/classes/cs63/f20/reading/mcts.html
[6]https://arxiv.org/pdf/2406\.07394:https://arxiv.org/pdf/2406.07394

[7] https://zhuanlan.zhihu.com/p/9644482549

Read more

超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk
1239.串联字符串的最大长度 关于字符串的回溯算法!

1239.串联字符串的最大长度 关于字符串的回溯算法!

题目: 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。 请返回所有可行解 s 中最长长度。 提示: 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母 示例: 示例 1: 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是

By Ne0inhk