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.9k
LLMの開発は難しい?簡単?Stability AIの現場から (2023/10/11, W&B Fully Connected)
iwiwi
12
9.5k
Stability AI Japanにおける大規模言語モデルの研究開発
iwiwi
18
11k
Other Decks in Programming
See All in Programming
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
270
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
2
220
PSR-15 はあなたのための ものではない? - phpcon2024
myamagishi
0
110
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
210
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
740
Recoilを剥がしている話
kirik
5
6.7k
あれやってみてー駆動から成長を加速させる / areyattemite-driven
nashiusagi
1
200
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
CSC305 Lecture 26
javiergs
PRO
0
140
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
44
13k
How STYLIGHT went responsive
nonsquared
95
5.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Music & Morning Musume
bryan
46
6.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
48
2.2k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Navigating Team Friction
lara
183
15k
Writing Fast Ruby
sferik
628
61k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Gamification - CAS2011
davidbonilla
80
5.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
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 も向上!