基于蒙特卡洛算法训练掼蛋游戏AI--论文笔记(一)

1,788 阅读5分钟

DanZero 论文笔记(一)

掼蛋

  1. 掼蛋是一种流行于中国的扑克牌游戏,通常由四个人分成两队进行。游戏的目标是尽快打出手中的牌。掼蛋的规则比较复杂,涉及到牌的组合、等级、以及如何打出牌来覆盖对手的牌等。
  2. 在掼蛋中,游戏树可以用来表示从当前状态出发的所有可能的走法及其结果。例如,一个节点可以代表当前的牌局状态,包括所有玩家手中的牌和桌面上的牌。从这个节点出发的边代表玩家可以采取的所有合法动作,如打出一对、顺子、炸弹等。每个边通向的节点代表执行该动作后的新状态。
  3. 由于掼蛋的状态空间非常大(每个玩家有多种打牌方式,且牌的组合多样),完整的游戏树会非常庞大。因此,实际中的人工智能程序通常会使用启发式搜索或蒙特卡洛树搜索等方法来近似地评估不同动作的优劣,而不是完全展开整个游戏树。

资源链接

主要算法

  • 蒙特卡洛算法:Danzero项目主要采用的是神经网络增强的蒙特卡洛算法。

算法选择理由

  • 掼蛋游戏具有较大的状态和动作空间,传统基于值的强化学习算法(如DQN)可能受到高估问题的影响。
  • 策略梯度方法(如A3C)在操作空间较大的问题中表现不佳,因为它们无法有效利用特征操作。
  • 蒙特卡洛算法可以无差别地逼近真实值,并利用特征编码技术对状态和动作特征进行处理,实现分布式自我对弈的强化学习框架。

分布式学习

  • 在代码中启动Actor时会启动一个IP地址,以便Learner能够获取到Actor里的比赛数据。
  • Actor:负责游戏模拟和信息收集。游戏结束时,将轨迹数据元组发送给Learner进行模型训练。
  • Learner:负责网络更新。从缓冲区抽取数据批次,使用蒙特卡洛算法更新网络。

训练成本开销

  • 训练配置: 4 Intel(R) Xeon(R) Gold 6252 CPU @ 2.10GHz 和 GeForce RTX 3070 GPU
  • 训练时间:一个月

方法

A. 模型架构设计

  • 目标:将所有相关信息和候选动作作为输入,输出状态-动作值。
  • 牌的编码:每种牌组合被编码为一个54维的向量,对应于扑克中的54张牌。向量中的每个元素有3个可能的值:{0, 1, 2},表示相应花色和点数的牌的数量。
  • 状态特征:由一个具有513维的向量组成,包括玩家当前手中的牌、上一轮中赢得的牌、输掉的牌、打出的牌、未打出的牌等信息。
  • 动作特征:包括当前轮的最后一手牌、伙伴和对手的最后一手牌、最后一手牌的花色、点数、类型、长度等信息。

B. 分布式Q学习

  • 训练过程

    :采用深度蒙特卡洛方法和自我对弈程序进行训练。整体框架包括两部分:演员(Actor)和学习者(Learner)。

    • 演员:负责游戏模拟和信息收集。接收来自学习者的最新模型参数,进行游戏模拟,收集数据。
    • 学习者:负责网络参数的更新和重放缓冲区的维护。从重放缓冲区中抽取轨迹数据,计算损失,更新状态-动作值网络参数。

牌的编码解释

  • 扑克牌共有54张牌,包括52张常规牌和2张王牌。使用54维向量表示所有可能的牌,每个元素有三个可能的值:

    • 0:玩家手中没有这张牌。
    • 1:玩家手中有一张这样的牌。
    • 2:玩家手中有两张这样的牌。

这里的“三个值”(0、1、2)并不是指牌的花色,而是指玩家手中某张特定牌的数量。尽管扑克牌有四种不同的花色(红心、方块、梅花、黑桃),但这种表示方法并不直接关注花色,而是关注玩家手中有多少张特定的牌。所以,不管花色如何,每张牌在向量中都只对应三种可能的状态(0、1、2)

状态特征详细解释

  • 状态特征

    :由一个具有513维的向量组成,包括以下信息:

    • 当前手中的牌。
    • 剩余的牌,即除了当前手中的牌和所有打出的牌之外的所有牌。
    • 上一手牌,必须能够覆盖这些牌的组合。
    • 伙伴的最后一手牌。如果伙伴的最后一手牌是“过”,这个向量设置为零。
    • 其他三名玩家剩余牌的数量,按照出牌顺序记录。
    • 其他三名玩家已经打出的牌,按照出牌顺序记录。
    • 我们团队和对手团队的等级。
    • 野牌标志,即我们手中是否有野牌,以及这些牌是否可以组成炸弹、同花顺、顺子或除了单张和王炸之外的其他牌型。

动作特征详细解释

  • 动作特征:也用一个54维的向量表示。网络采用多层感知器(MLP)的几层,输入是状态和动作特征的串联,是一个567维的向量。网络的输出是状态-动作值。

模型训练和评估

  • 模型通过与8个基于规则的机器人玩1000场游戏来评估,每24小时保存一个检查点。
  • 与基线机器人相比,DanZero显示出显著更好的性能