356. NFL Big Data Bowl | nfl-big-data-bowl-2020
我要大声感谢国家橄榄球联盟(NFL)和 Kaggle 主办了如此有趣的比赛!就我个人而言,我最喜欢这次比赛的一点是,它挑战你构建一个能够反映比赛动态的自定义模型。
这次比赛立刻让我们想起了分子属性竞赛,那个比赛要求根据原子的空间构型预测标量耦合常数。因此,我们的想法是将那里的思路融入到我们的模型中。我们参考了 Quantum Uncertainty 的第2名解决方案:
这立即触发了使用 Transformer 层(编码器)堆叠的想法,输入为 x、y、z(归一化但保持原样)、原子类型和 j-耦合类型嵌入;只是简单的拼接……没什么花哨的。
因此,我们做了最少的特征工程,主要使用了在公开 Kernel 中可以找到的数据预处理步骤。所有的进攻都被转换为向右进攻的方向。有序特征使用 StandardScaler 进行转换。
我们的模型由三个不同的模块组成:球员-球员交互模块、球员模块和全局比赛模块。
输入是一个形状为 (batch_size, num_players, num_players, num_features) 的张量 X_1,其中 X_1[:, i, j] 包含关于球员 i 和球员 j 的信息——他们的相对距离、速度和加速度(距离也推算到未来),他们在 x 和 y 方向上的相对距离/速度/加速度,以及他们的球队——进攻组/防守组/持球跑卫。
然后,X_1[:, i] 被输入到三个可能的 Transformer 类型模块之一。也就是说,我们为进攻球员准备了一个 Mini-Transformer(就像 BERT 中的 2-3 个块),为防守球员准备了一个,为持球跑卫准备了一个。在这些模块之后,我们将输出拼接在一起(形状与 X_1 相同),并在张量维度 1 上取平均值。这样,我们就得到了一个形状为 (batch_size, num_players, num_features’) 的张量 X_1’。
然后,该输出沿最后一轴拼接到球员输入张量 X_2,其形状为 (batch_size, num_players, num_features’’)。它包含每个球员的位置、与持球跑卫的距离、x 和 y 方向的速度等特征。拼接后的张量通过另一个 Mini-Transformer(通常为 2 个块)处理。之后,我们只保留输出 X_2[:, 0] 的第一个维度,其中索引 0 是持球跑卫的位置,并将其与比赛输入拼接。
比赛输入包含诸如距离码线的距离等信息。然后,拼接后的张量通过预测头(仅 2-5 个线性层)处理,以预测形状为 (batch_size , 199) 的累积概率分布。
在 Sigmoid 输出之前,我们添加了一个掩码,以便正确预测“不可达”的码数(由当前码线决定)(掩码为 -100、0 或 100,这样 sigmoid(x+ mask) 对于我们知道实际标签的区域将是 0 或 1)。这使我们的成绩提高了约 0.0003,并稳定了模型的训练。
模型开发使用基于时间的 5 折交叉验证。由于各折之间的验证损失差异很大(从 0.010x 到 0.013x),我们添加了额外的指标来计算长跑(定义为 Yards>=15 的跑动)和短跑(Yards<15 的跑动)的 MSE 损失。长跑损失(0.07-0.08)大约是短跑损失(0.007-0.01,取决于是否有持球跑卫跑出负码数)的 10 倍。因此,验证损失的差异可以通过各折中长跑百分比的差异来解释。
我们使用了 MSE 损失,批次大小为 32,在第 4 个 epoch 后对某些特征进行 5% 的交换 dropout,学习率衰减的起始学习率为 5e-4。我们模型的 Transformer 隐藏层大小在 32-48 之间,注意力头为 1 或 2 个。我们没有抓取测试数据进行模型开发。
在如何提高模型性能方面有很多调整,例如,保持球员-球员交互模块中的距离特征未缩放(不进行预处理)非常重要。此外,将交互