Slide 1

Slide 1 text

NFLコンペ 2026 1st Place Solution ohkawa3 (Yasuhiro Ohkawa)

Slide 2

Slide 2 text

• 大川 泰弘(おおかわ やすひろ) • 郵便・物流向けの画像認識システム • NNコネコネ系が得意 • 4年半の苦行の末 ソロ優勝 & ソロGM 2 自己紹介

Slide 3

Slide 3 text

3 タスク概要 パスを投げてからボールが着地するまでの選手の位置を予測 パサー レシーバー ルートランナー ディフェンス ボール着地点 ボール

Slide 4

Slide 4 text

4 タスク概要 パサー レシーバー ルートランナー ディフェンス ボール着地点 ボール パスを投げてからボールが着地するまでの選手の位置を予測

Slide 5

Slide 5 text

• パスが投げられてから、ボールが着地するまでの選手の位置座標を予測 • センサ情報は10fps => 2.5秒のパスの場合は25フレーム分の座標を予測 • 評価指標は平均二乗誤差 • 272試合 & 4317プレイ @ 2023年のレギュラーシーズン18週間分 5 タスク概要:データと指標 選手の時系列情報 • XY座標 • 速度 • 加速度 • 選手の方向 • 動きの方向 選手の情報 • 予測対象か否か • 役割 パサー、レシーバ、守備、その他 • 攻守 • ポジション • 身長・体重・名前・生年月日 プレイの情報 • 予測フレーム数 • ボールの着地座標 • ゴールへの距離 • 右攻め・左攻め ターゲット • 予測対象選手のXY座標

Slide 6

Slide 6 text

• パスが投げられてから、ボールが着地するまでの選手の位置座標を予測 • センサ情報は10fps => 2.5秒のパスの場合は25フレーム分の座標を予測 • 評価指標は平均二乗誤差 • 272試合 & 4317プレイ @ 2023年のレギュラーシーズン18週間分 6 タスク概要:データと指標 選手の時系列情報 • XY座標 • 速度 • 加速度 • 選手の方向 • 動きの方向 選手の情報 • 予測対象か否か • 役割 パサー、レシーバ、守備、その他 • 攻守 • ポジション • 身長・体重・名前・生年月日 プレイの情報 • 予測フレーム数 • ボールの着地座標 • ゴールへの距離 • 右攻め・左攻め ターゲット • 予測対象選手のXY座標 予測フレーム数とボール着地点が与えられるのは簡単すぎでは・・・?

Slide 7

Slide 7 text

• パスが投げられてから、ボールが着地するまでの選手の位置座標を予測 • センサ情報は10fps => 2.5秒のパスの場合は25フレーム分の座標を予測 • 評価指標は平均二乗誤差 • 272試合 & 4317プレイ @ 2023年のレギュラーシーズン18週間分 7 タスク概要:データと指標 選手の時系列情報 • XY座標 • 速度 • 加速度 • 選手の方向 • 動きの方向 選手の情報 • 予測対象か否か • 役割 パサー、レシーバ、守備、その他 • 攻守 • ポジション • 身長・体重・名前・生年月日 プレイの情報 • 予測フレーム数 • ボールの着地座標 • ゴールへの距離 • 右攻め・左攻め ターゲット • 予測対象選手のXY座標 予測フレーム数とボール着地点が与えられるのは簡単すぎでは・・・? おそらく上記が与えられないと、不確実性が大きすぎてまともに解けない 「どこにパスを出すのか」 だけで充分コンペになりそう

Slide 8

Slide 8 text

選手数:可変(ルール上 11 vs 11 = 22名) シーケンス長:可変(事前に与えられる) 8 タスク概要:可変長データ 可変長のデータをうまく扱うことが重要

Slide 9

Slide 9 text

9 タスク概要:Forecasting コンペ • Forecasting コンペ:12月にコード提出後 データが収集され1月に評価 • 評価時にバグで落ちると、参加すらしていなかったことに • 1899チーム が 最終的に772チームに できるだけシンプルな実装!

Slide 10

Slide 10 text

10 全体構成 前処理 データ拡張 特徴量eng Loss関数 正解座標 NNモデル 入力データ 正規化 id, frame, x, y, s, a, .... : n_input id, frame, x, y : n_output 22人:足りない場合はゼロ埋め id, frame, x, y, s, a, .... : 48フレーム 入力選手 5名 予測選手 2名 22人

Slide 11

Slide 11 text

11 全体構成 前処理 データ拡張 特徴量eng Loss関数 正解座標 NNモデル 入力データ 正規化 id, frame, x, y, s, a, .... : n_input id, frame, x, y : n_output 22人:足りない場合はゼロ埋め 入力選手 5名 予測選手 2名 id, frame, x, y, s, a, .... : n_output 予測選手とフレーム数で フィルタ 22人

Slide 12

Slide 12 text

12 全体構成 前処理 データ拡張 特徴量eng Loss関数 正解座標 NNモデル 入力データ 正規化 id, frame, x, y, s, a, .... : n_input id, frame, x, y : n_output 22人:足りない場合はゼロ埋め 入力選手 5名 予測選手 2名 id, frame, x, y, s, a, .... : n_output 予測選手とフレーム数で フィルタ 22人 仕様外データ除去 回転 XYシフト 時間シフト ほぼ無し 標準化 1DCNN Transformer 1DCNN GausianNLL

Slide 13

Slide 13 text

13 全体構成 前処理 データ拡張 特徴量eng Loss関数 正解座標 NNモデル 入力データ 正規化 id, frame, x, y, s, a, .... : n_input id, frame, x, y : n_output 22人:足りない場合はゼロ埋め 入力選手 5名 予測選手 2名 id, frame, x, y, s, a, .... : n_output 予測選手とフレーム数で フィルタ 22人 仕様外データ除去 回転 XYシフト 時間シフト ほぼ無し 標準化 1DCNN Transformer 1DCNN GausianNLL

Slide 14

Slide 14 text

14 NNモデル

Slide 15

Slide 15 text

15 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰

Slide 16

Slide 16 text

16 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム

Slide 17

Slide 17 text

17 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム Depth-wise 1DConv を 繰り返し 特徴を最終フレームに集約

Slide 18

Slide 18 text

18 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標

Slide 19

Slide 19 text

19 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標 埋め込む

Slide 20

Slide 20 text

20 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標

Slide 21

Slide 21 text

21 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標 動的特徴と静的特徴を結合 (ここでシーケンス長は1に固定)

Slide 22

Slide 22 text

22 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標

Slide 23

Slide 23 text

23 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標 並び変えて 選手間でSelf Attenton

Slide 24

Slide 24 text

24 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 パス直前の 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標

Slide 25

Slide 25 text

25 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 ✕ 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標 256次元を1536次元に拡張し 32次元 ✕ 48フレーム にReshape 4つのHeadに分岐

Slide 26

Slide 26 text

26 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 ✕ 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標 main 予測 main 分散 補助 予測 補助 分散 256次元を1536次元に拡張し 32次元 ✕ 48フレーム にReshape 4つのHeadに分岐

Slide 27

Slide 27 text

27 NNモデル 動的 Stem 静的 Stem 統合 選手間 Transformer 座標回帰 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 ✕ 20フレーム 予測フレーム数 ボールの着地座標 パスの開始地点 プレイヤーRole プレイヤーの最終座標 main 予測 main 分散 補助 予測 補助 分散 256次元を1536次元に拡張し 32次元 ✕ 48フレーム にReshape 4つのHeadに分岐 メイン:座標 GausianNLLロス 補助:速度・加速度 GausianNLLロス

Slide 28

Slide 28 text

28 全体構成 前処理 データ拡張 特徴量eng Loss関数 正解座標 NNモデル 入力データ 正規化 id, frame, x, y, s, a, .... : n_input id, frame, x, y : n_output 22人:足りない場合はゼロ埋め 入力選手 5名 予測選手 2名 id, frame, x, y, s, a, .... : n_output 予測選手とフレーム数で フィルタ 22人 仕様外データ除去 回転 XYシフト 時間シフト ほぼ無し 標準化 1DCNN Transformer 1DCNN GausianNLL

Slide 29

Slide 29 text

29 ロス関数:データの特性 • 予測時刻が大きくなるほど座標誤差が増大する • 評価指標のMSEで学習すると過学習 • 公開Notebookでは Huber + 時間減衰 で対処されていた 時刻

Slide 30

Slide 30 text

30 ロス関数:データの特性 • 予測時刻が大きくなるほど座標誤差が増大する • それ以外の属性によって、誤差の大きさ(分散)が異なる 属性に応じて自動的に重み付けをするロスがほしい Offence vs Diffence X軸 vs Y軸 ボール座標との距離

Slide 31

Slide 31 text

31 ロス関数: GausiannNLLLoss • GausiannNLLLoss (Gausiann Negative Log-Likelihood Loss) • 𝜇 と 𝜎2 をNNに予測させる • 基本的に 𝜇 は二乗誤差と同じ、 𝜎2が異なる部分 • 難しいデータ(分散の大きい領域)の重みは小さく • 簡単なデータ(分散の小さい領域)の重みは大きく • CVで0.01の改善(1位と金ボーダーの差が0.02) 定数項なので無視 yとの誤差が小さくなる ように 𝜇 を予測す 分子に応じて𝜎2 が バランスを取る

Slide 32

Slide 32 text

32 ロス関数: GausiannNLLLossを用いた不確実性の可視化 パサー レシーバー ルートランナー ディフェンス ボール着地点 ボール 2σの範囲を可視化

Slide 33

Slide 33 text

33 ロス関数: GausiannNLLLossを用いた不確実性の可視化 パサー レシーバー ルートランナー ディフェンス ボール着地点 ボール 2σの範囲を可視化

Slide 34

Slide 34 text

34 データ拡張:時間シフト 前処理 データ拡張 特徴量eng Loss関数 正解座標 NNモデル 入力データ 正規化 id, frame, x, y, s, a, .... : n_input id, frame, x, y : n_output 22人:足りない場合はゼロ埋め 入力選手 5名 予測選手 2名 id, frame, x, y, s, a, .... : n_output 予測選手とフレーム数で フィルタ 22人 仕様外データ除去 回転 XYシフト 時間シフト ほぼ無し 標準化 1DCNN Transformer 1DCNN GausianNLL

Slide 35

Slide 35 text

35 データ拡張:時間シフト • エラーは、frame >= 10(1秒以降) データの寄与が大きい • ロングパスのデータを増やしたいが、データ拡張での実現は難しい

Slide 36

Slide 36 text

36 データ拡張:時間シフト パス以前のデータも予測させる • CVで0.035の改善(これがないと銀上位まで落ちる) 予測:10フレーム 予測:15フレーム モデルへ入力 予測 未使用

Slide 37

Slide 37 text

37 データ拡張:時間シフト パス以前のデータも予測させる • パスの前後で、選手の挙動は大きく変わるはず パスの時刻をモデルに入力 • CVで0.005の改善(これがないと3位まで落ちる) 予測:10フレーム 予測:15フレーム モデルへ入力 予測 未使用 このタイミングで大きく変わるはず ★

Slide 38

Slide 38 text

38 まとめ • NFL コンペ 2026でソロ優勝 & GM昇格 • 上位の解放がばらついていて良いコンペだったように思える • データ拡張・ロス関数・NNモデル、かなり工夫できた Writeup Notebook https://www.kaggle.com/code/chack3/nfl2026-1st-place-train https://www.kaggle.com/competitions/nfl-big-data-bowl-2026-prediction/writeups/public-3rd-solution Notebook Writeup

Slide 39

Slide 39 text

39 おまけ: Forecasting コンペはメンタルに良くない • コンペ終了後、毎週木曜日のLB更新は深夜に目が覚める • 1週目の更新、2週目の更新でどんどんチームが減っていく • 次は自分なのか、、、脱落する夢を何回か • 3・4週目はクリスマス&新年で更新されず、逆に良かった • 1月7日朝9時(日本)に発表予定、PrivateのLBが更新されるが2週目結果がそのままコピーで混乱 • 40時間程度放置をされた挙げ句、1月9日朝4時に目が覚めてスマホを見たら、優勝していました • 嬉しいのもあるが、ほっとしたというか

Slide 40

Slide 40 text

40