Skip to content

Repository files navigation

alphagomoku

1. 简介

如名���示,本项目意欲用alphago[1]所采用的的算法来建造一个下五子棋的AI。
一为学习,二主要是不想用启发式+搜索,因为获得好的启发式很难,且不自由。
实际上,已有很多五子棋AI[2]很厉害,相关算法可以参考这儿[3]这儿[4]
目前采用新方法的一些尝试[5]还没有达到期望。

2. 流程

就像alphago[1],我们也想采用类似的方式:

    1. 用监督学习训练策略网络
    1. 在前面的基础上,通过self-play来增强策略网络和训练一个值网络
    1. 用MCTS结合它们

对于监督学习,首先是收集数据。
我们的数据采集自gomocup前几名AI对弈记录。
你可以在这儿[6]下载,它们是经过对称旋转变换的。
做了几种不同的数据集,9x9和15x15大小的,主要是csv格式,
数据的含义参考[6]里的README。

3. 代码

项目的主要目录和文件结构如下:

├── data/                  # 存放训练数据集的目录
│   └── alphagomoku/       # 包含不同格式和大小的对局数据压缩包
├── src/
│   └── tentacle/          # 核心代码目录
│       ├── main.py        # GUI,提供人机对弈界面和其它一些功能入口(通过按键)
│       ├── game.py        # 一局游戏,由2个AI和1个棋盘组成,可以有或没有GUI
│       ├── board.py       # 棋盘状态管理
│       ├── config.py      # 项目配置文件
│       ├── strategy.py    # 策略(AI)基类
│       ├── strategy_dnn.py# 使用DNN作决策的AI
│       ├── dnn*.py        # 不同结构的DCNN,本身运行可进行训练或强化学习(依赖PyTorch)
│       ├── mcts.py        # MCTS实现,使用神经网络记录统计信息
│       ├── mcts1.py       # 单线程MCTS,使用树结构记录统计信息
│       ├── dfs.py         # 另一个基于搜索的AI,来自[7]
│       ├── server.py      # 用于和gomocup的其它AI切磋。因为gomocup manager[8]
│       │                  # 是个Windows程序,而我们的程序主要跑在Linux上,
│       │                  # 所以做了一次转发:gomocup manager <-> Windows stub[9] <-> server.py
│       ├── data_set.py    # 数据集处理相关
│       ├── ds_loader.py   # 数据加载器
│       ├── rl_policy.py   # 强化学习策略相关
│       └── value_net.py   # 价值网络实现
├── pyproject.toml         # uv 项目配置及依赖管理文件
└── README.md              # 项目说明文档

4. 使用

本项目使用 uv 进行环境和依赖管理。首先安装依赖:

uv sync

为了跑起来,你需要在代码里改些配置,主要是在 src/tentacle/config.py 里。
命令行统一入口为 ml-five(子命令):

  • 监督学习: uv run ml-five supervised(默认 DCNN3;--network pre 可切回 dnn.Pre;--resume 从 checkpoint 续训;--arena-games-per-side N 调整对弈评估局数)
  • 固定评估: uv run ml-five eval-supervised(基于 train/validation/test 文件输出 top1/top3/top5)
  • 强化学习: uv run ml-five reinforce(仅命令行;--no-resume 强制从监督学习权重起步;--opponent minmax 可改为对 MinMax 强化)
  • 图形界面: uv run ml-five gui --strategy minmax(或 uv run ml-five-main --strategy dnn --ckpt rl_brain/):仅人机;程序策略/模型由命令参数指定,--ckpt 可传 checkpoint 目录或具体 .pt 文件。启动后默认 human 执黑直接开始第一局;窗口内 F2 表示 human 执黑重新开始,F3 表示 human 执白重新开始,任何时候按都会清除当前局并重开;黑方永远先行。中文标题/说明依赖系统字体:可安装 fonts-noto-cjk 或文泉驿字体
  • 程序对弈: uv run ml-five match -b dnn -w minmax(无 GUI;--games-per-side N--black-ckpt / --white-ckpt 指定 DNN 目录或 checkpoint;--empty-start 空盘开局)
  • Gomocup 网络引擎进程: uv run ml-five-server(与本地 GUI 无关)
  • GUI / match 中 dnn ���载 PyTorch checkpoint,不再使用 brain1.npz/brain2.npz
  • TD 策略参数文件为 brain1.pt/brain2.pt(仅 match 等仍可选用 td
    训练过程通过 TensorBoard 记录到 summary/ 目录:
  • 启动监控: uv run tensorboard --logdir summary --port 6006
  • 监督学习会记录 loss_*accuracy/top3/top5,以及 vs_rand_* / vs_minmax_* 胜率曲线
    仍可直接运行: uv run python src/tentacle/dnn3.py 等脚本,行为与原先一致。

5. 下一步想做的

    1. 探索新的网络结构,增加特征面
    1. 解决或绕开self-play过拟合的问题

6. 参考

[1]Mastering the game of Go with deep neural networks and tree search
[2]Gomoku AI
[3]Gomoku Resources
[4]Carbon Gomoku
[5]Convolutional and Recurrent Neural Network for Gomoku
[6]Gomoku Dataset
[7]Gobang game with AI in 900 Lines
[8]Gomocup Manager
[9]Windows gomocup stub
[10]Human-level control through deep reinforcement learning
[11]MCTS

7. 踩过的坑

    1. 监督学习所用的数据集会严重影响训练效果。
      之前我们用一个比较简单的启发式AI生成的数据集就连简单的规则都学不会,
      和人博弈时简直就是乱下
    1. 用CNN描述棋盘状态,同样一些input features用不同形式喂给CNN,对结果影响不大
    1. loss曲线和真正的效果感觉很奇怪
    1. 直接和gomocup的其它AI对弈做强化学习实在是太慢,因为它们搜索一步
      都要很久,感觉self-play才是出路,要么能从很少的对弈中学习

8. 当前的问题

    1. 当前监督学习得到的策略网络预测正确率只有40%多,应该还有提升空间。
    1. self-play的做法和alphago[1]一样的: 在对手池中挑一个对手,与之对弈,
      对手总采用贪婪策略,己方做探索,满足一定条件后加入对手池。
      看起来很完美,但是通过self-play得到的agent会过拟合于自己的对手,虽然可以打败了所有以前的对手,
      但是实际上变得没有通用性了,仅仅是这些以前的那些对手的克星。
    1. 单线程MCTS[11]太慢,不实用,得改成APV-MCTS[1]

欢迎讨论,渴望指导,谢谢!

email: splendor.kill@gmail.com
QQ: 363599755
微信: splendor_k

About

alphagomoku

Resources

Stars

60 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages