返回列表

Imitation Learning: 3rd Place Solution

645. NeurIPS 2024 - Lux AI Season 3 | lux-ai-season-3

开始: 2024-12-09 结束: 2025-03-24 游戏AI AI大模型赛
模仿学习:第三名解决方案
作者: aDg4b (egrehbbt)
发布日期: 2025-03-16
竞赛排名: 第 3 名

模仿学习:第三名解决方案

在比赛开始时,我最初尝试构建一个基于规则的代理(rule-based agent)。然而,到了一月中旬,我已经达到了极限。在花费数周时间试图改进解决方案却没有任何进展后,我决定尝试模仿学习(IL)方法。花费几天时间下载和准备数据,随后仅用了几个小时进行训练。令我惊讶的是,基于 IL 的机器人表现优于我最好的基于规则的代理。这导致我放弃了基于规则的方法,转而使用 IL。虽然没有在强化学习(RL)方面取得突破性发现,但这段经历既宝贵又愉快!

解决方案

我的解决方案基于两个 UNet:

  1. 全局单位 UNet(World-wise Unit-UNet):预测我每个单位的动作。
  2. 基于单位的 SAP UNet(Unit-wise SAP-UNet):预测 SAP 动作的目标。

我原本计划将这两个网络合并为一个模型,但还没来得及实施。

单位 UNet (Unit-UNet)

单位 UNet 接受两种类型的输入:

  1. 特征图 (28x24x24):这些图表示环境和单位状态在当前和上一步的各个方面。部分特征图包括:单位位置和能量(当前和上一步)、舰队视野、星云、小行星、节点能量、遗物、奖励点数、节点脱离视野的持续时间。
  2. 全局特征 (17):这些特征被广播到 UNet 的瓶颈层,包括:移动成本、SAP 成本、SAP 范围、比赛开始以来的团队分数、上一步的团队分数、比赛步骤、比赛编号、隐藏常数(nebula_tile_drift_speed, nebula_tile_energy_reduction, nebula_tile_vision_reduction, unit_sap_dropoff_factor, unit_energy_void_factor)。

单位 UNet 的输出是一个形状为 6x24x24 的张量,代表在每个位置执行 6 种可能动作(中心、上、右、下、左、SAP)的概率。

此架构无法正确处理两个或多个单位占据同一位置的情况。为了解决这个问题,在训练期间,如果多个单位处于同一位置,我会随机为所有单位选择一个动作,优先选择移动动作和 SAP 动作而不是中心动作。这确保模型学会避免被动行为并鼓励更具战略性的动作。

在推理期间,单位 UNet 预测每个位置的单个动作。为了处理同一位置的多个单位,我按能量对它们进行排序,并将预测的动作分配给能量最高的前半部分单位。这有助于分散单位并减少 clustering 的风险。由于顶级团队通常避免聚集他们的单位,因此单位 UNet 的这一限制在实践中并不是一个大问题。

SAP UNet (SAP-UNet)

该网络补充了单位 UNet,用于预测 SAP 动作的目标位置,而单位 UNet 确定单位是否首先执行 SAP 动作。

SAP UNet 具有与单位 UNet 类似的架构,但有一些差异。该网络是基于单位的,意味着它专注于单个单位而不是整个环境。在特征图方面,我添加了单位位置和单位 SAP 位置以帮助模型聚焦于特定位置。此外,我将单位能量作为全局特征包含在内。

SAP UNet 的输出是一个形状为 24x24 的张量,代表网格上每个位置潜在 SAP 动作目标的概率分布。

数据选择

对于我的模仿学习,我使用了团队 "Frog Parade" 和 "Flat Neurons" 的回放数据。非常感谢这些团队!

我没有使用回放中的所有时间步。如果代理输掉了游戏,我只将代理获胜的比赛添加到数据集中。如果代理赢得了游戏,我将该回放中的所有比赛添加到数据集中。然而,我从未使用结果已经决定的比赛(即当一方赢得超过 2 场比赛时)。这是因为这些比赛可能不再反映正常的 gameplay,并且可能对训练没有那么有用。

数据预处理

我认为数据预处理是本次竞赛中 IL 最具挑战性和最关键的部分,我将大部分时间花在了这一步。

代理无法完全看到环境——它在战争迷雾下运行,意味着它只能看到游戏状态的一个子集。此外,还有一些隐藏常数和奖励位置,代理在游戏期间无法直接观察到。准确模拟这些隐藏元素对于训练代理有效模仿回放代理的行为至关重要。为了实现这一点,在每个回放步骤,我运行自己的代码,接收回放代理可用的信息。该代码尝试根据代理的观察结果识别奖励位置、填充障碍物地图(小行星和星云)并揭示隐藏常数。此过程几乎与 Relicbound bot 中的 space.update 方法相同。

因此,实际的训练数据不是直接来自回放,而是我的代码在游戏期间从回放代理的观察中提取的数据。

此外,如果回放代理的生成位置在右下角,我沿对称线镜像了整个地图。此变换确保数据集中的所有数据的生成位置都在 (0, 0)。然而,此过程影响了右、左、上、下动作的分布,增加了右和下动作的频率,同时减少了左和上动作的频率,使数据集更加不平衡。为了解决这个问题,我在训练期间使用了加权交叉熵损失,虽然我不确定权重是否有显著影响。我还丢弃了 95% 所有单位执行中心动作的实例,以减少它们的频率并加快学习过程。

同比赛其他方案