junxiaosong / AlphaZero_Gomoku

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

如果想在15*15的棋盘上获得较好的结果,不知道pure_mcts和simulation的play out应大概设为多少呢? #13

Closed huyp182 closed 6 years ago

huyp182 commented 6 years ago

还有其他参数还需要修改吗?

junxiaosong commented 6 years ago

理论上来说扩大棋盘时目前的play_out次数不用改,另外pure_mcts只是用来作为对照观察训练效果的,和训练过程无关。不过15 * 15的棋盘运算量要求太大了,如果是单机跑的话太慢了,基本是跑不出来的。

huyp182 commented 6 years ago

嗯,打算用1080跑十几天。。。谢谢回复!

junxiaosong commented 6 years ago

@782832949 ,突然想到棋盘扩大之后dirichlet噪声的参数可能需要调整。根据AlphaZero论文里的描述, 这个参数一般按照反比于每一步的可行move数量设置,所以棋盘扩大之后这个参数可能需要减小。 具体是mcts_alphaZero.py中的197行 p=0.75 probs + 0.25 np.random.dirichlet(0.3 * np.ones(len(probs))) 其中的0.3可能减小一些(比如到0.1),会有帮助。不过我也没有实际跑大棋盘的经验,仅供参考。

huyp182 commented 6 years ago

谢谢!还有,tensorflow保存的模型文件有.meta,.index,.data-00000-of-00001三个。载入的时候不能直接运行human_play,还要修改一下吧,好像要用tensorflow指定的载入方式?

huyp182 commented 6 years ago

1 2 如图,不知道为什么跑到这就卡在这不动了,cpu和磁盘占用都是0,是664的,用的tensorflow。 然后按了一下Ctrl+C就继续跑了。。。

junxiaosong commented 6 years ago

@782832949 关于载入tensorflow保存的模型文件,我记得human_play.py里的代码是直接可以运行的,当然model_file = 后面不要写那三个文件名,而是写和train.py里保存时一样的名字,比如'best_policy.model'或者'current_policy.model'就可以了

BIGBALLON commented 6 years ago

@junxiaosong 提个小建议,建议不要使用pickle来save 和 load model的weight。可以直接用pytorch的内建API。速度快了接近100倍。 (20层的resnet, pickle读取weight大概要20s,torch.load大概是0.2s) 另外我还有做training data 的 save,用的是numpy,速度上面也比pickle快非常多。

image

大概是这样。

 def save_model(self,path):
        torch.save(self.policy_value_net.state_dict(),path)
        print("SAVE MODEL IN: ",path)

    def load_model(self,path):
        self.policy_value_net.load_state_dict(torch.load(path))
        print("LOAD MODEL FROM: ",path)
huyp182 commented 6 years ago

谢谢~

Kelvin-Zhong commented 6 years ago

@BIGBALLON 你的9x9 是训练了多久呢?

initial-h commented 6 years ago

@BIGBALLON你好 请问怎么把AI连到一个平台上去比较呢,我下了piskvork但是只有python2的模板。python3打包成exe有很多报错,你是连的哪一个呢?

gmftbyGMFTBY commented 6 years ago

@BIGBALLON 比较关心 9 * 9 的硬件配置和训练的时间大小,谢谢了

TheColdVoid commented 6 years ago

@BIGBALLON 请问 具体您是怎么实现多线程生成self-play棋局的?用多进程还是多线程?我尝试着写了一下多线程生成self-play棋局的代码,发现由于python的全局锁的缘故,导致不能有效地利用多核资源,但是用多进程的话,又也遇到了一个异常TypeError: can't pickle _thread.RLock objects,这个异常我查了很多资料也没有找到有效的解决方法。因此我想请教一下您是怎么实现的多线程生成selfplay棋局的,谢谢