Junxiao Song
Junxiao Song
人机对弈的时候还要考虑人一方的move,另外即使保留也只是两个move之后的子树,考虑到每一层的分支数量,两层之后的一个分支中的数据其实很少
这种方式是从PPO算法(Proximal Policy Optimization Algorithm)论文和一些相关实现中借鉴来的
> play_data = list(play_data)[:] vs play_data = list(play_data) > python2.7: list(play_data)[:] is fine > python3.6: list(play_data)[:] is [] It's nothing to do with the [:] operator. play_data is an zip,...
简单看了下该项目的说明,感觉和效率最相关的是两个方面,一是它的self-play和MCTS部分都是用C++实现的,这是最耗时的部分;二是看说明它支持多进程并行;不过即使有这些优化,能够在一台笔记本上就训练得到打败奕心的模型还是挺刷新认知的。。。
你的tensorflow版本中,_build_network()返回的act_probs是softmax之后的概率值,而loss中需要的是log(act_probs),所以loss计算有问题;Pytorch版本计算是正确的;
MCTS模拟确实是占了绝大部分计算量的,所以deepmind采用了5000个TPU,要直接让它计算高效起来估计有点难,但MCTS是可以并行执行的,AlphaGo zero论文里使用了一个叫做virtual loss的trick来并行的跑mcts,大致来说就是当一个线程正在一个树分支上搜索时,临时改变一下这个分支上的节点的统计数据,比如把访问次数加的很大,使得其他并行搜索的线程会去搜索另外的分支。
大棋盘对于算力要求太高,棋盘增大之后对于self-play局数的要求也大大增加,单机是跑不出什么结果的,不过也有一些讨论可参考 #13
@gmftbyGMFTBY 参考issue #15
@TheColdVoid 大棋盘的话可能可以采用论文里的Residual block的形式增加卷积层的层数,不过运算量需求真的很大,个人是很难训练出来的。相关的讨论 #13 #16
大部分的做法是每一步落子都会以当前棋盘状态为根结点重新建立一棵搜索树