尝试强化学习训练卡牌对战 AI 的失败尝试
一、为什么想做这件事
当前线上跑着的机器人有不同等级,最弱的是从左到右费用够就出牌的固定规则模式,最强的是设定了一些收益参数,每次出牌会选择收益最高的牌的模式,还人工加入了 combo 组合的检测和连续打出。
因为我们的游戏随机性还是比较强的,根据实际体验,最高级机器人大概能达到前30%玩家的水平(纯靠感觉,无数据支撑)。
于是,一方面,我想制作一个更强的机器人,更重要的是另一方面:数值调整、增加技能需要评估平衡性,如果有这样的机器人,就可以让机器人之间对战来看调整后的数值和机制在高端玩家中的情况。
二、设想
共66张卡牌,可以直接用卡牌本身作为维度,这样的好处是空间小,坏处是无法调整数值,调数值也相当于一张全新的卡;或者按照机制拆分维度,好处是可以调数值,坏处是维度多,我们的机制挺多的,可能有二十多种。
按照胜负、伤害、回血、摸牌、爆牌设计奖励函数,Self-play 训练即可。
三、落地时的主要问题
1.维度难拆
状态空间过于复杂。拆分维度时候,有很多机制很难设计,比如有一张卡是造成3点伤害并投币,正面可以一直投,投到反面为止,额外增加正面数量的伤害。另一张卡造成2点伤害并投一次币,如果是正面增加一点伤害。这两张牌的伤害维度上,可能需要一个基础伤害,一个期望伤害,但可能还不够,也许还要一个伤害方差。在投币维度上,可能也是分开比较好,直接独立成无限投直至反面和只投一次两种。类似的情况数不胜数。
2.奖励稀疏
一局游戏太长,另外每个步骤的延迟太高,严重影响训练效率。我直接在测试环境用的真实的对战服务,网络延迟就少不了,此外代码里还充斥着仅用于展示而不影响游戏核心逻辑的计算,以及数据上报的代码。
于是,我准备把游戏核心逻辑抽出来,相当于自己做一套专门用来训练 AI 的模拟器,无网络、无动画、无上报,这样一局游戏可以非常快,操作几乎没有延迟,可以极大提升训练效率。然而…
3.模拟器的工程量远超预期
这也许是整个项目真正失败的核心原因。
因为需要重做的不是一个“简单脚本”,而是必须完整复刻:
- 回合系统
- 卡牌效果
- Buff/Debuff
- 连锁触发
- 随机机制
- 特殊机制
更麻烦的是,游戏后续版本还会更新,也就是说模拟器必须长期维护,持续同步正式服的规则才有用。
我还是全身心投入了超过5天,但得出的结论还是不变:完全超出了探索项目的合理成本。
四、总结
强化学习本身的思路我认为是可行的,问题出在人力资源和是否值得做。因为我以前没干过类似的事情,探索的时候我低估了:
- 状态建模难度
- 游戏规则的复杂度
- 后续维护成本
高估了单人推进大型系统的可行性。
后续更现实的路径也许是去拿线上高端用户的出牌数据来训练,成本较低,出效果可能更快。