本発表の注意!
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 のモデルは既存のものから選ぶだけ(楽になった?)
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
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 運が良かった気がします