Neural Network 素人なんだけど
何とかご機嫌取りをしたい
Kaggle Tokyo Meetup #6
2019.7.13
Tawara(@tawatawara)
自己紹介
2018/9 ~ 10 台風(SIGNATE) 最下位
2018/11 土砂崩れ(SIGNATE) 途中撤退
2018/12 ~ 2019/1 タンパク質 22nd / 2172
2019/3/22-23 電線 1272nd / 1451
2019/3/28-29 Pet 687th / 1805
2019/4 ~ 6 壺 存在抹消
2019/6/13-21 12th / 1839
過去1年のコンペ遍歴:
略歴
◦ 2010/4~2014/3 : 情報学科 (計算機科学)
◦ 2014/4~2016/3 : 情報学研究科 (社会情報学)
◦ 2016/6~2020/3 : 某JTC (電気機器) R&D部門
機械学習
◦ 始めたのは:社会人になってから (2年半くらい)
◦ 画像認識 :Not 業務 But 趣味 (1年くらい)
◦ 最近の興味:グラフ、表現学習
DSコンペ
◦ 遥か昔(修士)にKaggleをやろうとしたが放置
◦ 去年から本格的に取り組み始める(右表参照)
◦ 気付けば画像ばかり。テーブルから逃げるな
最近の悩み
◦ 煽られ要素が多い。実力と solo medal 欲しい...
壺ォ. . .
めっちゃ悔しかったので メダルを稼ぐために solution を書きました
https://www.kaggle.com/c/imet-2019-fgvc6/discussion/95393#latest-553093
poor
まえおき
テーブルコンペよりも画像コンペ※1の方が
(複雑な特徴量作成要らないから)
メダル※2取りやすくない?
※1: あくまでシンプルな classification の話
※2: もちろん銀上位とか金圏となると話は別
ぶっちゃけ、
まえおき
某社(here)の偉い人もこう言っている
まえおき
「とはいえ、計算資源が…」
◦ 少し前に Kaggle kernels のGPUが P100 (16GB) になった
◦ 現在は 4個 をコミットしながら 4個のセッションを動かせる
◦ 一時期(~2019年5月上旬)は 7コミット + 7セッションという神環境 だったが、減ってしまった…
◦ 1コミット9時間の制限はあるものの、自前の計算資源を持たない人にとってはすごい助かる
◦ データセットを瞬時に読み込める点もあってめっちゃ楽
◦ 壺コンペの 9th place の方は kernel only で金メダルを獲得している
☞ ただし、DNNを使う上で一度はぶち当たる壁がある
ぶち当たる壁
学習がうまく行かない
こんな経験ありませんか?
公開 kernel に自分なりの工夫を加えてみた
☞ むしろ score が少し下がった
コンペのタスクに合いそうな論文を実装して適用
☞ (データが違うのもあるが) あんまりうまく学習してくれない
ぼくのかんがえたさいきょうのにゅーらるねっとわーく
☞ 全くうまくいかない
色々な要因が絡むと思われるが、NNのご機嫌取り(学習)は
構造やら状況やらが変わった途端に難しくなる
本LTの内容
×:コンペのタスクに合わせたNNの設計方法などの紹介 (誰かやって欲しい)
◦ Architecture の選択
◦ Preprocess・Postprocess の選択
◦ Loss の選択
◦ …
〇:学習の際に最低限調整するものの個人的意見を紹介
◦ 特にNNの学習で避けて通れないミニバッチサイズと学習率の話
◦ 他の話も盛り込みたかったけど時間が無理
Note:
◦ 基本的に画像ベースで話をします
◦ 「僕が一番NNをうまく使える!」ではない。NN に強い方々にとっては当たり前の話かも
◦ 間違ってることとか、もっとこうした方がいいみたいな話は是非是非コメントください!
◦ 持たざる者への禁句:「とりあえず Optuna に全部投げようぜ」
Contents
Mini Batch Size と 学習率
学習率の決め方
学習率のスケジューリング
学習 epoch 数
おまけ
まとめ
Mini Batch Size と 学習率
NN の学習: ミニバッチごとに Loss を計算→逆伝播で勾配を計算→重み更新
◦ (一般に、) ミニバッチ 𝐵 の Loss は 𝐵 中のサンプル 𝑠 の loss の平均
◦ Loss の大きさの傾向
◦ |𝐵| が小さいほど極端なサンプルに引っ張られて Loss は相対的に大
◦ |𝐵| が大きいほど平均的なサンプルが増えるので Loss が相対的に小
◦ 上記から、 |𝐵| が大きくなるほど学習率を大きくするのは自然そう
◦ |𝐵| ∝ 学習率 となるように scaling するのが良いという論文[1] がある
◦ 以下のようなヒューリスティクスで使用する学習率を決める論文[2]もある
☞ 結局一番良いものは?
◦ わざわざ色んな組み合わせを探索する?
𝐿𝑜𝑠𝑠 𝐵 =
1
𝐵
𝑠∈𝐵
𝑙𝑜𝑠𝑠 𝑦𝑠, 𝑡 𝑠
𝑦𝑠 : 𝑠 に対する予測値
𝑡 𝑠 : 𝑠 に対するラベル
𝜂 = 𝜂0 ×
|𝐵|
256
Mini Batch Size と 学習率
基本的にミニバッチサイズは(資源の許す限り)大きめを取る
◦ そもそもバッチサイズが小さ過ぎると学習に時間がかかる
◦ スケールが桁違いだが “Don‘t Decay the Learning Rate, Increase the Batch Size” [1]
◦ 個人的には noisy なサンプルに引っ張られるのが嫌でとりあえず大きくするようにしてる
◦ 計算資源以外の理由でミニバッチサイズを小さくする利点はあるのかは疑問
大き過ぎると imbalance data には良くないのでは?
◦ 現実的には資源が限られるのであまり大きくは取れない
◦ サンプルごとのメモリ消費量 (∝画像サイズ × NNモデルのパラメータ数) 次第
◦ 画像だと一番大きくて 128 しかやったことないです (個人的経験)
◦ table data に適用するかつモデルが軽い場合はめっちゃ大きく取れるが…
◦ data size が小さいと一つのミニバッチで全データ取れちゃったりするので注意
◦ もちろんミニバッチの作り方を工夫したり loss を重みづけするのも対処としてあり
学習率の決め方
ミニバッチサイズ決めました → 学習率は?
◦ 反比例するのは言われていたが、ちょうど良い値と言うのはタスク・データに依存.
◦ 適当な範囲を選んで Grid Search するか?
◦ でも学習率の値毎ごとに学習を丸々回すなんてめちゃくちゃ非効率的 . . .
LR-RangeTest[3]
◦ 学習率を線形に増加させながら短いステップ数(例: 1 epoch)学習.
◦ fastai のライブラリに lr_find という関数名で実装されている
◦ Loss or 評価指標を plot. 以下のように学習率を決定.
◦ 改善が急激になった部分 => 最大値
◦ 改善が緩やかになった部分 => 最小値
◦ 何故最大値と最小値?
◦ 後述するが、学習率は減衰 or 減衰・増加させるのが定番
◦ なので最大値と最小値を決める
学習率の決め方
なんかすごい主観的. . .
◦ しかしながら、良さそうな大体の範囲が少ない学習ステップでわかる
Learning rate
F2-score
壺
学習率のスケジューリング
学習率を epoch が進むにつれて変化させる
◦ 古くは ImageNet タスクでよく用いられる MultiStepShift
◦ 例: 全体の epoch の 50%, 75%, 90% で 0.2 倍する.
◦ 徐々に減衰させる: ExponentialShift, CosineShift
◦ 評価値の改善が止まったら減衰: ReduceLROnPlateau
◦ 学習率の減衰・増加を何度か繰り返す: TriangularLearningRate[3], CosineAnnealing[4]
正直好みでは?
◦ 個人的には CosineShift がシンプルで好き.
◦ 減衰系ならどの scheduling でも最初に LinearWarmUp すると良い(かもしれない)
学習率のスケジューリング
でも Adam も自動 scheduling してくれるじゃん?
◦ Adam 固定でうまく行ってる方もいらっしゃる.
◦ 某騎士王さんとか某副業で欠席の方とか.
◦ 毎回 Adam only を一応試すんですけど、僕はうまくいったことないです.
◦ 学習が短い?学習率をちゃんと探索してない?
◦ 今までずっと SGD + NesterovAG + Scheduling でやってます.
◦ Adam + 手動 scheduling という方も見かけます
https://www.kaggle.com/c/imet-2019-fgvc6/discussion/94817#latest-550074
https://www.kaggle.com/c/human-protein-atlas-image-classification/discussion/78109#latest-560973
学習 epoch 数
学習率が不変 or Adam などで自動 scheduling
◦ Early stopping しましょう
学習率を手動 scheduling する場合
◦ 見極めるの難しい
◦ 明らかに過学習してる場合は短くするぐらい.
◦ 僕は時間と相談して決めてます
◦ 1つのモデルの学習が1日以上かかると気持ちがしんどい
◦ どうせ ensemble するしということで多少過学習しても許容
おまけ: Initializer
層の初期化を行った瞬間にフレームワークが指定した初期化方法が走る
◦ NN を使ったことない人は(おそらく)あまり意識しない
◦ 例: Chainer
◦ Linear: LeCun Norm, Conv: KaimingHe Norm
◦ 層の入力数(出力数) を勘案して分散の大きさを決定するやつが主
画像コンペの場合
◦ Fine-tuning を行うことが基本なのでほぼ関係ない(?).
◦ シンプルなモデルでも最後に Linear 層を足すので少し関係する
◦ 個人的な感覚ですが、scale(ハイパラ) が小さめの方がよい
スクラッチで学習する場合
◦ 経験がほぼ無いのでわからない. . .
◦ でも影響する気がします.
まとめ
主にNNを学習させる際の学習ハイパラについて個人的意見を紹介
◦ バッチサイズはとりあえず大きくとる
◦ LR-RangeTest して決めちゃおう
◦ 学習率の scheduling を行う( or Adam を信じる)
◦ Initializer は scale を小さめにする
扱えなかった話題
◦ 学習がうまく行ってない理由がモデル、ハイパラ、実装ミスのどこにあるのか確認するには?
◦ こちらの trouble shooting 集 [5] が役に立つかも
◦ Tuning のための Coursera[6] も存在するが、受講してないので内容に盛りこめていない
◦ 本当は本LTの前に受講したかったのですが出来ませんでした。申し訳ない…
◦ もっと複雑なモデル(Segmentation, GAN, …) の tuning の仕方
◦ 経験ないんです、ごめんなさい。最近 GAN の training tutorial の記事[7] が流れて来ました
◦ 画像以外の話. BERT とか 2epoch ぐらいしか回さないって聞いたのですが. . .
References
[1] S.L. Smith, P.-J. Kindermans, C. Ying, and QV. Le. Don't Decay the Learning Rate,
Increase the Batch Size (ICLR2018) [arXiv]
[2] T. He, Zhi Zhang, H. Zhang, Zho. Zhang, J. Xie, and M. Li. Bag of Tricks for Image
Classification with Convolutional Neural Networks (CVPR 2019) [arXiv]
[3] L. N. Smith. Cyclical Learning Rates for Training Neural Networks (WACV 2017) [arXiv]
[4] I. Loshchilov, and F. Hutter. SGDR: Stochastic Gradient Descent with Warm Restarts
(ICLR 2017) [arXiv]
[5] Troubleshooting Deep Neural Networks - A Field Guide to Fixing Your Model [Link]
[6] Improving Deep Neural Networks: Hyperparameter tuning, Regularization and
Optimization [Link]
[7] How to Implement GAN Hacks in Keras to Train Stable Models [Link]

【LT資料】 Neural Network 素人なんだけど何とかご機嫌取りをしたい

  • 1.
  • 2.
    自己紹介 2018/9 ~ 10台風(SIGNATE) 最下位 2018/11 土砂崩れ(SIGNATE) 途中撤退 2018/12 ~ 2019/1 タンパク質 22nd / 2172 2019/3/22-23 電線 1272nd / 1451 2019/3/28-29 Pet 687th / 1805 2019/4 ~ 6 壺 存在抹消 2019/6/13-21 12th / 1839 過去1年のコンペ遍歴: 略歴 ◦ 2010/4~2014/3 : 情報学科 (計算機科学) ◦ 2014/4~2016/3 : 情報学研究科 (社会情報学) ◦ 2016/6~2020/3 : 某JTC (電気機器) R&D部門 機械学習 ◦ 始めたのは:社会人になってから (2年半くらい) ◦ 画像認識 :Not 業務 But 趣味 (1年くらい) ◦ 最近の興味:グラフ、表現学習 DSコンペ ◦ 遥か昔(修士)にKaggleをやろうとしたが放置 ◦ 去年から本格的に取り組み始める(右表参照) ◦ 気付けば画像ばかり。テーブルから逃げるな 最近の悩み ◦ 煽られ要素が多い。実力と solo medal 欲しい...
  • 3.
    壺ォ. . . めっちゃ悔しかったのでメダルを稼ぐために solution を書きました https://www.kaggle.com/c/imet-2019-fgvc6/discussion/95393#latest-553093 poor
  • 4.
  • 5.
  • 6.
    まえおき 「とはいえ、計算資源が…」 ◦ 少し前に Kagglekernels のGPUが P100 (16GB) になった ◦ 現在は 4個 をコミットしながら 4個のセッションを動かせる ◦ 一時期(~2019年5月上旬)は 7コミット + 7セッションという神環境 だったが、減ってしまった… ◦ 1コミット9時間の制限はあるものの、自前の計算資源を持たない人にとってはすごい助かる ◦ データセットを瞬時に読み込める点もあってめっちゃ楽 ◦ 壺コンペの 9th place の方は kernel only で金メダルを獲得している ☞ ただし、DNNを使う上で一度はぶち当たる壁がある
  • 7.
  • 8.
    こんな経験ありませんか? 公開 kernel に自分なりの工夫を加えてみた ☞むしろ score が少し下がった コンペのタスクに合いそうな論文を実装して適用 ☞ (データが違うのもあるが) あんまりうまく学習してくれない ぼくのかんがえたさいきょうのにゅーらるねっとわーく ☞ 全くうまくいかない 色々な要因が絡むと思われるが、NNのご機嫌取り(学習)は 構造やら状況やらが変わった途端に難しくなる
  • 9.
    本LTの内容 ×:コンペのタスクに合わせたNNの設計方法などの紹介 (誰かやって欲しい) ◦ Architectureの選択 ◦ Preprocess・Postprocess の選択 ◦ Loss の選択 ◦ … 〇:学習の際に最低限調整するものの個人的意見を紹介 ◦ 特にNNの学習で避けて通れないミニバッチサイズと学習率の話 ◦ 他の話も盛り込みたかったけど時間が無理 Note: ◦ 基本的に画像ベースで話をします ◦ 「僕が一番NNをうまく使える!」ではない。NN に強い方々にとっては当たり前の話かも ◦ 間違ってることとか、もっとこうした方がいいみたいな話は是非是非コメントください! ◦ 持たざる者への禁句:「とりあえず Optuna に全部投げようぜ」
  • 10.
    Contents Mini Batch Sizeと 学習率 学習率の決め方 学習率のスケジューリング 学習 epoch 数 おまけ まとめ
  • 11.
    Mini Batch Sizeと 学習率 NN の学習: ミニバッチごとに Loss を計算→逆伝播で勾配を計算→重み更新 ◦ (一般に、) ミニバッチ 𝐵 の Loss は 𝐵 中のサンプル 𝑠 の loss の平均 ◦ Loss の大きさの傾向 ◦ |𝐵| が小さいほど極端なサンプルに引っ張られて Loss は相対的に大 ◦ |𝐵| が大きいほど平均的なサンプルが増えるので Loss が相対的に小 ◦ 上記から、 |𝐵| が大きくなるほど学習率を大きくするのは自然そう ◦ |𝐵| ∝ 学習率 となるように scaling するのが良いという論文[1] がある ◦ 以下のようなヒューリスティクスで使用する学習率を決める論文[2]もある ☞ 結局一番良いものは? ◦ わざわざ色んな組み合わせを探索する? 𝐿𝑜𝑠𝑠 𝐵 = 1 𝐵 𝑠∈𝐵 𝑙𝑜𝑠𝑠 𝑦𝑠, 𝑡 𝑠 𝑦𝑠 : 𝑠 に対する予測値 𝑡 𝑠 : 𝑠 に対するラベル 𝜂 = 𝜂0 × |𝐵| 256
  • 12.
    Mini Batch Sizeと 学習率 基本的にミニバッチサイズは(資源の許す限り)大きめを取る ◦ そもそもバッチサイズが小さ過ぎると学習に時間がかかる ◦ スケールが桁違いだが “Don‘t Decay the Learning Rate, Increase the Batch Size” [1] ◦ 個人的には noisy なサンプルに引っ張られるのが嫌でとりあえず大きくするようにしてる ◦ 計算資源以外の理由でミニバッチサイズを小さくする利点はあるのかは疑問 大き過ぎると imbalance data には良くないのでは? ◦ 現実的には資源が限られるのであまり大きくは取れない ◦ サンプルごとのメモリ消費量 (∝画像サイズ × NNモデルのパラメータ数) 次第 ◦ 画像だと一番大きくて 128 しかやったことないです (個人的経験) ◦ table data に適用するかつモデルが軽い場合はめっちゃ大きく取れるが… ◦ data size が小さいと一つのミニバッチで全データ取れちゃったりするので注意 ◦ もちろんミニバッチの作り方を工夫したり loss を重みづけするのも対処としてあり
  • 13.
    学習率の決め方 ミニバッチサイズ決めました → 学習率は? ◦反比例するのは言われていたが、ちょうど良い値と言うのはタスク・データに依存. ◦ 適当な範囲を選んで Grid Search するか? ◦ でも学習率の値毎ごとに学習を丸々回すなんてめちゃくちゃ非効率的 . . . LR-RangeTest[3] ◦ 学習率を線形に増加させながら短いステップ数(例: 1 epoch)学習. ◦ fastai のライブラリに lr_find という関数名で実装されている ◦ Loss or 評価指標を plot. 以下のように学習率を決定. ◦ 改善が急激になった部分 => 最大値 ◦ 改善が緩やかになった部分 => 最小値 ◦ 何故最大値と最小値? ◦ 後述するが、学習率は減衰 or 減衰・増加させるのが定番 ◦ なので最大値と最小値を決める
  • 14.
    学習率の決め方 なんかすごい主観的. . . ◦しかしながら、良さそうな大体の範囲が少ない学習ステップでわかる Learning rate F2-score 壺
  • 15.
    学習率のスケジューリング 学習率を epoch が進むにつれて変化させる ◦古くは ImageNet タスクでよく用いられる MultiStepShift ◦ 例: 全体の epoch の 50%, 75%, 90% で 0.2 倍する. ◦ 徐々に減衰させる: ExponentialShift, CosineShift ◦ 評価値の改善が止まったら減衰: ReduceLROnPlateau ◦ 学習率の減衰・増加を何度か繰り返す: TriangularLearningRate[3], CosineAnnealing[4] 正直好みでは? ◦ 個人的には CosineShift がシンプルで好き. ◦ 減衰系ならどの scheduling でも最初に LinearWarmUp すると良い(かもしれない)
  • 16.
    学習率のスケジューリング でも Adam も自動scheduling してくれるじゃん? ◦ Adam 固定でうまく行ってる方もいらっしゃる. ◦ 某騎士王さんとか某副業で欠席の方とか. ◦ 毎回 Adam only を一応試すんですけど、僕はうまくいったことないです. ◦ 学習が短い?学習率をちゃんと探索してない? ◦ 今までずっと SGD + NesterovAG + Scheduling でやってます. ◦ Adam + 手動 scheduling という方も見かけます https://www.kaggle.com/c/imet-2019-fgvc6/discussion/94817#latest-550074 https://www.kaggle.com/c/human-protein-atlas-image-classification/discussion/78109#latest-560973
  • 17.
    学習 epoch 数 学習率が不変or Adam などで自動 scheduling ◦ Early stopping しましょう 学習率を手動 scheduling する場合 ◦ 見極めるの難しい ◦ 明らかに過学習してる場合は短くするぐらい. ◦ 僕は時間と相談して決めてます ◦ 1つのモデルの学習が1日以上かかると気持ちがしんどい ◦ どうせ ensemble するしということで多少過学習しても許容
  • 18.
    おまけ: Initializer 層の初期化を行った瞬間にフレームワークが指定した初期化方法が走る ◦ NNを使ったことない人は(おそらく)あまり意識しない ◦ 例: Chainer ◦ Linear: LeCun Norm, Conv: KaimingHe Norm ◦ 層の入力数(出力数) を勘案して分散の大きさを決定するやつが主 画像コンペの場合 ◦ Fine-tuning を行うことが基本なのでほぼ関係ない(?). ◦ シンプルなモデルでも最後に Linear 層を足すので少し関係する ◦ 個人的な感覚ですが、scale(ハイパラ) が小さめの方がよい スクラッチで学習する場合 ◦ 経験がほぼ無いのでわからない. . . ◦ でも影響する気がします.
  • 19.
    まとめ 主にNNを学習させる際の学習ハイパラについて個人的意見を紹介 ◦ バッチサイズはとりあえず大きくとる ◦ LR-RangeTestして決めちゃおう ◦ 学習率の scheduling を行う( or Adam を信じる) ◦ Initializer は scale を小さめにする 扱えなかった話題 ◦ 学習がうまく行ってない理由がモデル、ハイパラ、実装ミスのどこにあるのか確認するには? ◦ こちらの trouble shooting 集 [5] が役に立つかも ◦ Tuning のための Coursera[6] も存在するが、受講してないので内容に盛りこめていない ◦ 本当は本LTの前に受講したかったのですが出来ませんでした。申し訳ない… ◦ もっと複雑なモデル(Segmentation, GAN, …) の tuning の仕方 ◦ 経験ないんです、ごめんなさい。最近 GAN の training tutorial の記事[7] が流れて来ました ◦ 画像以外の話. BERT とか 2epoch ぐらいしか回さないって聞いたのですが. . .
  • 20.
    References [1] S.L. Smith,P.-J. Kindermans, C. Ying, and QV. Le. Don't Decay the Learning Rate, Increase the Batch Size (ICLR2018) [arXiv] [2] T. He, Zhi Zhang, H. Zhang, Zho. Zhang, J. Xie, and M. Li. Bag of Tricks for Image Classification with Convolutional Neural Networks (CVPR 2019) [arXiv] [3] L. N. Smith. Cyclical Learning Rates for Training Neural Networks (WACV 2017) [arXiv] [4] I. Loshchilov, and F. Hutter. SGDR: Stochastic Gradient Descent with Warm Restarts (ICLR 2017) [arXiv] [5] Troubleshooting Deep Neural Networks - A Field Guide to Fixing Your Model [Link] [6] Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization [Link] [7] How to Implement GAN Hacks in Keras to Train Stable Models [Link]

Editor's Notes

  • #3 [30秒] 一応情報系出身で、競争が激化する前の世代 => JTC の研究部門 に勤務 機械学習は会社に入ってから始めました 画像コンペばっかやってますがは業務ではなく趣味です グラフとか表現学習に興味を持ちつつある 去年位から実力を付けようと思ってデータサイエンスコンペ始める 最近の近況:壺で絶望してカーネラー君に祈ったら金メダル振ってきた 悩み:solo medal 欲しい。いやホント…
  • #4 [10秒] つぼぉ… ご興味あればどうぞ こっから本題なんですけど、その前に前置きとして
  • #5 [10秒] ぶっちゃけ テーブルよりも画像の方がメダル取りやすくないですか?
  • #6 [10秒] 某社の偉い人もこう言ってます
  • #7 [30秒] 昔は計算資源の問題があったと思うんですけど、最近は P100 使えるようになったのでかなり楽になりました。 画像サイズとかデータ量によっては厳しいものがあるが、それでもGPU無いから全く太刀打ちできないということは無い。 でも、一個問題がありますよね
  • #9 僕は今までこういう経験があるんですが、 1 2 3 色々事情はあるんですけど、何か条件変えると途端に学習がうまくいかなくなるよね
  • #10 このLTは コンペのタスク に合わせた設計方法を考えるものでは無いです そうではなくて、設計とかが決まった上で学習させるうえで最低限気を付けてることの紹介です
  • #12 NN の学習では ミニバッチごとに Loss を計算 =>
  • #13 NN の学習では ミニバッチごとに Loss を計算 =>