2.5K Views
February 25, 26
スライド概要
【イベント】
DeNA × AI Talks #6
https://dena.connpass.com/event/382039/
DeNA が社会の技術向上に貢献するため、業務で得た知見を積極的に外部に発信する、DeNA 公式のアカウントです。DeNA エンジニアの登壇資料をお届けします。
MABe Challenge振り返りと Cursorを使った実験の回し方 吉川天斗 AI技術開発部ビジョン・スポーツグループ 株式会社ディー・エヌ・エー © DeNA Co., Ltd. 1
自己紹介 吉川 天斗 / Takato Yoshikawa AI技術開発部 ビジョン・スポーツグループ (24新卒) 川崎ブレイブサンダース AIチーム強化 PJ MABeコンペ チームで2位 Kaggle Competitions Master 単一視点の試合映像からトラッキングデータ自動作成 © DeNA Co., Ltd. 映像協力:SoftBank 2
目次 © DeNA Co., Ltd. 1 MABe Challenge振り返り 2 Cursorを使った実験の回し方 3
MABe Challenge振り返り © DeNA Co., Ltd. 4
MABe Challenge - Social Action Recognition in Mice 概要 ● 動物の社会行動分析のために、マウスの行動を自動認識したい ● 複数マウスのキーポイント時系列データから、いつ・どの個体が誰に対して (または自分で)どの行動をしたかを予測 行動認識 モデル © DeNA Co., Ltd. 5
データ 利用可能なデータ ● 各マウスのキーポイント時系列データ ● メタデータ ○ ラボID ○ マウス情報(ID, 性別) ○ FPS ○ どのマウスがどのアクションで アノテーションされているか (agent, target, action) 例:(mouse1, mouse2, approach) (mouse1, self, run) 予測対象:各フレームのマウスの行動 © DeNA Co., Ltd. 6
社会的行動と非社会的行動 社会的行動 非社会的行動 target mouse agent mouse agentがtargetに行うペア行動 26種類 例:sniff(嗅ぐ)、chase など 1匹だけで行うソロ行動 11種類 例:run, restなど ペアとソロの行動でモデルを分ける? →(自チーム)ペアとソロで予測に重要な特徴量は変わると考えて、分ける! © DeNA Co., Ltd. 7
ラボごとのデータの違い ラボごと予測対象アクションが異なる ラボごとにマウス部位が異なる ラボ ラボ Body Part アクション ラボごとにモデルを分ける? →(自チーム)1つのモデルで複数ラボを扱う! ラボIDや予測対象アクションを入力としつつ、全ラボで共通する特徴を学習したい https://www.kaggle.com/competitions/MABe-mouse-behavior-detection/writeups/7th-place-gold-cnn-transformer-with-invariant-fe © DeNA Co., Ltd. 8
自チーム解法 データ前処理 * 30FPSに揃える * 欠損フレームの補間 ペアとソロの行動で モデルを分ける ラボごとには分けない Solo Model ※Pair Model と 同様のアーキテクチャ Pair Model 距離特徴 速度特徴 加速度特徴 メタ特徴 後処理 1D CNN + Transformer / Bi-GRU x4 * mean ensemble * しきい値最適化 SqueezeFormer x1 output (フレーム数=512) x (特徴量次元数) 時系列NNモデル © DeNA Co., Ltd. 9
特徴量作成 ● 絶対位置ではなく、マウス部位座標の相対的な位置関係を入力としたい ● ラボ間でなるべく共通する部位(12部位)を利用 ○ ○ 距離特徴 ■ ペアモデルの場合:2匹マウス間の部位の距離 ■ ソロモデルの場合:自身の部位間距離 速度・加速度特徴 ■ ● ベクトルではなくノルム メタ特徴 © DeNA Co., Ltd. ○ Lab ID (embedding層を通して16次元に) ○ 予測対象となるアクションのOne-hot ○ FPS、マウス性別 ペア距離特徴 ソロ距離特徴 10
モデルアーキテクチャ ● Solo ModelもPair Modelも基本的に同様 ○ ● Solo Modelのほうがデータ数が少ないので、パラメータ数は少なめになるように層数を調整 1D CNN + Bi-GRU / Transformer ○ Data Augmentationや学習率を変えながら いくつかのバリエーションを作成 ● SqueezeFormer 1D CNN + Bi-GRU / Transformer © DeNA Co., Ltd. 11
学習 ● Binary Cross Entropy Loss ● ラボ IDをターゲットにした5-fold stratified cross-validation ○ ● testにないラボ IDデータは常にtrainに データ拡張 © DeNA Co., Ltd. ○ Gaussian noise ○ Time stretching ○ Frame shift (shift features only; labels unchanged) ○ Left/right body-part flipping ○ Mixup 12
推論・アンサンブル ● ● ● 推論 ○ 128フレームずつずらして、512フレームごとに推論 ○ 両側32フレームの予測は捨てる ○ 重複部分は単純平均 アンサンブル ○ Sigmoid後の値を単純平均 ○ 作成したバリエーションの組を変えながらCV scoreが最も高い組み合わせを選択 しきい値最適化 © DeNA Co., Ltd. ○ (ラボ ID, Action)ごとにしきい値を最適化 ○ しきい値を超えるアクションの中で最も高い値のアクションを最終的な予測として検出 13
Shake up (public 8位 -> private 2位) ● AdaptableSnail Labの25FPSデータがラベルだけ 30FPSになってしまっている(Discussion) ○ 更に、マウスIDがシャッフルされている ○ 修正するか検討中という感じだったが、そのまま 音沙汰なし ● 学習データはラベルを25FPSに修正 動画を確認してマウスIDをつけ直し ○ ○ © DeNA Co., Ltd. (マウスIDの付け間違いに法則があるのではないかと 確認していたがランダムっぽかった) ↑上のような動画で確認(修正後) このデータを学習に加えるとCV/LBともに改善 ←元のIDと修正後のID 14
Shake up (public 8位 -> private 2位) ● テストデータの推論時は予測結果を30FPSに 合わせる(片方のSubだけ) ○ start_frame, end_frameを*30/25 ○ テストデータもマウスIDがシャッフルされている ならどちらにせよ予測はできないが、結果として シャッフルされてなかったぽい ○ ● private 9位相当(処理なし)→ private 2位に 他のprivate上位チームはこのデータの予測を 削除することで対処 ○ © DeNA Co., Ltd. 1, 3, 4位は予測削除によってshake up 15
その他上位チームの工夫点 ● 予測対象でないアクションをマスクしてLoss計算(上位ほとんど) ● agent mouse中心座標系へ変換し、相対座標を入力 ● 自己教師あり学習による事前学習 ○ ラベルがないキーポイントデータが大量にあった ○ 一部座標をマスクして再構成(6位)や未来の座標を予測(1位) ● すべてのラボで学習した後に、ラボごとのデータでファインチューニング(6位) ● GBDTによるフレームごとの分類モデルをアンサンブルに追加 ○ 時系列モデルとのスコア差がかなりあると思ったので自チームでは入れなかったが ほとんどのチームがアンサンブルに追加していた © DeNA Co., Ltd. 16
振り返って ● Kaggle Competition Master! ● shake upできる可能性があるサブを選べたのはよかった ● 上位の解法を見るとまだまだ試せることはあった © DeNA Co., Ltd. ○ モデルアーキテクチャ ○ アンサンブルのモデルの多様性 ○ 自己教師あり学習 17
Cursorを使った実験の回し方 © DeNA Co., Ltd. 18
自分の実験管理 ● 1実験1フォルダ ○ ○ kamiさんのkaggleテンプレートをベースに一部改良 ■ https://github.com/unonao/kaggle-template ■ テンプレート解説 フォルダごとコピーして次の実験を実装 ● 実験ログはWandbで管理 ● 今回は基本的にCursor+Claudeモデルでコード生成 © DeNA Co., Ltd. 19
実験の流れ 人間が 頑張る Cursorに 任せる cursor agent 1 ベース実験 フォルダコピー +実験の実装 ベースライン 作成 Debugモードで 動作確認 実験内容を log.mdにメモ 次の実験を 考える cursor agent 2 cursor agent 3 … © DeNA Co., Ltd. 20
Debugモード ● データ少なめ・エポック小さめで 実行するモードを実装しておく ○ データが少ないことが原因のエラーが 発生しないように気を付ける ○ ↑のエラーを突破するようにagentが余計な 処理を入れることも ● Cursorのrulesに実装後debugモードで動作 確認するように伝える ○ 学習前に少ないデータで学習・推論を実行 し、事前にエラーを発見・修正 © DeNA Co., Ltd. 21
実装時に実験内容を残しておいてもらう ● これまではNotion等に実験内容をメモしていた ○ 書き忘れで何をしたか思い出せなくなることも… rulesに追加 ● 動作確認後、実験内容をlog.mdに書き残すよう にrulesに追加 ○ 実験名 ○ ベースの実験名 ○ 改善内容 log.md © DeNA Co., Ltd. 22
実装時に実験内容を残しておいてもらう ● ベース実験名を繋いで実験グラフを可視化 人間が実装して実験内容メモを 忘れているせいで途切れている © DeNA Co., Ltd. 23
可視化・指標ログを多めに ● AIが生成したコードをすべて追うのは時間がかかる →基本的に可視化やログを見て判断・気になる挙動はソースコードを確認 ○ どのようなデータのスコアが改善・悪化しているか ○ データ拡張・入出力が想定外の挙動をしてないか ○ 学習中のラボごとのvalidation score推移 © DeNA Co., Ltd. 入出力プロット 24
まとめ ● ● 今回のコンペにおける自分の実験の回し方をざっくりと紹介 ○ テンプレートやcursor rulesを使って効率的に進める ○ まだまだ効率化できることはありそう 実験方針を考えるところはまだ人間が頑張る必要がありそう? ○ 特に最初のベースラインの方針は細かめに実装指示を出した ○ 実験ログや実験ごとのスコアを参照させつつCursorに何回か雑に投げてみたが、 芯を食った方針はあまりなさそうだった © DeNA Co., Ltd. 25
© DeNA Co., Ltd. 26