[ICML 2021] DouZero: 使用自我博弈深度强化学习掌握斗地主
DouZero 是一个用于斗地主 (斗地主)的强化学习框架,这是中国最受欢迎的纸牌游戏。它是一种出牌型游戏,玩家的目标是在其他玩家之前打出所有手牌。斗地主是一个非常具有挑战性的领域,具有竞争、协作、不完全信息、大规模状态空间,特别是每轮可能的合法动作集合变化很大。DouZero 由快手AI平台开发。
- 在线演示: https://www.douzero.org/
- :loudspeaker: 新版本Bid(叫牌版本): https://www.douzero.org/bid
- 本地运行演示: https://github.com/datamllab/rlcard-showdown
- 视频: YouTube
- 论文: https://arxiv.org/abs/2106.06135
- 相关项目: RLCard Project
- 相关资源: Awesome-Game-AI
- Google Colab: jupyter notebook
- 社区改进的 DouZero 非官方版本: [DouZero ResNet] [DouZero FullAuto]
- 知乎: https://zhuanlan.zhihu.com/p/526723604
- 其他资源:
- 查看我们开源的大规模时间序列模型(LTSM)!
- 听说过以数据为中心的AI吗?请查看我们的以数据为中心的AI调查和出色的数据为中心的AI资源!
社区:
-
Slack: 在 DouZero 频道讨论。
-
QQ群: 加入我们的QQ群进行讨论。密码: douzeroqqgroup
- 群1: 819204202
- 群2: 954183174
- 群3: 834954839
- 群4: 211434658
- 群5: 189203636
新闻:
- 感谢 @Vincentzyx 的贡献,使得CPU训练成为可能。现在Windows用户可以使用CPU进行训练。
引用此工作
如果您在研究中发现此项目有帮助,请引用我们的论文:
Zha, Daochen et al. “DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning.” ICML (2021).
@InProceedings{pmlr-v139-zha21a,
title = {DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning},
author = {Zha, Daochen and Xie, Jingru and Ma, Wenye and Zhang, Sheng and Lian, Xiangru and Hu, Xia and Liu, Ji},
booktitle = {Proceedings of the 38th International Conference on Machine Learning},
pages = {12333--12344},
year = {2021},
editor = {Meila, Marina and Zhang, Tong},
volume = {139},
series = {Proceedings of Machine Learning Research},
month = {18--24 Jul},
publisher = {PMLR},
pdf = {http://proceedings.mlr.press/v139/zha21a/zha21a.pdf},
url = {http://proceedings.mlr.press/v139/zha21a.html},
abstract = {Games are abstractions of the real world, where artificial agents learn to compete and cooperate with other agents. While significant achievements have been made in various perfect- and imperfect-information games, DouDizhu (a.k.a. Fighting the Landlord), a three-player card game, is still unsolved. DouDizhu is a very challenging domain with competition, collaboration, imperfect information, large state space, and particularly a massive set of possible actions where the legal actions vary significantly from turn to turn. Unfortunately, modern reinforcement learning algorithms mainly focus on simple and small action spaces, and not surprisingly, are shown not to make satisfactory progress in DouDizhu. In this work, we propose a conceptually simple yet effective DouDizhu AI system, namely DouZero, which enhances traditional Monte-Carlo methods with deep neural networks, action encoding, and parallel actors. Starting from scratch in a single server with four GPUs, DouZero outperformed all the existing DouDizhu AI programs in days of training and was ranked the first in the Botzone leaderboard among 344 AI agents. Through building DouZero, we show that classic Monte-Carlo methods can be made to deliver strong results in a hard domain with a complex action space. The code and an online demo are released at https://github.com/kwai/DouZero with the hope that this insight could motivate future work.}
}
什么使得斗地主如此具有挑战性?
除了不完全信息的挑战之外,斗地主还有巨大的状态和动作空间。特别是,斗地主的动作空间为10^4(参见此表)。不幸的是,大多数强化学习算法只能处理非常小的动作空间。此外,玩家在斗地主中需要在部分可观察的环境中与其他玩家进行竞争和合作,并且交流有限,即两个农民玩家将作为一个团队对抗地主玩家。建模竞争和合作同时进行是一个开放的研究挑战。
在这项工作中,我们提出了带有动作编码和并行演员的深度蒙特卡罗(DMC)算法。这导致了一个非常简单但出人意料的有效斗地主解决方案。请阅读我们的论文了解更多详情。
安装
训练
要使用 GPU 进行训练,运行
python3 train.py
这将在一块 GPU 上训练 DouZero。要在多块 GPU 上训练 DouZero,请使用以下参数。
--gpu_devices
: 可见的 GPU 设备--num_actor_devices
: 将用于模拟的 GPU 设备数量,即自对弈的设备数量--num_actors
: 每个设备上要使用的 actor 进程数量--training_device
: 将用于训练 DouZero 的设备
例如,如果我们有 4 块 GPU,想使用前三块 GPU 进行模拟,每块 GPU 有 15 个 actor,使用第 4 块 GPU 进行训练,可以运行以下命令:
python3 train.py --gpu_devices 0,1,2,3 --num_actor_devices 3 --num_actors 15 --training_device 3
要使用 CPU 进行训练或模拟(Windows 系统只能使用 CPU 进行 actor 任务),请使用以下参数:
--training_device cpu
: 使用 CPU 训练模型--actor_device_cpu
: 使用 CPU 作为 actor 设备
例如,使用以下命令在 CPU 上运行所有任务:
python3 train.py --actor_device_cpu --training_device cpu
以下命令仅在 CPU 上运行 actor 任务:
python3 train.py --actor_device_cpu
要进行更多自定义的训练配置,请参见以下可选参数:
--xpid XPID 实验 ID(默认:douzero)
--save_interval SAVE_INTERVAL
保存模型的时间间隔(以分钟为单位)
--objective {adp,wp} 使用 ADP 或 WP 作为奖励(默认:ADP)
--actor_device_cpu 使用 CPU 作为 actor 设备
--gpu_devices GPU_DEVICES
用于训练的 GPU 设备
--num_actor_devices NUM_ACTOR_DEVICES
用于模拟的设备数量
--num_actors NUM_ACTORS
每个模拟设备上的 actor 数量
--training_device TRAINING_DEVICE
用于训练模型的 GPU 的索引。`cpu` 表示使用 CPU
--load_model 加载现有模型
--disable_checkpoint 禁用保存检查点
--savedir SAVEDIR 保存实验数据的根目录
--total_frames TOTAL_FRAMES
训练所需的总环境帧数
--exp_epsilon EXP_EPSILON
探索的概率
--batch_size BATCH_SIZE
学习者的批次大小
--unroll_length UNROLL_LENGTH
展开长度(时间维度)
--num_buffers NUM_BUFFERS
共享内存缓冲区数量
--num_threads NUM_THREADS
学习者线程数
--max_grad_norm MAX_GRAD_NORM
梯度的最大范数
--learning_rate LEARNING_RATE
学习率
--alpha ALPHA RMSProp 平滑常数
--momentum MOMENTUM RMSProp 动量
--epsilon EPSILON RMSProp epsilon
评估
可以使用 GPU 或 CPU 进行评估(GPU 的速度会更快)。预训练模型可以在 Google Drive 或 百度网盘,提取码:4624。将预训练的权重放入 baselines/
目录下。通过自对弈来评估性能。我们提供了预训练模型和一些启发式方法作为基线:
- random: 随机(均匀)玩法的 agent
- rlcard: RLCard 中基于规则的 agent
- SL (
baselines/sl/
): 基于人类数据预训练的深度学习 agent - DouZero-ADP (
baselines/douzero_ADP/
): 以平均差分点数 (ADP) 作为目标的预训练 DouZero agent - DouZero-WP (
baselines/douzero_WP/
): 以获胜百分比 (WP) 作为目标的预训练 DouZero agent
第一步:生成评估数据
python3 generate_eval_data.py
一些重要的超参数如下。
--output
: 保存生成数据的位置--num_games
: 生成的随机游戏数量,默认是 10000
第二步:自对弈
python3 evaluate.py
一些重要的超参数如下。
--landlord
: 哪个 agent 扮演地主角色,可以是 random、rlcard 或预训练模型的路径--landlord_up
: 哪个 agent 扮演地主上家角色,可以是 random、rlcard 或预训练模型的路径--landlord_down
: 哪个 agent 扮演地主下家角色,可以是 random、rlcard 或预训练模型的路径--eval_data
: 包含评估数据的 pickle 文件--num_workers
: 使用的子进程数量--gpu_device
: 使用的 GPU。默认使用 CPU
例如,以下命令评估在地主位置的 DouZero-ADP 对抗随机 agent:
python3 evaluate.py --landlord baselines/douzero_ADP/landlord.ckpt --landlord_up random --landlord_down random
以下命令评估在农民位置的 DouZero-ADP 对抗 RLCard agent:
python3 evaluate.py --landlord rlcard --landlord_up baselines/douzero_ADP/landlord_up.ckpt --landlord_down baselines/douzero_ADP/landlord_down.ckpt
默认情况下,我们的模型每半小时会保存到 douzero_checkpoints/douzero
目录下。我们提供了一个脚本帮助您识别最新的检查点。运行
sh get_most_recent.sh douzero_checkpoints/douzero/
最新的模型将保存在 most_recent_model
目录下。
Windows 系统中的问题
如果您使用 Windows 系统并使用 GPU 进行 actor 任务训练,可能会遇到 operation not supported
错误。这是因为在 Windows 中不支持在 CUDA 张量上进行多进程操作。然而,由于我们的代码针对 GPU 进行了优化,因此大量操作都在 CUDA 张量上进行。如果您找到任何解决方案,请联系我们!
核心团队
- 算法:Daochen Zha,Jingru Xie,Wenye Ma,Sheng Zhang,Xiangru Lian,Xia Hu,Ji Liu
- GUI 演示:Songyi Huang
- 社区贡献者:Vincentzyx
致谢
- 演示主要基于 RLCard-Showdown
- 代码实现受到 TorchBeast 的启发