Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kaggle State Farm Distracted Driver Detection
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takuya Akiba
February 04, 2017
Programming
15
10k
Kaggle State Farm Distracted Driver Detection
Kaggle の画像分類コンテスト State Farm Distracted Driver Detection にて 1440 チーム中 9 位を取った際のアプローチについて。
Takuya Akiba
February 04, 2017
Tweet
Share
More Decks by Takuya Akiba
See All by Takuya Akiba
戦えるAIエージェントの作り方
iwiwi
29
16k
KaggleはAIに解けるか?MLE-Benchのいま (2025/08/23; 第4回 関東Kaggler会)
iwiwi
5
3.4k
自然着想型アプローチによる基盤モデルの研究開発 (2025/01/23, 第35回ステアラボ人工知能セミナー)
iwiwi
2
160
Evolutionary Optimization ofModel Merging Recipes (2024/04/17, NLPコロキウム)
iwiwi
11
7.2k
LLMの開発は難しい?簡単?Stability AIの現場から (2023/10/11, W&B Fully Connected)
iwiwi
12
10k
Stability AI Japanにおける大規模言語モデルの研究開発
iwiwi
17
12k
Kaggle Traveling Santa 2018 - 4th Place Solution
iwiwi
1
46
Other Decks in Programming
See All in Programming
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
140
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
100
CSC307 Lecture 07
javiergs
PRO
1
560
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
並行開発のためのコードレビュー
miyukiw
0
1.1k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2.4k
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
470
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1k
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
0
90
Designing Powerful Visuals for Engaging Learning
tmiket
0
240
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Building the Perfect Custom Keyboard
takai
2
690
Un-Boring Meetings
codingconduct
0
200
Building AI with AI
inesmontani
PRO
1
700
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
79
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
220
GitHub's CSS Performance
jonrohan
1032
470k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Transcript
2017/02/04 @ Kaggle Tokyo Meetup #2 Kaggle State Farm Distracted
Driver Detection by iwiwi
\ ヽ | / / \ ヽ | / /
\ / _ わ た し で す _ / ̄\ ― |^o^| ― \_/  ̄  ̄ / \ / / | ヽ \ / / | ヽ \
はじめに
このコンペは 僕にとって
初めての Kaggle
どころか
初めての 機械学習
本発表の注意! l 当時は右も左もわからない状態 l 今でも皆さんと違って機械学習歴半年ちょい l くれぐれも真に受けないでください! (変なところ突っ込んでもらえるとうれしいです!)
⽬次 1. 問題とデータ 2. 僕のアプローチ
1 問題とデータ
問題 l ⼊⼒:ドライバーの画像 l 出⼒:運転態度を 10 クラスに分類 l 評価:Multi-class log
loss (cross entropy)
クラス 0:安全運転
クラス 1:右⼿でスマホ操作
クラス 2:右⼿で通話
クラス c0: normal driving c1: texting - right c2: talking
on the phone - right c3: texting - left c4: talking on the phone - left c5: operating the radio c6: drinking c7: reaching behind c8: hair and makeup c9: talking to passenger
データ l imgs.zip n 訓練画像:22,424 n テスト画像:79,726 l driver_imgs_list.csv n
各訓練画像のドライバーが誰か
余談:LB での accuracy l 普通に提出するとテストデータの public LB 部分 での logloss
が⼿に⼊る(当たり前) l 実はテストデータの public LB 部分での accuracy も⼿に⼊れられる n 予想確率を one-hot っぽくして提出 (例:予想クラスを 0.91、それ以外を 0.01) n 正解時のスコアと不正解時のスコアが⼀定 n 正解の割合が計算できる
2 僕のアプローチ
第⼀話:leak の洗礼
Kaggle 初挑戦! l Chainer 付属の AlexNet l とりあえず放り込んでみる l validation
loss 0.117 l 1 位より遥か上!?やったか!?
初提出スコア 2.106 あれ、0.117 は!?\(^o^)/ ほぼサンプルのスコアじゃん!?
Validation はちゃんとやる l Train / validation を完全ランダムに選択し ていた l 同じドライバーの画像は極めて似てる
l テストデータと訓練データは違うドライバー l Train / validation もドライバーで分割しな いとだめ(そのための driver_imgs_list.csv!) l ド定番素⼈ミス
第⼆話:Pretrained VGG
Pre-trained VGG16 l このコンテストは external data 使⽤可 l Kaggle では初?
Forum では議論が⽩熱 l Pre-trained model は絶対使う⽅が良い (と思った) l Pre-trained model を使うため、 CNN のモデルは既存のものから選ぶだけ(楽になった?)
Pre-trained VGG16 [https://blog.heuritech.com/2016/02/29/a-brief-report-of-the-heuritech-deep-learning-meetup-5/]
Pre-trained VGG16 l 当時定番っぽかった VGG16 を選択 l Fine tuning は⼩さめの学習率
n 0.001 とかからスタート n (参考:ImageNet は普通 0.1 スタート) l 2,3 エポックで validation loss はサチってた (短い気がするが後述のデータの性質が関係?)
第三話:Model Averaging
Model Averaging l 5 個独⽴に学習して予測結果を平均 l 0.31661 → 0.22374 l
こっそり出てたけどこの辺でバレる
第四話:Data Augmentation
Data Augmentation とは l 訓練時に画像を変形させたりする l 擬似的に訓練データを増やす [http://ultraist.hatenablog.com/entry/2015/03/20/121031]
Data Augmentation l NSDB プランクトン分類コンペ優勝チーム のコードから拝借 (MIT ライセンス https://github.com/benanne/kaggle-ndsb) l
しかし、スコア変わらず (´ε`;)ウーン…
仮説1 l Pre-trained model を使っているから? l ⼊⼒に近い⽅の層で、これらの操作で⽣ まれる差は既に吸収されているのかも?
仮説2 l データが既に “Augment” されている? l 動画切り出しでデータが作られており、 同じドライバーの同じクラスの画像は酷似 【極端な解釈】 l
ドライバー 26 ⼈ × 10 クラスで、 訓練データは本質的には 260 枚の「画像」 l 各「画像」は 100 枚弱に “Augment” されていて、 ⼊⼒データは 22 万枚である(ように錯覚している!?)
仮説3 l 当時の検証が適当だっただけ説 l 後半では密かに効果を発揮していた説 l ……
第四話:Pseudo Labeling
学習データが少ない! l 先程の「極端な解釈」によると本質的に訓練画像はたっ た 260 パターン l すぐモデルが overfit してしまうのは単純に学習データ
が少なすぎるせいでは? l テストデータは 3 倍ぐらいある、利⽤できないか? l NDSB プランクトン分類コンペ優勝チームのブログによ ると Pseudo Labeling を使っている http://benanne.github.io/2015/03/17/plankton.html
Pseudo Labeling とは l ⼀種の半教師有り学習のフレームワーク l 訓練データに加え、テストデータを⽤いて訓練 l テストデータのラベルは以前のモデルによる予測 l
訓練データに対しテストデータが相対的に少なくな るように⼊れるほうが良いっぽい (NDSB 優勝チームは 2:1 になるようにしていたので僕もそれに従った)
Pseudo Labeling の効果 l Pseudo Label にはアンサンブルで得たシングルモ デルより精度の⾼いラベルを使える l データが多くなり、より⼤きく汎化性能の⾼いモデ
ルを安定して学習させられる(という説) Distillation に似ているが、Distillation は⼩さいモデルを作りたくて、Pseudo Labeling ではより⼤きいモデルを作りたい l 0.22374 → 0.21442
第五話:-NN(闇)
データセットの性質 https://www.kaggle.com/titericz/state-farm-distracted-driver-detection/just-relax-and-watch-some-cool-movies/code このカーネルが出る前から気づいていた⼈は多かったのではないかと予想してます。 僕もこれが出るより前からこの性質を使ってました。
データセットの性質 l 動画切り出し l 時系列で前後の写真は同じクラス l 時系列で前後の写真は画像として酷似 l 前後の写真を探して、結果を統合しよう
画像のまま k-NN l 計算が重いので画像は縮⼩して計算 l 距離は L2 より L1 のほうがやや精度が良い
0.999 0.996 0.995 0.992 0.991 0.989 0.986 0.983 0.979 0.976 0.999 0.997 0.996 0.995 0.993 0.991 0.989 0.987 0.986 0.984 0.96 0.97 0.98 0.99 1 1 2 3 4 5 6 7 8 9 10 同じクラスの割合 k L2 L1
k-NN 結果の使い⽅ l 予測時に k-NN への予測結果を平均する n k=10 n i
番⽬の近傍は重み 0.9% l 0.21442 → 0.19356
Pseudo Labeling との相乗効果 l k-NN で予測結果を混ぜわせる l それを Pseudo Label
にしてまた学習 l その予測結果を k-NN で混ぜ合わせて…… k-NN の関係をグラフだと思うと、 ちょっとグラフベース半教師有り学習っぽい
ちなみに l k-NN なんてそんな荒削りなことするの、 ド素⼈な僕だけだよな・・・?と思ってた l が、フタを開けると、1 位を含むかなり多く の上位者が使っていた・・・! l
あと、画像間の距離でのクラスタリングで⼈ 間がすっぱり別れないかとちょっと試したけ ど、そのまま使えそうな結果にはならず
第六話:Cross PL(仮)
きっかけ l モデルをついに ResNet にした l これはスコア爆上げ間違い無し!( ・´ー・`)どや ・・・ l
0.18072 が最⾼、0.17725 (VGG) を抜けない l ⼤きく悪くならないが、良くもならない
ResNet [Figure 3, He+, ʼ15]
考えたこと l Pseudo Labeling が効きすぎているのでは? l Pseudo Label を暗記されてそのまま出⼒され ては困る
l そこそこ離れた画像への Pseudo Label だけ が学習に影響してほしい l あと、完全なクラスタリングはどうしてもうまくいかないので、 クラスタリングがそこそこうまくいくっぽいことを利⽤したい
そこでやってみたこと Cross Pseudo Labeling(仮) 1. テストデータを 個のグループに分割 (今回はここで画像に対するクラスタリングを使う) 2. グループ
を予測するモデルは、以下で学習 n 訓練データ n グループ 以外のテストデータ (Pseudo Label)
Cross Pseudo Labeling 結果 l 0.17725 → 0.14573 l ⼤幅改善に成功
(ただし ResNet への変更の影響も含むはず)
第七話:ResDrop
ResDrop [Huang+ʼ16] とは l ResNet の層(ResBlock)を確率的に Drop
ResDrop l 最後の晩の悪あがき l ResNet のネットワーク定義を公開してた⼯藤く んのツイッターで存在は知っていた l ResDrop のネットワーク定義にすり替えただけ
n ResNet の pretrain model をそのまま読む n 他のパラメータ調整せず(時間なかった)
ResDrop l Public LB:0.14126 → 0.1378 l まあちょっと上がったかな? l ・・・
と思っていたが!
Private LB 0.16484 ↓ 0.14866
最終順位 19 位 ↓ 9 位
ありがとう ResDrop! (&ありがとう⼯藤くん)
まとめ:僕のアプローチ l ResDrop-{101,152} l Cross Pseudo Labeling l k-NN l
運が良かった気がします
おまけ:toshi_k さんの解法 闇っぽいテクが全く無いのに同等の精度……! [https://www.kaggle.com/c/state-farm-distracted-driver-detection/discussion/22666]
おまけ2:toshi_k さんのと混ぜた 解答ファイルを頂いて単純に平均 スコアは 0.02 も向上!