1st Place Solution - NFL Big Data Bowl 2026
作者: ohkawa3 (Grandmaster)
发布日期: 2025-12-04
竞赛: NFL Big Data Bowl 2026 – Prediction
第一名解决方案
首先,我要感谢组织者举办了如此激动人心的比赛。
现在,我只能希望我的提交能通过最终的测试。
正如我在另一个讨论帖中提到的,我的模型仅使用"NFL Big Data Bowl 2026 – Prediction"竞赛中提供的数据进行训练。
要在如此有限的数据集上实现强大的性能,需要强大的数据增强、精心设计的损失函数以及有效的模型架构。
解决方案概述
1. 特征工程 (Feature Engineering)
1.1 动态特征 (Dynamic Features)
- 使用传球前紧挨着的 20 帧 数据。
- 为每一帧提取以下 10 维 特征:
x, y (坐标)
sin(o), cos(o) (朝向)
sin(dir) * s, cos(dir) * s (速度向量)
x - ball_land_x, y - ball_land_y (与球落点的相对位置)
x - receiver_x, y - receiver_y (与接球手的相对位置)
1.2 静态特征 (Static Features)
- 总共 12 维:
player_role 的 One-hot 编码 (4 维)
- 预测帧数 (1 维)
- 用作输入的传球前帧数 (1 维)
- 传球手最后一帧的坐标 (2 维)
- 球落点坐标 (2 维)
- 球员最后一帧的坐标 (2 维)
1.3 目标变量 (Target)
- 预测从最后一个输入帧开始的 位移 (Δx, Δy)。
- 最终的轨迹是通过将预测的位移加到最后的输入坐标上获得的。
2. 模型架构 (Model Architecture)
2.1 整体结构
- 一个处理最多 22 名球员的 比赛级模型 (play-level model)。
- 球员维度经常被重塑/转置到批处理轴 (batch axis) 中。
2.2 动态特征编码器 (Dynamic Feature Encoder)
- 输入:
(10, player, 20 frames)
- 输出:
(640, player, 1 frame)
- Depthwise Conv1d (核大小 = 3) × 7 层
- 无填充 (为了强调最后一帧)
- 20 帧 → 5 帧 → 仅使用 最后一帧
2.3 静态特征编码器 (Static Feature Encoder)
- 输入:
(10, player)
- 输出:
(64, player)
- Conv1d(kernel=1) → BatchNorm → SiLU
2.4 合并层 (Merge Layer)
- 连接动态特征 (640) + 静态特征 (64)
- 投影到 256 维 球员特征
2.5 球员间交互层 (Inter-player Interaction Layer)
- 输入:
(256, player)
- 输出:
(256, player)
- Transformer Encoder × 3 层
- 针对可变球员数量的球员掩码 (Player masks)
- FFN 使用 SwiGLU
2.6 解码器 (Decoder)
- 输入:
(256, player)
- 输出:
(2, player, 48 frames) + 4 个辅助输出
- 256 → 1536 → 重塑 →
(32, 48 frames)
- 应用多个 Conv1d (核大小 = 3)
- 最终投影:32 → 2 (xy) + 4 (辅助项)
3. 训练设置 (Training Setup)
3.1 交叉验证 (Cross Validation)
- 使用
game_id 进行 5 折 CV 分组
- 使用不同的分割方式执行 三次 5 折 CV
3.2 优化 (Optimization)
- RAdam 优化器
- EMA (指数移动平均),衰减率 = 0.9995
- 210 个 epoch,每 6 个 epoch 评估一次
4. 损失函数 (Loss Functions)
4.1 主要损失:GaussianNLLLoss
- 同时预测均值和方差
- 自动降低大方差样本的权重 → 鲁棒学习
- 表现优于 SmoothL1
- 逐帧加权未提供有意义的改进
- 方差使用以下公式约束为正值:
softplus(var) + 1e-3
4.2 辅助损失 (Auxiliary Loss)
- 从预测的 xy 计算得出:
- 同样使用 GaussianNLLLoss
- 有助于稳定和加速学习
5. 数据增强 (Data Augmentation)
5.1 旋转增强 (Rotation Augmentation)
- 50% 的概率围绕平均球员位置随机旋转整个比赛画面
- 旋转角度从 0–360° 均匀采样
- 最初使用高斯分布 (σ = 5°),但增加方差提高了性能 → 改为均匀分布
- 可能有益,因为目标取决于 旋转不变的相对位置
5.2 从更早的帧开始预测 (Predicting From Earlier Frames)
- 对长传预测很重要
- 不是在传球尝试帧开始预测,而是使用提前最多 20 帧 的数据
- 因此模型预测:
- 显著改善了长轨迹的预测
- 添加一个静态特征指示“提前了多少帧”
上图显示了一个示例,其中数据由 30 个输入帧和 9 个输出帧组成。
蓝色表示输入到模型的部分,红色表示模型被要求预测的数据,灰色表示未使用的数据。
当我们希望模型从传球前 5 帧开始预测时,配置如下图所示。
通过此调整,输出变为 14 帧预测。
此过程使用同一组参数应用于比赛中的所有球员。
5.3 垂直翻转 (Vertical Flip)
6. 数据处理 (Data Processing)
6.1 异常值移除 (Outlier Removal)
移除长度异常或丢失传球手的比赛:
too_long_ids = ["2023091100_3167", "2023122100_1450"]
no_passer_ids = ["2023091001_3216", "2023112606_4180", "2023121009_3594"]
6.2 其他处理
- 如果
play_direction == left,将比赛画面旋转 180 度
7. 集成 (Ensemble)
- 使用 100+ 个模型 的集成
- 所有模型共享相同的架构
- 多样性来源于:
- 集成方法:简单平均
8. 消融实验 (Ablation Study)
5 个折中每个折的分数随 epoch 的变化。
并排查看结果很有趣,可以看到旋转增强和早期帧预测有助于减少过拟合,辅助损失稳定了训练,而 GaussianNLLLoss 有助于提高准确性。