选自arXiv
作者:Daochen Zha等
机器之心编译

参与:熊猫、张倩
AI 攻陷各种棋牌游戏已经不是什么新闻,但迅速开发和测试 AI 的环境一直是困扰业界和学界的问题。最近德州农工大学数据科学实验室给出了他们的解决方案,开源了基于牌类游戏设计的强化学习 Python 平台 RLCard,其中融合了中西方最流行的几种牌类游戏(包括斗地主、麻将、21 点、德州扑克、UNO 等),同时实现了多种强化学习算法(DQN、NFSP、CFR 等)。RLCard 致力于为强化学习提供一个易用、统一的开发和测试环境,让人们能轻松、便捷地训练测试自己的 AI。
RLCard 是一个用于牌类游戏强化学习研究的开源工具包,其接口简单易用,支持多种牌类环境。RLCard 的目标是在强化学习与非完美信息博弈之间搭建桥梁,推动强化学习研究在多智能体、高维状态和动作空间以及稀疏奖励领域的进步。作者在论文中概述了 RLCard 的关键组件,探讨了其设计原则并简要介绍了接口,还给出了对这些环境的评估。
  • 项目地址:https://github.com/datamllab/rlcard
  • 论文地址:https://arxiv.org/abs/1910.04376
  • 官方网站:http://rlcard.org/
下图 1 展示了 RLCard 的概况。每个游戏都用简单易用的接口封装成了一个环境类。RLCard 能让开发者更专注于算法开发,而无需在游戏本身上面耗费开发精力。
图 1:RLCard 概况。它支持多种风格的牌类游戏,比如博彩游戏、中式扑克以及棋盘游戏,使用了简单易用的接口进行封装。
该工具包的开发遵循以下设计原则:
  • 可复现。在这些环境上的结果是可以重复得到的。如果在不同的运行中使用了同样的随机种子,那么所得结果应当是一致的。
  • 易使用。在每轮游戏之后,产生的数据可被直接用于强化学习训练。开发者也可以方便地配置状态表征、动作编码、奖励设计、甚至游戏规则。
  • 可扩展。通过上述设计原则,开发者可以方便地向该工具包添加新的牌类游戏环境。该工具包中的依赖尽力做到了最少,以便能轻松地维护代码。
该工具包提供了多种风格的受大众欢迎的牌类游戏,包括博彩游戏、中式扑克以及一些棋盘游戏。表 1 总结了 RLCard 中的牌类游戏,并给出了每种游戏的复杂度估计。
表 1:RLCard 中的游戏总览
环境接口
接下来我们简要介绍该工具包的接口。首先是核心接口,这能让用户快速上手并接入强化学习算法。然后会介绍状态表征、动作编码以及为了实现环境定制化而对它们进行的修改。之后会介绍如何通过多进程生成数据。最后会介绍单智能体接口,其通过预训练模型或基于规则的模型模拟其他玩家。
核心接口
RLCard 的开发者提供了一个 run 函数,它能直接生成游戏数据,这些数据会被组织成状态迁移(transition),即一个五元组(状态,动作,奖励,下个状态,是否完成),这些数据可直接送入强化学习算法进行训练。下面给出了用三个随机智能体运行斗地主游戏的示例:
开发者还提供了用来更灵活访问游戏树的高级接口。与 OpenAI Gym 类似,工具包定义了一个 step 函数,其可在给定的当前动作下将环境移动到下一个状态。此外该工具包还包含一个 step_back 函数,这能回溯到前一个状态。
状态表征
状态的定义是:在游戏的一个特定时间步骤中一个玩家所能观察到的所有信息。在该工具包中,每个状态都是一个字典,包含两个值。第一个值是合法动作。第二个值是观察到的状态。编码观察的方式有很多种。对于 Blackjack(二十一点),RLCard 直接将玩家的分数和庄家的分数用作一种表征。对于工具包中的其它游戏,则是将已观察到的牌编码进多个牌平面。举个例子,在斗地主中,策略的输入是一个包含 6 个牌平面的矩阵,包括当前的手牌、其他两位玩家的手牌的并集、最近的三个动作、所有已经打出的牌的并集。
动作编码
RLCard 将动作都编码成从 0 开始的正整数。动作与数字编码一一对应。
对于某些大型游戏,RLCard 采用了动作抽象以减小动作空间。举个例子,斗地主就有动作空间组合爆炸的问题,其动作数量超过 3×10^4,其中任意的三张同样的牌、飞机或炸弹都可以带任何一张单牌或对子。为了减小动作空间,这个工具包仅编码了一个组合的主要部分,并使用了规则来决定要带的牌。通过这种操作,斗地主的动作空间减小到了 309。
自定义
除了默认的状态和动作编码,RLCard 的设计还能实现状态表征、动作编码、奖励设计、甚至游戏规则的自定义。
每个游戏都使用了一个 Env 类进行封装,其中的一些关键函数可以重写以实现环境的自定义。extract_state 函数可用于将原始的游戏状态转换成表征。decode_action 函数可用于将动作索引映射到动作。用户可以通过修改这个函数来实现自己的动作抽象。get_payoffs 函数会返回玩家在游戏结束时的收益。每个游戏的上述组件都有一个默认设置。开发者也鼓励用户自定义这些设置以获得更好的表现。
每个游戏的参数也都可以调整。举个例子,用户可以通过修改 LimitholdemGame 类的 __init__ 函数来更改有限制德州扑克的玩家数量或固定加注。这样,用户就可以按需调整游戏的难度,并逐步设计算法。
并行训练
这个工具包支持使用多进程生成游戏数据。并行运行能极大加快大型环境中的训练速度。具体来说,首先会在初始化时创建多个原始环境的副本。每个子进程都会从主进程复制模型参数,并在该环境的副本中生成游戏数据,然后将数据发送到主进程。这个主进程会收集所有数据在 CPU 或是 GPU 上训练智能体。GitHub 库给出了训练多进程智能体的例子。
单智能体接口
RLCard 提供了用于探索训练单智能体牌类游戏强化学习智能体的接口。具体来说,RLCard 用预训练模型或基于规则的模型来模拟其它玩家,这样从一个玩家的视角看,游戏实质上就变成了单智能体环境。这些单智能体环境也颇具难度,因为它们有很大的状态和动作空间,而且奖励稀疏。研究者表示,未来的计划是使用不同层次的模拟模型来创建不同难度的环境。这个单智能体接口遵照了 OpenAI Gym 的格式。具体来说,在单智能体模式中,给定一个动作,step 函数会返回下一个状态、奖励以及游戏是否完成的信息。reset 函数会重置游戏并返回初始状态。常见的单智能体强化学习算法可以轻松地用于这些环境。
评估
这一节将介绍用于评估 RLCard 工具包的实验。测试中开发者主要关注的这两个问题:(1)当前比较流行的强化学习算法在这些环境中表现如何?(2)生成游戏数据需要多少计算资源?
实验使用了深度 Q 网络(DQN;Silver et al. 2016)、神经虚拟自我博弈(NFSP;Heinrich and Silver 2016)和反事实遗憾最小化(CFR;Zinkevich et al. 2008)。
评估的标准是胜率。这篇论文采用了两种实验评估方法。第一,智能体相对于随机智能体的胜率。第二,智能体间博弈。
相对于随机智能体的结果
实验观察到两个结果。第一,所有算法相对于随机智能体的结果都相近。第二,NFSP 和 DQN 在大型游戏中非常不稳定。
图 2:各智能体相对于随机智能体的表现,这里给出的是在牌类环境中的学习曲线
(二级)锦标赛结果
实验观察到,NFSP 在大多数环境中都优于 DQN。开发者还在 Leduc 扑克上比较了 CFR 与 NFSP 和 DQN。CFR 表现较好。
表 2:NFSP 和 DQN 玩 10000 局游戏的平均收益
运行时间分析
开发者也评估了环境的运行效率,具体做法是统计随机智能体自我博弈所需要的时间。具体来说,开发者测试了使用单进程和多进程进行 1 000 000 局游戏的运行时间(秒)。
表 3:使用随机智能体运行 1 000 000 局游戏的运行时间秒数,其中包含单进程和多进程。per step 列是运行时间除以所执行时间步骤数量的结果。
可以观察到,当处理器更多时,所有环境都能实现更高的吞吐量。
文为机器之心编译,转载请联系本公众号获得授权
✄------------------------------------------------
加入机器之心(全职记者 / 实习生):[email protected]
投稿或寻求报道:content@jiqizhixin.com
广告 & 商务合作:[email protected]
继续阅读
阅读原文