645. NeurIPS 2024 - Lux AI Season 3 | lux-ai-season-3
在比赛开始时,我最初尝试构建一个基于规则的代理(rule-based agent)。然而,到了一月中旬,我已经达到了极限。在花费数周时间试图改进解决方案却没有任何进展后,我决定尝试模仿学习(IL)方法。花费几天时间下载和准备数据,随后仅用了几个小时进行训练。令我惊讶的是,基于 IL 的机器人表现优于我最好的基于规则的代理。这导致我放弃了基于规则的方法,转而使用 IL。虽然没有在强化学习(RL)方面取得突破性发现,但这段经历既宝贵又愉快!
我的解决方案基于两个 UNet:
我原本计划将这两个网络合并为一个模型,但还没来得及实施。
单位 UNet 接受两种类型的输入:
单位 UNet 的输出是一个形状为 6x24x24 的张量,代表在每个位置执行 6 种可能动作(中心、上、右、下、左、SAP)的概率。
此架构无法正确处理两个或多个单位占据同一位置的情况。为了解决这个问题,在训练期间,如果多个单位处于同一位置,我会随机为所有单位选择一个动作,优先选择移动动作和 SAP 动作而不是中心动作。这确保模型学会避免被动行为并鼓励更具战略性的动作。
在推理期间,单位 UNet 预测每个位置的单个动作。为了处理同一位置的多个单位,我按能量对它们进行排序,并将预测的动作分配给能量最高的前半部分单位。这有助于分散单位并减少 clustering 的风险。由于顶级团队通常避免聚集他们的单位,因此单位 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% 所有单位执行中心动作的实例,以减少它们的频率并加快学习过程。
你可以在这里找到我的代码:
GitHub 仓库 https://github.com/w9PcJLyb/lux3-bot我的两个最终提交版本在这里:
最终提交版本 (Release 0.4.8) https://github.com/w9PcJLyb/lux3-bot/releases/tag/0.4.8在我的本地评估和公共排行榜上,lux3_0.4.8_fn.tar.gz 表现更好。