Slide 1

Slide 1 text

2017/02/04 @ Kaggle Tokyo Meetup #2 Kaggle State Farm Distracted Driver Detection by iwiwi

Slide 2

Slide 2 text

\ ヽ | / / \ ヽ | / / \ / _ わ た し で す _ / ̄\ ― |^o^| ― \_/  ̄  ̄ / \ / / | ヽ \ / / | ヽ \

Slide 3

Slide 3 text

はじめに

Slide 4

Slide 4 text

このコンペは 僕にとって

Slide 5

Slide 5 text

初めての Kaggle

Slide 6

Slide 6 text

どころか

Slide 7

Slide 7 text

初めての 機械学習

Slide 8

Slide 8 text

本発表の注意! l 当時は右も左もわからない状態 l 今でも皆さんと違って機械学習歴半年ちょい l くれぐれも真に受けないでください! (変なところ突っ込んでもらえるとうれしいです!)

Slide 9

Slide 9 text

⽬次 1. 問題とデータ 2. 僕のアプローチ

Slide 10

Slide 10 text

1 問題とデータ

Slide 11

Slide 11 text

問題 l ⼊⼒:ドライバーの画像 l 出⼒:運転態度を 10 クラスに分類 l 評価:Multi-class log loss (cross entropy)

Slide 12

Slide 12 text

クラス 0:安全運転

Slide 13

Slide 13 text

クラス 1:右⼿でスマホ操作

Slide 14

Slide 14 text

クラス 2:右⼿で通話

Slide 15

Slide 15 text

クラス 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

Slide 16

Slide 16 text

データ l imgs.zip n 訓練画像:22,424 n テスト画像:79,726 l driver_imgs_list.csv n 各訓練画像のドライバーが誰か

Slide 17

Slide 17 text

余談:LB での accuracy l 普通に提出するとテストデータの public LB 部分 での logloss が⼿に⼊る(当たり前) l 実はテストデータの public LB 部分での accuracy も⼿に⼊れられる n 予想確率を one-hot っぽくして提出 (例:予想クラスを 0.91、それ以外を 0.01) n 正解時のスコアと不正解時のスコアが⼀定 n 正解の割合が計算できる

Slide 18

Slide 18 text

2 僕のアプローチ

Slide 19

Slide 19 text

第⼀話:leak の洗礼

Slide 20

Slide 20 text

Kaggle 初挑戦! l Chainer 付属の AlexNet l とりあえず放り込んでみる l validation loss 0.117 l 1 位より遥か上!?やったか!?

Slide 21

Slide 21 text

初提出スコア 2.106 あれ、0.117 は!?\(^o^)/ ほぼサンプルのスコアじゃん!?

Slide 22

Slide 22 text

Validation はちゃんとやる l Train / validation を完全ランダムに選択し ていた l 同じドライバーの画像は極めて似てる l テストデータと訓練データは違うドライバー l Train / validation もドライバーで分割しな いとだめ(そのための driver_imgs_list.csv!) l ド定番素⼈ミス

Slide 23

Slide 23 text

第⼆話:Pretrained VGG

Slide 24

Slide 24 text

Pre-trained VGG16 l このコンテストは external data 使⽤可 l Kaggle では初? Forum では議論が⽩熱 l Pre-trained model は絶対使う⽅が良い (と思った) l Pre-trained model を使うため、 CNN のモデルは既存のものから選ぶだけ(楽になった?)

Slide 25

Slide 25 text

Pre-trained VGG16 [https://blog.heuritech.com/2016/02/29/a-brief-report-of-the-heuritech-deep-learning-meetup-5/]

Slide 26

Slide 26 text

Pre-trained VGG16 l 当時定番っぽかった VGG16 を選択 l Fine tuning は⼩さめの学習率 n 0.001 とかからスタート n (参考:ImageNet は普通 0.1 スタート) l 2,3 エポックで validation loss はサチってた (短い気がするが後述のデータの性質が関係?)

Slide 27

Slide 27 text

第三話:Model Averaging

Slide 28

Slide 28 text

Model Averaging l 5 個独⽴に学習して予測結果を平均 l 0.31661 → 0.22374 l こっそり出てたけどこの辺でバレる

Slide 29

Slide 29 text

第四話:Data Augmentation

Slide 30

Slide 30 text

Data Augmentation とは l 訓練時に画像を変形させたりする l 擬似的に訓練データを増やす [http://ultraist.hatenablog.com/entry/2015/03/20/121031]

Slide 31

Slide 31 text

Data Augmentation l NSDB プランクトン分類コンペ優勝チーム のコードから拝借 (MIT ライセンス https://github.com/benanne/kaggle-ndsb) l しかし、スコア変わらず (´ε`;)ウーン…

Slide 32

Slide 32 text

仮説1 l Pre-trained model を使っているから? l ⼊⼒に近い⽅の層で、これらの操作で⽣ まれる差は既に吸収されているのかも?

Slide 33

Slide 33 text

仮説2 l データが既に “Augment” されている? l 動画切り出しでデータが作られており、 同じドライバーの同じクラスの画像は酷似 【極端な解釈】 l ドライバー 26 ⼈ × 10 クラスで、 訓練データは本質的には 260 枚の「画像」 l 各「画像」は 100 枚弱に “Augment” されていて、 ⼊⼒データは 22 万枚である(ように錯覚している!?)

Slide 34

Slide 34 text

仮説3 l 当時の検証が適当だっただけ説 l 後半では密かに効果を発揮していた説 l ……

Slide 35

Slide 35 text

第四話:Pseudo Labeling

Slide 36

Slide 36 text

学習データが少ない! l 先程の「極端な解釈」によると本質的に訓練画像はたっ た 260 パターン l すぐモデルが overfit してしまうのは単純に学習データ が少なすぎるせいでは? l テストデータは 3 倍ぐらいある、利⽤できないか? l NDSB プランクトン分類コンペ優勝チームのブログによ ると Pseudo Labeling を使っている http://benanne.github.io/2015/03/17/plankton.html

Slide 37

Slide 37 text

Pseudo Labeling とは l ⼀種の半教師有り学習のフレームワーク l 訓練データに加え、テストデータを⽤いて訓練 l テストデータのラベルは以前のモデルによる予測 l 訓練データに対しテストデータが相対的に少なくな るように⼊れるほうが良いっぽい (NDSB 優勝チームは 2:1 になるようにしていたので僕もそれに従った)

Slide 38

Slide 38 text

Pseudo Labeling の効果 l Pseudo Label にはアンサンブルで得たシングルモ デルより精度の⾼いラベルを使える l データが多くなり、より⼤きく汎化性能の⾼いモデ ルを安定して学習させられる(という説) Distillation に似ているが、Distillation は⼩さいモデルを作りたくて、Pseudo Labeling ではより⼤きいモデルを作りたい l 0.22374 → 0.21442

Slide 39

Slide 39 text

第五話:-NN(闇)

Slide 40

Slide 40 text

データセットの性質 https://www.kaggle.com/titericz/state-farm-distracted-driver-detection/just-relax-and-watch-some-cool-movies/code このカーネルが出る前から気づいていた⼈は多かったのではないかと予想してます。 僕もこれが出るより前からこの性質を使ってました。

Slide 41

Slide 41 text

データセットの性質 l 動画切り出し l 時系列で前後の写真は同じクラス l 時系列で前後の写真は画像として酷似 l 前後の写真を探して、結果を統合しよう

Slide 42

Slide 42 text

画像のまま 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

Slide 43

Slide 43 text

k-NN 結果の使い⽅ l 予測時に k-NN への予測結果を平均する n k=10 n i 番⽬の近傍は重み 0.9% l 0.21442 → 0.19356

Slide 44

Slide 44 text

Pseudo Labeling との相乗効果 l k-NN で予測結果を混ぜわせる l それを Pseudo Label にしてまた学習 l その予測結果を k-NN で混ぜ合わせて…… k-NN の関係をグラフだと思うと、 ちょっとグラフベース半教師有り学習っぽい

Slide 45

Slide 45 text

ちなみに l k-NN なんてそんな荒削りなことするの、 ド素⼈な僕だけだよな・・・?と思ってた l が、フタを開けると、1 位を含むかなり多く の上位者が使っていた・・・! l あと、画像間の距離でのクラスタリングで⼈ 間がすっぱり別れないかとちょっと試したけ ど、そのまま使えそうな結果にはならず

Slide 46

Slide 46 text

第六話:Cross PL(仮)

Slide 47

Slide 47 text

きっかけ l モデルをついに ResNet にした l これはスコア爆上げ間違い無し!( ・´ー・`)どや ・・・ l 0.18072 が最⾼、0.17725 (VGG) を抜けない l ⼤きく悪くならないが、良くもならない

Slide 48

Slide 48 text

ResNet [Figure 3, He+, ʼ15]

Slide 49

Slide 49 text

考えたこと l Pseudo Labeling が効きすぎているのでは? l Pseudo Label を暗記されてそのまま出⼒され ては困る l そこそこ離れた画像への Pseudo Label だけ が学習に影響してほしい l あと、完全なクラスタリングはどうしてもうまくいかないので、 クラスタリングがそこそこうまくいくっぽいことを利⽤したい

Slide 50

Slide 50 text

そこでやってみたこと Cross Pseudo Labeling(仮) 1. テストデータを 個のグループに分割 (今回はここで画像に対するクラスタリングを使う) 2. グループ を予測するモデルは、以下で学習 n 訓練データ n グループ 以外のテストデータ (Pseudo Label)

Slide 51

Slide 51 text

Cross Pseudo Labeling 結果 l 0.17725 → 0.14573 l ⼤幅改善に成功 (ただし ResNet への変更の影響も含むはず)

Slide 52

Slide 52 text

第七話:ResDrop

Slide 53

Slide 53 text

ResDrop [Huang+ʼ16] とは l ResNet の層(ResBlock)を確率的に Drop

Slide 54

Slide 54 text

ResDrop l 最後の晩の悪あがき l ResNet のネットワーク定義を公開してた⼯藤く んのツイッターで存在は知っていた l ResDrop のネットワーク定義にすり替えただけ n ResNet の pretrain model をそのまま読む n 他のパラメータ調整せず(時間なかった)

Slide 55

Slide 55 text

ResDrop l Public LB:0.14126 → 0.1378 l まあちょっと上がったかな? l ・・・ と思っていたが!

Slide 56

Slide 56 text

Private LB 0.16484 ↓ 0.14866

Slide 57

Slide 57 text

最終順位 19 位 ↓ 9 位

Slide 58

Slide 58 text

ありがとう ResDrop! (&ありがとう⼯藤くん)

Slide 59

Slide 59 text

まとめ:僕のアプローチ l ResDrop-{101,152} l Cross Pseudo Labeling l k-NN l 運が良かった気がします

Slide 60

Slide 60 text

おまけ:toshi_k さんの解法 闇っぽいテクが全く無いのに同等の精度……! [https://www.kaggle.com/c/state-farm-distracted-driver-detection/discussion/22666]

Slide 61

Slide 61 text

おまけ2:toshi_k さんのと混ぜた 解答ファイルを頂いて単純に平均 スコアは 0.02 も向上!