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
Takuya Akiba
February 04, 2017
Programming
15
9.6k
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
Evolutionary Optimization ofModel Merging Recipes (2024/04/17, NLPコロキウム)
iwiwi
10
5.7k
LLMの開発は難しい?簡単?Stability AIの現場から (2023/10/11, W&B Fully Connected)
iwiwi
12
9.4k
Stability AI Japanにおける大規模言語モデルの研究開発
iwiwi
18
11k
Other Decks in Programming
See All in Programming
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
300
EMになってからチームの成果を最大化するために取り組んだこと/ Maximize team performance as EM
nashiusagi
0
100
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
Ethereum_.pdf
nekomatu
0
460
役立つログに取り組もう
irof
28
9.6k
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
Micro Frontends Unmasked Opportunities, Challenges, Alternatives
manfredsteyer
PRO
0
100
初めてDefinitelyTypedにPRを出した話
syumai
0
420
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
190
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1.1k
Tauriでネイティブアプリを作りたい
tsucchinoko
0
370
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Building Your Own Lightsaber
phodgson
103
6.1k
Designing the Hi-DPI Web
ddemaree
280
34k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
What's new in Ruby 2.0
geeforr
343
31k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
97
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Code Review Best Practice
trishagee
64
17k
Six Lessons from altMBA
skipperchong
27
3.5k
How GitHub (no longer) Works
holman
310
140k
KATA
mclloyd
29
14k
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 も向上!