junxiaosong / AlphaZero_Gomoku

An implementation of the AlphaZero algorithm for Gomoku (also called Gobang or Five in a Row)
MIT License
3.25k stars 965 forks source link

对于 -leaf_value 的问题 #52

Closed gmftbyGMFTBY closed 6 years ago

gmftbyGMFTBY commented 6 years ago

https://github.com/junxiaosong/AlphaZero_Gomoku/blob/68603c0d8e5a0ef9273bacc7d281abe27493da1b/mcts_alphaZero.py#L137 首先非常感谢作者的贡献,这份代码的教育意义非常大。对于这一行代码的问题,首先解释一下,对于 update_recursive 函数里面的 -leaf_value 我比较清楚。但是该局棋面的估计 leaf_value, 按照上述的代码,为什么本节点(做出估计的节点)的估计 V 要变成 -leaf_value。我认为做出估计的节点的 V 应该是 leaf_value 不是 -leaf_value,在向树上反向传播的时候需要每一层修正一次符号这个我是明白的(因为树是敌我交替的),但是update_recursive函数的调用入口的负号这里不是很懂,是我比较大的一个困惑,希望可以得到作者的解读,再次感谢。

顺便确认一下,代码中多次提到的 current player 是指当前棋局下需要走子的玩家吗?

junxiaosong commented 6 years ago

@gmftbyGMFTBY leaf_value是从leaf节点的视角考虑的,leaf value传入后是用来更新Q value的,而leaf节点的Q value是给它的父节点选择分支的时候用的,所以这个Q value是从父节点的视角出发的,所以leaf节点自身的leaf value和自身的Q value就是从相反的视角考虑的,所以传入时就加了负号。 另外current player 是指当前棋局下需要走子的玩家。