Open xiaoyangzai opened 6 years ago
非常非常感谢你的指教,我今天再次详细看了一下蒙特卡洛搜索树的知识,有了一个新的认识:蒙特卡洛树搜索分为选择,模拟或者评估,反向更新,最后最终在返回root下访问最多的move; 我之前一直认为在选择阶段,使用树内的策略即a = argmax(Q + U),而经过仔细研究之后发现,在两人对弈游戏的MCTS的选择阶段是两个竞争对手相互选择最优的行为,那么在选择阶段选择行为的时候,是否应该根据不同对手的视角选择最优行为,并且更新树内节点的Q值也是不同的选手更新的方式不一样,即update_recursive(-leaf_value);如果是按照不同选手来更新Q值的话,那么每次选择阶段选择行为时采用a = argmax(Q + U)策略即可得到两个竞争对手各自的最优行为,因为节点的Q值是根据相应的选手来更新的。
如果说我的想法是对的话,那么在反向更新阶段,应该根据选手的视角传递正的leaf_value或负的leaf_value来更新搜索树内各个选手对应做出选择的节点中的Q,获胜选手的节点+leaf_value,失败的选手的节点-leaf_value,那么代码中是否应该判断一下某个节点是对手的还是自己的节点来更新Q值呢? 另外就是在AlphaZero论文中没有提到这些东西,是不是我的那块理解错了?
最近这段时间看到这块的内容都没有人可以问,真是非常感谢你的指教!!!!
对的,MCTS在搜索的时候其实也是Minimax的思想,双方交替的选择对自己最有利的(或者说对对方最不利的),但因为我们在选择步骤统一用的a = argmax(Q + U),所以我们在更新Q的时候就需要考虑视角的问题,不过在双方对弈的过程中,视角是交替的,所以这边没有显式的去判断某个节点时对手的还是自己的,只是在反向更新的时候一层一层交替取反了。
@junxiaosong 非常感谢你的解答。我想问几个问题: 第一,mcts用在棋类游戏,会有对手之间的竞争。我现在改变了应用场景,没有对手,那么update_recursive(-leaf_value)是不是就可以改成update_recursive(leaf_value)? 第二,self-play 往往需要花费大量时间,我们是不是可以用分布式来加速呢?比如,多进程加速模拟。
@KelleyYin 我不确定在你的应用场景是不是可以直接用leaf_value,还是建议你在理解MCTS的基础上灵活处理吧,反正都可以试的嘛。另外self-play可以分布式来加速的,DeepMind他们就用了5000个TPU来生成self-play数据
在敲你的代码过程中遇到了两个问题,麻烦您给指导一下: