我们如何才能有效且公正地决定在 MCTS 的扩展阶段生成哪些子代?

人工智能 蒙特卡罗树搜索
2021-10-21 20:11:43

在执行 MCTS 的扩展阶段时,您创建多个子节点,选择其中一个数字,并从该子节点进行模拟,您如何有效且公正地决定生成哪个子节点?

一种策略是始终生成所有可能的孩子。我相信这个答案说 AlphaZero 总是产生所有可能的 (300) 孩子们。如果计算孩子的成本很高,或者孩子很多,这可能效率不高。

一种策略是生成可能的孩子的惰性流。也就是说,生成一个孩子并承诺生成其余的孩子。然后你可以通过掷硬币随机选择一个:正面你带第一个孩子,反面你继续走。这显然偏向于流中较早的儿童。

另一种策略是计算有多少N那里有孩子,并提供生成孩子的功能X<N(类型为 Nat -> State)。然后,您可以通过在范围内统一选择来随机选择一个[0,N). 这可能比以前的版本更难实现,因为计算子节点的数量可能与计算子节点本身一样困难。或者,您可以计算孩子数量的上限,并且该函数是部分的(类型为 Nat -> Maybe State),但您会执行拒绝采样之类的操作。

我相信如果剩余的 MCTS 迭代次数,Xt, 大于孩子的数量,N,那么你做什么都没关系,因为你会在下一次迭代中再次找到这个节点并展开其中一个子节点。这似乎表明唯一重要的时间是Xt<N在像 AlphaZero 这样的情况下,NX0,这基本上不重要。

在这种情况下X0N大小相似,那么似乎确实需要将迭代次数更改为时间量,有时您将时间花在播放上,而其他时间则花时间计算子代。

我是否正确地考虑了这一点?

2个回答

在这个问题中首先要考虑的是:当我们谈论“生成子/节点”时,我们的意思是什么。仅仅为树数据结构创建一个节点,并为更深的孩子、访问计数、反向传播分数等数据分配一些内存(初始化为空/零),在效率方面很少有问题。

如果您在说“生成节点”时还包括生成要存储在该节点中的游戏状态,那可能会更加昂贵,因为它需要将移动的效果应用于先前的游戏状态以生成新游戏状态(并且,根据实现,可能还需要首先复制之前的游戏状态)。但是您通常不必这样做。您可以只生成节点,并且只有在稍后通过 MCTS 选择阶段再次到达它们时才实际将游戏状态放入其中。

例如,您可以说 AlphaZero 确实会立即为所有动作生成所有节点,但它们通常是没有游戏状态的“空”节点。它们确实通过策略网络计算的概率“启动”,但该策略网络不需要这些节点内的后继状态;这是一个功能π(s,a)当前状态s(在前一个节点内),以及动作a通向新生成的节点。


但是,如果您真的确定,对于您的特定问题域,节点的生成本身已经是低效的,那么......

[...] 这显然偏向于流中较早的儿童。

是的,使用这种基于流的方法会产生很大的偏差,可能效果不佳。

[...] 这可能比以前的版本更难实现,因为计算孩子的数量可能与计算孩子本身一样困难。[...]

我再次同意您的观察,我认为这不是一个可行的解决方案。

我相信如果剩余的 MCTS 的迭代次数 X_t 大于子节点的数量 N,那么你做什么都没关系,因为你会在下一次迭代中再次找到这个节点并展开其中一个孩子们。

这仅对根节点的子节点是正确的。对于树中更深的任何节点,MCTS 可能永远不会再次到达它们,即使Xt>N,因为它可以将大部分搜索工作用于不同的子树。


我认为您的解决方案必须涉及某种学习功能(例如 AlphaZero 中的策略网络),它可以有效地计算要生成的节点的推荐,仅使用在您选择要生成的节点之前已经可用的输入。在 AlphaZero 的策略网络中,这些输入将是状态s在您当前的节点中,以及向外的操作a(每一个都可能导致生成一个节点)。这实际上通常与无偏见相去甚远,但我认为,如果您处于仅生成节点是对性能的合理关注的情况,那么无论如何都可能需要强烈的、习得的偏见。

丹尼斯的回答非常有帮助。我还发现MCTS 调查的第 5.5 节非常有用,尤其是扩大讨论。另一个有用的参考是https://project.dke.maastrichtuniversity.nl/games/files/msc/Roelofs_thesis.pdf