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

关于模型的走棋策略的问题 #54

Open Egolas opened 6 years ago

Egolas commented 6 years ago

您好!我在使用您的代码进行测试的时候(8*8棋盘),训练了4000轮达到了对于4000次模拟的纯蒙特卡洛算法10局全胜的结果,在与5000次模拟的蒙特卡洛算法中5胜5平。但是我在观察与传统五子棋引擎、人类与自我对弈的过程中,发现了两个问题:

  1. 可能出现已经有明显的必胜的落子的走法时,选择不落在那里
  2. 对于棋盘中还有较多可落子位置时,棋盘边缘的棋子,似乎根本不会考虑落子。。比如一开始就在棋盘边缘落子,则必胜;与传统五子棋引擎对弈时一般也是攻防到一定回合后对手连续在边缘落子,此模型不进行防守导致落败。 default default
Egolas commented 6 years ago

特别是关于边缘落子的问题,我在训练了1500轮、3000轮的模型上都测试过,都有这样的问题。我的想法是因为训练轮数不够多,而且因为本身就已经不倾向于在边缘落子,在自我对弈的训练数据中,也就更加缺少这样的情况。 不知道您对这样的情况有什么看法和改进的想法?

GeneZC commented 6 years ago

我之前训练的时候遇到过类似的情况,有以下解决的方法:

  1. 放弃已有的模型,重新训练;
  2. 增加模拟的数量(这其实是为了让蒙特卡洛树看到自己输了);
  3. 继续训练下去
junxiaosong commented 6 years ago

@Egolas 不知道你在测试的时候n_playout是否依然设置的是400,我之前也注意到边缘落子不去堵的情况,当时我把n_playout慢慢增大,记得到3000的时候,就会堵了。其实在AlphaZero论文里虽然训练的时候n_playout设置的是800,但他们测试评估的时候其实会跑几十万次模拟,所以在单步时间允许的范围内增大n_palyout能提高效果,一定程度上解决这个问题。 如果要从算法训练的角度改进的话,我的想法是增加exploration的程度,使得自我对弈数据更多样化,比如增加开局时的噪声,或者最开始几步随机落子,然后在此基础上再自我对弈,以避免自我对弈始终从棋盘中央开始。这是我的想法,没有测试过,供参考。

Egolas commented 6 years ago

@junxiaosong 感谢回复。 不知道你说的“测试评估”具体是指的是哪个步骤?是指对模型进行实际测试的时候,比如与蒙特卡洛算法对比的时候与手动与人对弈时? 我现在训练的时候playout设置的是800,与纯蒙特卡洛对比时的playout也是800,我在训练到4500次的时候发现AI有时候会堵边缘落子了,可见训练集的扩大还是有助于解决这个问题。

另外,不知道您目前的网络结构是怎么确定的呢?我尝试增加了一层或两层卷积层(在策略价值网络分共用的网络部分),进行训练时发现一开始就无法进行学习,loss保持在5左右,explained_old_var,explained_new-var均为0,。后来我在每一层卷积层后,ReLU层之前,增加了一层BN层,进行训练,则能继续下降,训练了1500次后,loss达到了2.5附近,然而,与1000次playout的纯蒙特卡洛算法对弈胜率依然较低。与其人工对战时也常乱落子。目前仍在继续训练。 增加神经网络的层数应该能提高网络对数据的拟合程度,但为什么这样改动后反而会使loss无法下降呢?

除此问题之外,不知道您关于您算法中的策略价值网络有什么改进的思路?

junxiaosong commented 6 years ago

测试评估我指的是人工对战的时候,就是发现AI不堵边缘时,尝试把playout设置的大一些,可能就会堵了。 现在使用的网络结构是很随意定的,考虑到实验的棋盘比较小,所以就用了一个很简单的卷积网络,卷积的层数大概就是让最上层的感受野能覆盖整个棋盘。关于你遇到的增加一个卷积层之后就完全不收敛的情况,可以减小learning rate试试。 关于网络结构我也没太多思路,一个可以尝试的就是使用AlphaGo Zero论文中采用的Res Block的结构,当然这边不需要20个block这么多,可能2~3个就差不多了。