📜  ML |蒙特卡罗树搜索(MCTS)

📅  最后修改于: 2021-04-17 02:12:37             🧑  作者: Mango

蒙特卡洛树搜索(MCTS)是人工智能(AI)领域的搜索技术。它是一种概率和启发式驱动的搜索算法,将经典的树形搜索实现与强化学习的机器学习原理结合在一起。

在树形搜索中,总是有可能当前的最佳动作实际上不是最佳动作。在这种情况下,MCTS算法变得很有用,因为它会在学习阶段通过执行替代方案来持续评估其他替代方案,而不是当前的最佳策略。这就是所谓的“勘探与开发的权衡”。它利用了迄今为止被认为是最好的行动和策略,但是还必须继续探索替代决策的本地空间,并找出它们是否可以替代当前的最佳决策。

探索有助于探索和发现树的未探索部分,这可能会导致找到更理想的路径。换句话说,我们可以说探索扩大了树的宽度,而不是其深度。探索对于确保MCTS不会忽略任何可能更好的路径很有用。但是,在具有大量步骤或重复的情况下,它很快变得效率低下。为了避免这种情况,可以通过剥削加以平衡。开发坚持一条具有最大估计价值的路径。这是一种贪婪的方法,将扩展树的深度而不是宽度。简而言之,应用于树的UCB公式可通过定期探索树的相对未开发节点并发现比当前正在开发的路径更好的最佳路径,来帮助平衡探索与开发之间的权衡。
对于此特性,MCTS在做出人工智能(AI)问题的最佳决策时特别有用。蒙特卡罗树搜索(MCTS)算法:
在MCTS中,节点是搜索树的构建块。这些节点是根据许多模拟的结果形成的。蒙特卡洛树搜索的过程可以分为四个不同的步骤,即选择,扩展,模拟和反向传播。每个步骤的详细说明如下:

  • 选择:在此过程中,MCTS算法使用特定策略从根节点遍历当前树。该策略使用评估函数来最佳地选择具有最高估计值的节点。 MCTS使用应用于树的上限置信区间(UCB)公式作为遍历树的选择过程中的策略。它平衡了勘探与开发之间的权衡。在遍历树期间,将根据一些返回最大值的参数选择一个节点。参数的特征在于通常用于此目的的公式如下。
    UCBf
    在哪里;
    S i =节点i的值
    x i =节点i的经验均值
    C =常数
    t =模拟总数在选择过程中遍历一棵树时,从上述等式返回最大值的子节点将成为将被选择的子节点。在遍历期间,一旦找到了子节点(也就是叶节点),MCTS就会跳入扩展步骤。
  • 扩展:在此过程中,将新的子节点添加到该节点的树中,该子节点在选择过程中达到了最佳状态。
  • 模拟:在此过程中,通过选择动作或策略进行模拟,直到获得结果或预定义状态为止。
  • 反向传播:确定新添加的节点的值之后,必须更新其余的树。因此,将执行反向传播过程,在此过程中,它将从新节点反向传播到根节点。在此过程中,每个节点中存储的模拟数量会增加。同样,如果新节点的模拟导致获胜,则获胜次数也会增加。

通过以下图表可以直观地理解上述步骤:
mcts_vis

这些类型的算法在回合制游戏中特别有用,在这种游戏中,游戏机制不存在任何机会,例如井字游戏,连接4,跳棋,国际象棋,围棋等。最近,人工智能程序已在使用此类算法,例如AlphaGo,与世界顶级围棋选手对战。但是,其应用不仅限于游戏。它可以在状态-动作对和用于预测结果的模拟所描述的任何情况下使用。

蒙特卡罗树搜索的伪代码:

# main function for the Monte Carlo Tree Search
def monte_carlo_tree_search(root):
      
    while resources_left(time, computational power):
        leaf = traverse(root) 
        simulation_result = rollout(leaf)
        backpropagate(leaf, simulation_result)
          
    return best_child(root)
  
# function for node traversal
def traverse(node):
    while fully_expanded(node):
        node = best_uct(node)
          
    # in case no children are present / node is terminal 
    return pick_univisted(node.children) or node 
  
# function for the result of the simulation
def rollout(node):
    while non_terminal(node):
        node = rollout_policy(node)
    return result(node) 
  
# function for randomly selecting a child node
def rollout_policy(node):
    return pick_random(node.children)
  
# function for backpropagation
def backpropagate(node, result):
    if is_root(node) return
    node.stats = update_stats(node, result) 
    backpropagate(node.parent)
  
# function for selecting the best child
# node with highest number of visits
def best_child(node):
    pick child with highest number of visits

如我们所见,MCTS算法简化为很少的功能集,我们可以使用任何游戏选择或任何优化策略来使用这些功能。

蒙特卡洛树搜索的优点:

  1. MCTS是一种易于实现的算法。
  2. 蒙特卡洛树搜索是一种启发式算法。 MCTS可以在规则和最终条件之外的任何特定领域中有效地运作,而无需任何知识,并且可以通过播放随机播报找到自己的动作并从中学习。
  3. 可以将MCTS保存为任何中间状态,并且可以在需要时在以后的用例中使用该状态。
  4. MCTS支持基于其运行情况的搜索树的非对称扩展。

蒙特卡洛树搜索的缺点:

  1. 随着几轮迭代之后树的生长变得迅速,它需要大量的内存。
  2. 蒙特卡洛树搜索存在一些可靠性问题。在某些情况下,可能存在单个分支或路径,当为那些基于回合的游戏实施时,可能导致输给对手。这主要是由于存在大量的组合,从长远来看,每个节点可能没有被足够多次地访问以了解其结果或结果。
  3. MCTS算法需要大量的迭代才能有效地确定最有效的路径。因此,那里存在速度问题。