其实在强化学习入门阶段就听说过蒙特卡洛搜索,比如多臂赌博机其实就是一个单一状态蒙特卡洛规划。
在多臂赌博机的研究过程中,上限置信区间(Upper Confidence Bound,UCB)成为一种较为成功的策略学习方法,因为其在探索-利用之间取得平衡,基于过去产生的平均回报,和对未来期望回报的累积来做选择。
公式第一项表现的是利用,就是选取过去时刻获得奖励最大的策略;公式第二项表现的是探索,去选取可能带来大奖励的策略,往往选择的是在过去时刻比较少被选择的策略。
rollout算法是一种基于蒙特卡洛控制的决策时规划算法,这里的蒙特卡洛控制应用于以当前环境状态为起点的采样模拟轨迹。
rollout算法通过平均许多起始于每一个可能的动作并遵循给定的策略的模拟轨迹的回报来估计动作价值。当动作价值的估计被认为足够准确时,对应最高估计值的动作(或多个动作中的一个)会被执行,之后这个过程再从得到的后继状态继续进行。但是预演(rollout)算法的目标不是估计一个最优动作价值函数,或对于给定策略的完整的动作价值函数。相反,它们仅仅对每一个当前状态以及一个给定的被称为预演策略的策略做出动作价值的蒙特卡洛估计。预演算法只是即时地利用这些动作价值的估计值,之后就丢弃了。
预演算法的目的是为了改进预演策略的性能,而不是找到最优的策略。基础预演策略越好,价值估计越准确,预演算法得到的策略就越可能更好。但是好的预演策略需要花更多的时间,可以通过一些方法缓解,由于蒙特卡洛实验之间是相互独立的,因此可以在多个独立的处理器上并行的进行多次实验。另一个办法是在尚未完成时就截断模拟轨迹,利用预存的评估函数来更正截断的回报值。还有一种可行方法是监控蒙特卡洛模拟过程并对不太可能是最优的,或者最优值很接近的动作进行剪枝。
思考:基础版本的预演算法为什么效率不高?
1.轨迹之间没有聚焦,“一视同仁”;
2.对轨迹经验本身的利用率不足。
思考:基础版本的预演算法如何提高效率?
1.可以截断轨迹;
2.轨迹采样可以并行;
3.算法改进(即蒙特卡洛树搜索)
蒙特卡洛树搜索(The Monte Carlo Tree Search)是一类树搜索算法的统称,简称MCTS,是一种用于某些决策过程的启发式搜索算法,在搜索空间巨大的游戏中比较有效。蒙特卡洛树搜索基于采样来得到结果,而非穷举式枚举(虽然枚举过程中也可剪掉若干不影响结果的分支)。从全局来看,蒙特卡洛树搜索的主要目标是:给定一个游戏状态来选择最佳的下一步。
算法过程:
- 选择(Selection):选择能够最大化UCB值的节点;
- 扩展(Node Expansion):创建一个或多个子节点;
- 仿真/预演(Simulation):在某一个节点用随即策略进行游戏,又称为playout或rollout;
- 反向传播(Back Propagation):使用随机搜索的结果来更新整个搜索树。
流程图:
叶节点:一棵树当中没有子节点(即度为0)的节点,简单的说就是一个二叉树任意一个分支上的终端节点。
选择(Selection)
从根节点出发,向下递归选择子节点,直至选择一个叶子节点,通常用UCB选择最具“潜力”的后续节点。(如果是围棋比赛的话,每个节点可以看成一个棋面)
- Vi:该节点下的平均 Value 大小,比如说好的一步它的 Value 更大一些,差的一步相对来说要小一些;
- c :常数,通常可以取 2,相当于是加号两边式子的一个权重;
- N:总探索次数,就是对所有的节点一共 explore 了多少次;
- ni:当前节点的探索次数。
(其实我觉得“直至选择一个叶子节点”这个说法不是很好,不如说“直至选择一个可扩展节点”,就是到一个还有扩展空间的节点)
扩展(Node Expansion)
从根节点出发,计算它的两个子节点的 UCB 值。假设图(1)节点 3 的UCB 值更大,但是它之前已经被访问过了,则该节点不会直接进行 rollout,而是枚举出当前节点所有可能的动作并添加到树中。枚举出节点 3 的两个动作,形成图(2)。然后接下来再看要采取哪种动作,这就是Node Expansion。
仿真/预演(Simulation/Rollout)
进行随机决策。
伪代码:
def Rollout(S_i): # S_i:当前状态
loop forever: # 无限循环
if S_i a terimal state: # 如果当前状态是个终止状态,比如说你赢了或者他赢了
return value(S_i) # 返回对 S_i 这个状态的价值,比如说你赢了,这个价值可能就会相对比较高
# 假设还没到终止状态
A_i = random(available_action(S_i)) # 随机选取当前状态下能够采取的一个动作
S_i = simulate(A_i, S_i) # 通过当前状态 S_i 与随机选取的动作 A_i 来计算出下一步的状态并赋值给 S_i
用随机的方法逼近整体的分布。假设从黄色节点 1 进行 Rollout,它随机决策到结点 2,然后再随机决策到结点 3,然后再随机决策一直到最后红色结点 7,该节点的状态是 terminal state,然后得到一个 value,然后再将 value 返回给黄色节点 1。
反向传播(Back Propagation)
在上一步计算出value后,需要反向传播value,对于它所有的父节点(下图黑线上的所有的结点),它们的探索次数全部 +1,它们的 value 也会进行一个累加。整个算法会重复很多次,直到蒙特卡洛树能够给出当前状态下最好的一个解答,就是到底应该怎么走。
算法何时终结?
一是游戏内棋手的限制时间(固定迭代时间);二是给定固定的迭代次数。
迭代完成后,选择value更大的节点即可完成决策。
用树的意图?
树是为了解决基础预演算法中轨迹之间不能聚焦和轨迹利用不足的问题
树是如何产生的?
树的策略?
e-贪心策略和UCB策略都是可以的
经典例子:
AI如何下棋?直观了解蒙特卡洛树搜索MCTS!!!_哔哩哔哩_bilibili
人工智能导论:08搜索求解算法:蒙特卡洛树搜索|AI入门必学课程_哔哩哔哩_bilibili
【强化学习】规划与学习-蒙特卡洛树搜索 MCTS_哔哩哔哩_bilibili
可以阅读的论文: