挑战训练一个 AlphaZero 五子棋
好吧,训了几轮,发现结果不是很理想。
失败案例:
- 黑棋学会开局连五后,白棋不会堵,直接放弃
- 一直训某一种开局,换个开局就不会下了
- (重要)训练效率低下,啥都没学到
所以还是好好准备一下,搞一个优秀的架构和训练体系。
新代码还没开始写,就纯讲讲思路。
1. MCTS
对抗搜索中比较优秀的方法就是 MCTS 蒙特卡洛树搜索。
首先 MCTS 搜索树上每个节点要存:
一开始搜索树是空的,怎么办呢,这时候就需要进行 Playout,模拟一些对局。
假装现在我们拿到了一个搜索树的叶子节点,且这个点对于的局面还没结束,我们就需要进行拓展 Expand,那问题来了,怎么知道新的叶子节点的胜率是多少呢?一种方法就是直接随机下几百盘即可,这个叫 Rollout。
那问题又来了,我们要扩展哪些叶子呢,扩展所有的叶子就会指数爆炸,怎么办呢。
然后就是 MCTS 的精髓,每个点会有一个分数 Score 表示这个子树值不值得探索,计算公式:
- Exploitation 利用:即为已有的胜率
Q 。 - Exploration 探索:有些点都没搜过几次,
Q 值也很低,但是可能只是探索过少了,其实胜率很大,所以分数要加上这个值,这个探索值叫U ,计算公式:
最后的分数即为
然后每次 Playout 就从根开始,在一个非叶节点上,贪心选 Score 最大的儿子进行探索,然后扩展叶子,最后别忘了返回根,更新
在 Playout 了几千次后,就改选出下一步下什么了,注意现在不是选择 Score 最大的儿子了,而是选择探索次数
此时已经可以解决一些简单博弈。
但是随机 Rollout 的效率其实很低,每次要探索的点非常多,需要引入更强的方法!
2. AlphaZero
AlphaZero 和 AlphaGo 都是 Deepmind 研发的,这里简单讲讲历史:
- AlphaGo Lee (2016) 以 4:1 的比分战胜李世石。
- AlphaGo Master (2017) 以 3:0 的比分战胜柯洁。
- AlphaGo Zero (2017) 此 AI 不再需要任何人类棋谱,仅靠自对弈 Self-play 进行自博弈。
今天这里讲的就是不需要人类棋谱,仅靠自对弈训练的 AI。
Value Head 价值头
Rollout 效率和正确率比较感人,考虑直接把棋盘信息丢给深度神经网络,得到新叶子的胜率。
为了方便,其中这里的胜率是
但是这样还不够……
Policy Head 策略头
人类下五子棋的时候,经常注重三连四连,要不要堵,之后的变化。而刚刚的 MCTS 会探索所有的位置,这明显不太优秀,所以引入一个策略头,告诉 MCTS 倾向于探索哪些位置。
神经网络还会丢出一个数组
可以参考一下我自己画的一张图:
3. 训练
最重要的部分。
首先进行自博弈,获得一个对局。此时能获得局面的输赢,搞进神经网络里训练。
同时利用 MCTS 搜出来的
其中
然后策略头采用交叉熵,价值头采用平均方差。
然后是训练细节。
我们需要维护一个大概 1GB 的 dq?来存储一个叫做经验池 Replay Buffer 的东西,即一个新鲜的对局不要立马去训练,而是丢经经验池,训练更平稳且不会忘记过去的经验。这个过程叫经验回放。
然后我们还可以把一个棋盘进行八方向对称,获取八倍的数据集。
然后是我准备搞两个经验池,分别维护白赢和黑赢的局面,因为五子棋 freestyle 是黑棋必胜,为了让白棋也学会防守,两者赢的样本数要平均。
然后是高效率 Self-play,我准备同时进行 128 个对局,把一个 128 的 Batch 丢进 GPU 里。
然后就是这些了,代码还没写,不知道能不能成功。。