返回列表

[10th place] Deimos's RL approach

548. Lux AI Season 2 | lux-ai-season-2

开始: 2023-01-25 结束: 2023-05-08 游戏AI 数据算法赛
作者: QIMAI LI、yuhao J、suesu、Yuanquan Hu
发布日期: 2023-05-20
投票数: 15
排名: 第10名

Deimos 的强化学习方法

背景

去年,我们的同事参加了 Lux Season 1 竞赛,并对竞赛环境进行了深入的研究。在今年竞赛的准备阶段,我们受 Stone 邀请,使用 JAX 框架重写了 Lux 环境,从而获得了相当显著的速度提升(整体用户体验仍有改进空间,我们计划未来进一步优化)。因此,我们也希望参加 Lux Season 2,以获得第一手经验。

方法

本次竞赛中,我们的策略仍然是使用 PPO 算法,具体实现遵循 RLlib 提供的离策略方法。由于本赛季竞赛环境的观测空间与上赛季结构相似,我们采用了文献 [1] 中描述的神经网络架构作为模型的主干,并将代码开源供参考 [2]。不过,我们也针对本赛季的环境特点对模型进行了一些独有的改进,将在下文中详细介绍。

特征空间

特征空间由三个主要部分组成:全局信息、地图特征和动作队列。每个组件都旨在捕捉关键信息,使机器人能够在环境中高效运作。

  • 全局信息
    特征空间的第一个组件是全局信息,包括环境当前的时间阶段(步数、周期、小时)以及机器人和资源的总数。我们对某些特征采用独热编码,得到 32 维的特征向量。

  • 地图特征
    地图特征组件包含每个区块中资源(地衣、冰、矿石、碎石)的信息,以及每个区块中机器人(单位、工厂)的位置。特征维度设计为 48×48×30。

  • 动作队列
    特征空间的最后一个组件是动作队列,表示机器人队列中当前的一组动作。该组件的特征维度为 48×48×20×6。

为了编码特征空间,我们将编码后的全局信息在每个网格上进行复制,然后使用 ResNet 将三个组件融合,以实现最高效率。

动作相关

对强化学习玩家来说,最大的挑战是管理第二赛季中庞大的动作空间。为此,我们将每个机器人每回合发送的动作数量限制为仅一个,即完全忽略动作队列,将其转化为一个实时控制问题。与 flg 的方法不同,我们允许动作重复执行,从而节省部分能量。此外,我们还实现了如下较为复杂的条件采样。

动作序列的采样顺序

我们按以下顺序对不同维度的动作进行采样:

  • 动作类型(移动、转移、拾取、挖掘、自毁、充电、什么都不做)
  • 动作方向(5 个方向)
  • 动作资源种类(冰、矿石、水、金属、能量)
  • 动作资源数量(浮点数,0–1)
  • 是否无限重复(布尔值)
  • n(整数)

前面采样的维度会影响后续维度的采样,因此整个动作空间被建模为一个条件概率分布。

  P(type, direction, resource, quantity, repeat, infinite)  \n= P(type) * P(direction | type) * P(resource | type, direction) * P(quantity | type, direction, resource) * P(repeat | type, direction, resource, quantity) * P(n | type, direction, resource, quantity, repeat)

连续值采样

从上述单位类型机器人的动作空间可以看出,操作的资源数量是一个有界实数值,例如 $[0,1]$。通常,对于涉及连续数值的动作,研究人员会将其建模为高斯分布,但高斯分布是无界的,因此需要进行截断处理。在此我们采用了一种更合理的分布——Beta 分布,它天然落在 $[0,1]$ 区间内。这种做法的优点可参考文献 [3]。

模型架构

简而言之,模型是一个 8 层深、64 个神经元宽的 ResNet,并配有一些额外的特征预处理层以及动作/价值头。主干网络与文献 [1] 相同,具体实现可参考 [2]。

训练与性能

随机初始化

分布式强化学习框架包含两种类型的进程:

  • Rollout worker:与环境交互以生成数据,
  • Trainer:执行策略优化。

由于本次竞赛是一个完全信息博弈,我们将 Rollout worker 设置为自我对抗,即自我对弈。然而,我们发现模型在训练过程中并未探索新的游戏状态。因此,我们从 Kaggle 下载了大量回放数据,随机选取其中各种游戏状态,并将这些中间状态作为自我对弈的初始设置。这帮助我们的策略探索了许多通过自我对弈难以演化出的游戏情境,数据下载方法可参考 Lux Season 1 的分享博客。

课程学习阶段

训练过程主要分为三个阶段。

  1. 稠密奖励 + 基于规则工厂生成
  2. 稠密奖励 + 神经网络工厂生成
  3. 稀疏奖励 + 神经网络工厂生成

第一阶段

奖励设置为如下表所示的稠密奖励,在此阶段我们编写了一个脚本来选择工厂的生成位置以及初始水/金属资源。此外,如果玩家输掉比赛,将受到一个较大的负奖励惩罚,这会抵消其过去所有的奖励。因此,只有获胜者在本阶段获得正奖励。

奖励类型 数值
胜利奖励 0.1
失败惩罚 -0.1
轻型单位增加 0.04
重型单位增加 0.4
冰增加 0.0005
矿石增加 0.001
水增加 0.001
金属增加 0.002
能量增加 0.00005
地衣生长 0.001
丢失工厂惩罚 -0.5
本回合存活奖励 0.01

大多数奖励也可以转化为惩罚。例如,如果玩家建造了一个轻型单位,将获得 0.04 的奖励;但如果失去了该轻型单位,则会受到 -0.04 的惩罚。

第二阶段

此阶段仍然使用上述的稠密奖励,但工厂生成现在由神经网络决定。这个阶段非常短暂。只要机器人在第一阶段学会了如何收集资源,神经网络就能够在几小时内学会在合适的位置生成工厂。

第三阶段

在此阶段,我们切换到稀疏奖励。

奖励类型 数值
地衣增加奖励 0.001
本回合存活奖励 0.01

在此阶段,地衣增加奖励是零和的。玩家获得的所有地衣奖励也会成为对手的惩罚,因此玩家的目标变为获得比对手更多的地衣。

结论

我们的训练起步顺利,可以看到 ELO 分数稳步上升。然而,它在过去两个月里一直停留在 1900 分左右。我们进行了大量实验以提升 ELO 分数,但均未奏效。总体而言,我们的方法与 flg 的方法相当相似。我们和 flg 都遵循了去年冠军的方案,但在细节上,我们在动作空间建模、奖励设置以及课程学习阶段等方面有所不同。也许存在某个 bug;也许我们的动作空间建模过于复杂;也许我们的奖励设置不够理想。我们无法确定原因,因为强化学习系统过于复杂而难以调试。它由太多组件构成,每个组件又包含大量超参数。大多数时候,如果某个组件处理不当,你只会 silently 得到一个糟糕的 ELO 分数,而不会出现任何明确的异常提示。尽管如此,我们仍希望与大家分享我们的方法。

同比赛其他方案