从根节点启动时,AlphaZero 的 MCTS 是如何工作的?

人工智能 深度学习 蒙特卡罗树搜索 零字母
2021-11-13 19:07:40

在 AlphaGo Zero 论文中,在 MCTS 期间,每个新节点的统计信息被初始化如下:

N(sL,a)=0,W(sL,a)=0,Q(sL,a)=0,P(sL,a)=pa.

选择最佳子节点的PUCT算法是at=argmax(Q(s,a)+U(s,a)), 在哪里U(s,a)=cpuctP(s,a)bN(s,b)1+N(s,a).

如果我们从一棵只包含根节点并且还没有访问过任何子节点的树开始,那么对于所有操作,这应该评估为 0a我们可以从根节点获取。然后我们是否只是简单地统一采样要采取的行动?

此外,在我们添加未访问节点的 expand() 步骤中sL对于树,这个节点的子节点也不会被访问,我们遇到了同样的问题,PUCT 将返回 0 对于所有操作。我们在这里也做同样的统一抽样吗?

1个回答

我查看了附加到AlphaZero 论文补充材料的数据 S1 的 Python 伪代码。这是我的发现:

  • 与论文相反,AlphaZero 不存储{N(s,a),W(S,a),Q(s,a),P(s,a)}每条边的统计信息(s,a). 相反,AlphaZero 存储{N(s),W(S),Q(s),P(s)}每个节点的统计信息s.
  • 当一个叶子节点SL扩展后,它的访问次数、价值分数和操作策略会立即更新{N(s),W(S),Q(s),P(s)}, 所以N(s)至少是1. 这就是为什么在论文中,所有时间步的反向传播步更新tL而不是t<L. 更新有意义sL即使没有对应的aL配对。
  • 因此,当展开一个新的叶子节点时,其值U(s,a)该叶节点的子节点的值将非零,因为bN(s,b)实际上计算为N(sparent)在代码中,至少为 1。
  • 奇怪的是,我认为伪代码中可能存在错误,因为在第一次迭代的开始(从根节点开始),U(s,a)=0对于根节点的所有子节点。这是因为在第一次迭代中,N(sroot)=0. 所有子节点的值将是0,并且由于作者选择根据 Python 的max函数打破平局,因此该算法只需选择它找到的第一个元素以防平局。
  • 第一次迭代后,N(sroot)>0所以U(s,a)0由于反向传播步骤将更新根节点的访问计数,因此一切正常进行。所以这种可能的错误/不直观的行为只会影响第一次迭代。它非常轻微且微不足道,并且不会影响 MCTS 的结果,这可能是它被忽视的原因。