junxiaosong / AlphaZero_Gomoku

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

非常想请教一个问题,希望大佬回复 #119

Closed Lufffya closed 3 years ago

Lufffya commented 3 years ago

关于子节点 Q值 更新的问题 image

参考了原论文 image

一直很不理解,为什么这里是这样写的

junxiaosong commented 3 years ago

代码里用的是增量更新的方式,最开始Q=0,第一个leaf value进来,假设是V1,那么Q = Q + (V1 - Q) / 1 = V1; 第二个leaf value再进来,假设是V2,那么Q = Q + (V2 - Q) / 2 = V1 + (V2 - V1) / 2 = (V1 + V2) / 2; 以此类推n个leaf value之后,Q = (V1 + ...+ Vn) / n, 就是原文中的公式

Lufffya commented 3 years ago

那么 leaf_value - Q 怎么理解呢,leaf_value应该是当前玩家下当前局面的胜率评分,在第二轮计算其Q值的时候要减去原来的Q值? 还有前面的 * 1.0 是什么意思

junxiaosong commented 3 years ago
  1. leaf_value - Q 没啥特殊理解,这只是数学上等价的实现方式(上一条回复就是在解释这点),本来需要把所有的V(s')都存下来,最后才能计算均值,现在用增量更新的方式,不用存储所有的V了,最后也能算出来等价的结果,所以采用了这种实现方式
  2. 应该只是因为老版本python整数除整数还是整数,所以乘以1.0确保变成float而已
Lufffya commented 3 years ago

哦哦,感谢大佬的解答,代码非常的精妙