548. Lux AI Season 2 | lux-ai-season-2
去年,我们的同事参加了 Lux Season 1 竞赛,并对竞赛环境进行了深入的研究。在今年竞赛的准备阶段,我们受 Stone 邀请,使用 JAX 框架重写了 Lux 环境,从而获得了相当显著的速度提升(整体用户体验仍有改进空间,我们计划未来进一步优化)。因此,我们也希望参加 Lux Season 2,以获得第一手经验。
本次竞赛中,我们的策略仍然是使用 PPO 算法,具体实现遵循 RLlib 提供的离策略方法。由于本赛季竞赛环境的观测空间与上赛季结构相似,我们采用了文献 [1] 中描述的神经网络架构作为模型的主干,并将代码开源供参考 [2]。不过,我们也针对本赛季的环境特点对模型进行了一些独有的改进,将在下文中详细介绍。
特征空间由三个主要部分组成:全局信息、地图特征和动作队列。每个组件都旨在捕捉关键信息,使机器人能够在环境中高效运作。
全局信息
特征空间的第一个组件是全局信息,包括环境当前的时间阶段(步数、周期、小时)以及机器人和资源的总数。我们对某些特征采用独热编码,得到 32 维的特征向量。
地图特征
地图特征组件包含每个区块中资源(地衣、冰、矿石、碎石)的信息,以及每个区块中机器人(单位、工厂)的位置。特征维度设计为 48×48×30。
动作队列
特征空间的最后一个组件是动作队列,表示机器人队列中当前的一组动作。该组件的特征维度为 48×48×20×6。
为了编码特征空间,我们将编码后的全局信息在每个网格上进行复制,然后使用 ResNet 将三个组件融合,以实现最高效率。
对强化学习玩家来说,最大的挑战是管理第二赛季中庞大的动作空间。为此,我们将每个机器人每回合发送的动作数量限制为仅一个,即完全忽略动作队列,将其转化为一个实时控制问题。与 flg 的方法不同,我们允许动作重复执行,从而节省部分能量。此外,我们还实现了如下较为复杂的条件采样。
我们按以下顺序对不同维度的动作进行采样:
前面采样的维度会影响后续维度的采样,因此整个动作空间被建模为一个条件概率分布。
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 设置为自我对抗,即自我对弈。然而,我们发现模型在训练过程中并未探索新的游戏状态。因此,我们从 Kaggle 下载了大量回放数据,随机选取其中各种游戏状态,并将这些中间状态作为自我对弈的初始设置。这帮助我们的策略探索了许多通过自我对弈难以演化出的游戏情境,数据下载方法可参考 Lux Season 1 的分享博客。
训练过程主要分为三个阶段。
奖励设置为如下表所示的稠密奖励,在此阶段我们编写了一个脚本来选择工厂的生成位置以及初始水/金属资源。此外,如果玩家输掉比赛,将受到一个较大的负奖励惩罚,这会抵消其过去所有的奖励。因此,只有获胜者在本阶段获得正奖励。
| 奖励类型 | 数值 |
|---|---|
| 胜利奖励 | 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 分数,而不会出现任何明确的异常提示。尽管如此,我们仍希望与大家分享我们的方法。