一种完全基于深度强化学习的方法。使用一个神经网络经过训练来预测自己应该的下棋位置和获胜概率,同时又通过MCTS树搜索方法不断提升神经网络的能力,使神经网络在一次次迭代中不断获得更高质量的预测效果。目录结构如下:
CN4Z\
├── main.py
├── README.md
├── res\
| ├── 0.png
| ├── 8.png
| └── bj.jpg
└── src\
├── __init__.py
├── default.html
├── agent.py
├── config.py
├── gui.py
├── net.py
└── tool.py
main.py是启动文件,通过传入不同参数来达到不同的操作。README.txt说明文件。res是文件夹,放了GUI的图片资源。src文件夹用来放代码。agent.py包括三个类,一个是记录下棋信息和实现一些游戏相关操作的类;另一个是自己下棋产生数据的;还有一个是优化训练神经网络的。config.py包括了所有参数,以及提供路径服务。gui.py提供人机对战界面和操作。net.py是神经网络模型,用的是torch库。tool.py提供参数管理(py的argparse)和日志管理(py的logging)服务。
算法框架
神经网络以一个棋盘为输入,同时输出策略(Policy)和价值(Value)。策略就是落子概率向量P,价值就是对当前胜率的评估值V。通过蒙特卡洛搜索树产生一个更忧的,具有前瞻性的落子概率π,来作为P的目标值,用游戏结束时的胜(1)和负(-1)的值z作为V的目标值。使得(P,V)不断接近(π,z)。
神经网络
主要用了ResNet和CNN。输入数据为两方棋盘,通过一个输入模块后,进入到8个残差模块中,最后分别通过策略头和价值头最终输出P和V。策略部分损失函数为CrossEntropy,价值部分损失函数为平方差。优化器用SGD。
蒙特卡洛搜索树
每个节点储存{N,W,Q,P},N(s,a)是节点访问次数,W(s,a)是总动作价值,Q(s,a)是平均动作价值,P(s,a)是先验概率。
为了加快速度,采用异步编程的方式,多个协程负责拓展节点,但不会立即用神经网络计算;有一个协程负责神经网络的前向计算,集中多个棋盘一起计算,可以充分利用GPU资源加快速度。
a.选择。根据Q+U来选择拓展的分支,U是一个N和P的函数,控制了选择过程中的探索程度。这种搜索的策略在最初更倾向于具有高先验概率和低访问次数的行为,但随着搜索加深会偏向具有高价值的动作。b.拓展与评估。用神经网络初始化节点。c.回传。向上更新参数。d.落子。在训练过程中需要加入狄利克雷噪声,确保所有动作都有可能被尝试到,最终使用时则不需要。
结果
在英伟达的P40上跑了170小时,就基本上能击败一般人了。