junxiaosong / AlphaZero_Gomoku

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

关于GPU利用率的问题 #33

Closed huyp182 closed 6 years ago

huyp182 commented 6 years ago

跑的时候GPU内存占满了,但GPU运算部件的利用率只有12%,不知道可以增大利用率吗

huyp182 commented 6 years ago

还有个问题,您的cnn的输入只有4个维度,其中一个维度是上次下棋的位置,如果增加一些维度,把前面若干次下棋的位置都输入进去,训练效果会不会更好一些?

huyp182 commented 6 years ago

AlphaZero好像是把当前局面和前面16步,一共17维作为输入的吧

junxiaosong commented 6 years ago

关于GPU/CPU利用率,可以参见issue #15 的讨论; 关于输入数据,增加更多步的历史数据作为输入确实有可能提高效果,毕竟AlphaGo Zero原始论文中就是用了双方最近8步,有兴趣可以进行实验尝试

huyp182 commented 6 years ago

嗯,关于cnn的输入还有个问题,为什么不直接把square_state作为输入,而把square_state[:,::-1,:]作为输入呢

junxiaosong commented 6 years ago

因为历史原因,棋盘上的位置是从下往上编号的,比如3*3的棋盘: 6 7 8 3 4 5 0 1 2 square_state计算的时候是先按照从上往下编号的方式处理的,所以最后把行这个维度逆序了一下

huyp182 commented 6 years ago

还有个问题,AlphaZero_MCTS模拟的时候在非叶结点选择的是Q+u最大的子结点,为什么正式下棋的时候却只看模拟的时候的visit次数,而不管Q+u呢? act_probs = softmax(1.0/temp * np.log(np.array(visits) + 1e-10)) 还有Pure_MCTS也是只看visit次数

junxiaosong commented 6 years ago

这是MCTS算法本身的思想,模拟的时候选择Q+u最大的节点,这是exploitation和exploration的平衡,Q对应exploitation,就是我们偏向于选择实际模拟过程中表现好的分支,u对应exploration,我们需要给访问次数少的分支一些机会,充分的探索,可能能发现更好的策略。在正式下棋的时候,我们不再需要探索,我们只需要充分利用模拟时探索到的信息,来选择最优的分支,一般我们选择visit次数最多的分支,按照论文里的说法,这种选择方法相对Robust;当然你也可以选择Q最大的分支,估计效果差异不会太大,但是u这一项在最后决策的时候肯定是不用的

huyp182 commented 6 years ago

知道了,谢谢!