返回列表

Goosebumps' solution - 2nd place

449. Hungry Geese | hungry-geese

开始: 2021-01-26 结束: 2021-08-09 游戏AI 数据算法赛
Goosebumps 的解决方案 - 第二名

简介

首先,我们要感谢 Kaggle 团队举办了如此有趣的比赛,也要感谢许多竞争对手通过教程笔记本、入门代理和策略讨论分享他们的想法。特别感谢 HandyRL ( @yuricat@kyazuki ) 早期开源了他们的强化学习框架,帮助许多人了解了强化学习。Kaggle 的卓越之处在于其热情友好的社区,本次比赛就是一个典型的例子。

我们的团队在智能体设计上采取了双管齐下的方法,@pressman1 负责将各种深度学习技术应用于该问题,而 @lpkirwin 则负责各种手工设计的智能体,并通过 Numba 和 Rust 进行加速。@vishyvishal 最终比预期忙碌,但在头脑风暴和超参数优化阶段给予了极大的帮助。虽然我们未能将不同的策略明确整合到一个提交中,但我们的方法允许我们每个人致力于自己最感兴趣的方向,分享想法和建议,并在比赛临近尾声时将精力集中在最成功的智能体上。我们最好的智能体最终使用了深度学习进行行为克隆,并结合蒙特卡洛树搜索,以及一些自定义修改以应对本次比赛特有的各种复杂因素。在这篇文章中,我们不仅会介绍我们最佳智能体的成功之处,还会涵盖我们尝试过的其他技术,因为其中许多技术与我们最好的智能体相比也颇具竞争力。欢迎提出建议——我们都在这里学习!

深度学习方法 (Isaiah @pressman1)

深度学习方法的代码可以在 GitHub 上找到。在深度学习方面,我们使用的是一台配备 32GB RAM 的 8核/16线程双 GPU 机器。这对于监督学习和监督学习相关应用来说算力充足,但限制了我们在大规模运行传统 CPU 密集型强化学习方面的能力。这影响了我们关于如何设计和训练智能体以及选择研究方向的多项决策。

最佳智能体

最佳智能体最终使用了深度学习进行行为克隆,并结合蒙特卡洛树搜索。此外,我们进行了许多修改以应对测试时的硬件限制、决策时间限制和超时规则以及对手的不可预测性。

行为克隆

在行为克隆中,我们使用回放数据训练了一个深度神经网络,以在每一步预测每个玩家的移动和最终结果。策略预测使用交叉熵损失,价值预测使用均方误差损失。我们在策略损失中添加了 0.1 的大权重熵惩罚,以激励预测中更大的不确定性。此外,在训练期间的数据增强方面,我们进行了随机水平和垂直翻转,并随机打乱智能体的顺序。我们的两种模型架构在环面上都是平移等变的,因此不需要平移数据增强。

数据选择

每天,我们都会下载顶级智能体的回放数据。(感谢 @robga 的教程笔记本)。我们只下载并训练那些最差智能体的最新排行榜得分大于某个阈值 t 的回合。随着更多强力智能体的提交,我们在比赛过程中提高了 t,只要训练数据仍然充足,t 的增加几乎总是会导致训练网络强度的显著提升。我们采用这种数据选择结构的动机,而不是使用前 N 名智能体的所有回放数据,是为了尽量减少输入网络的“坏数据”。评级较低的智能体经常会做出糟糕的决策,并且游戏结果不可预测。我们的训练算法并没有试图区分游戏中的好棋和坏棋或更好或更差的智能体,因此尽量减少训练数据集中糟糕决策和不可预测游戏的数量非常重要。

输入编码

对于模型输入,我们将棋盘编码为一个 19x7x11 的张量。前 16 个通道由每个智能体的 4 个通道组成:

  • 包含头部 - 全为 0 的矩阵,在智能体头部位置为 1。
  • 包含尾部 - 全为 0 的矩阵,在智能体尾部位置为 1。
  • 上一回合包含头部 - 全为 0 的矩阵,在智能体上一回合头部所在位置为 1。
  • 包含身体 - 大部分为 0 的矩阵,除了智能体身体所在的位置。值为 1/100 代表尾部,n/100 代表第 n 个身体段,从尾部开始计数并包括头部和尾部。

另外 3 个通道编码了食物的位置、距离上次饥饿过去了多少步以及当前步数。

模型架构

我们使用了两种不同的基础模型架构,并尝试了几种不同的 n_block(4、6 和 8)和 n_channel(64、92 和 128)配置。对于卷积架构,我们堆叠了 n_block