Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deep Learningのライブラリとフレームワークの話

OPTiM
August 26, 2020

Deep Learningのライブラリとフレームワークの話

PyTorch+Ignite+Optunaで最適なハイパーパラメータを見つけるテクニックを学ぶ

OPTiM

August 26, 2020
Tweet

More Decks by OPTiM

Other Decks in Programming

Transcript

  1. © 2019 OPTiM Corp. ‹#› © 2019 OPTiM Corp. 2020/08/26

    R&D 加藤 Deep Learning ライブラリ・フレームワークの話
  2. © 2019 OPTiM Corp. 3 自己紹介  加藤 • R&Dチーム

    • サブマネージャ  直近主要案件 • AI Marker開発 • 雑草検知AI開発 • 検査解析原理 AI開発  備考 • 2018年10月OPTiM入社 (無病息災) • OAKのバッカーに なりました! https://www.kickstarter.com/project s/opencv/opencv-ai-kit?lang=ja
  3. © 2019 OPTiM Corp. 4 目次  自己紹介  フレームワークとライブラリの違い

    <次  各フレームワーク・ライブラリの紹介  サンプルプログラムを見る(途中でTips紹介)  まとめ
  4. © 2019 OPTiM Corp. 5 フレームワークとライブラリの違い  制御の逆転(ハリウッド原則「我々を呼ぶな。我々が呼ぶから」) フレームワークの第一の重要な特徴は、フレームワークに合わせて利用者が定義したメソッドが、アプリケーションコードからはあまり呼ばれ ず、フレームワーク自身からよく呼び出されるという点だ。

    フレームワークは、アプリケーションの動作を調整したり、動作の順番を制御したりするためのメインプログラムとしての役割を果たす。 制御の逆転によって、フレームワークを拡張可能なスケルトンとして動作することができる。 フレームワークが定義した汎用アルゴリズムにあわせて、利用者はメソッドを作成し、個別のアプリケーションをつくりあげる。 Ralph Johnson and Brian Foote • つまり、 • ライブラリ:関数やクラスを一つずつ呼び出してコーディングする • フレームワーク:一つのクラスを呼び出すと裏でよろしくやってくれる(?)  今回使用するのはライブラリ?フレームワーク? • PyTorch:フレームワーク An open source machine learning framework that accelerates the path from research prototyping to production deployment. • Ignite:(ハイレベル)ライブラリ Ignite is a high-level library to help with training and evaluating neural networks in PyTorch flexibly and transparently. • Optuna:フレームワーク Optuna is an automatic hyperparameter optimization software framework, particularly designed for machine learning. https://bliki- ja.github.io/Inver sionOfControl/ https://pytorch.o rg/ https://github.co m/pytorch/ignite https://github.co m/optuna/optuna PyTorch(=フレームワーク)上で使用する=ライブラリ?
  5. © 2019 OPTiM Corp. 6 PyTorch  概要 • Chainerが採用したdefine-by-runの思想を継承しているフレームワーク

    • GoogleのTensorFlow、FacebookのPyTorchとして熾烈なシェア争いをしているが、 最近の学術分野ではPyTorchが優勢  メリット • 前述の通り、最新の実装はPyTorchで書かれていることが多いので、そのまま使用できる  デメリット • 学習進捗を確認するのはTensorBoardが便利なので、 結局TensorFlowから逃れられない https://github.com/pytorch/pytorch https://blog.exxactcorp.com/pytorch-vs-tensorflow-in-2020-what-you-should-know-about-these-frameworks/
  6. © 2019 OPTiM Corp. 7 Ignite  概要 • PyTorch公式の学習、推論を補助するライブラリ

    • 同様のライブラリとしてLightningもある(Kerasっぽい感じで書ける?)  メリット • ループ処理や、TensorBoard連携を簡単に書ける  デメリット • 学習、推論は簡略化できるが、前処理まわりは自前で書く必要あり (試行錯誤しやすいようにカスタマイズしだすと結構大変) https://github.com/pytorch/ignite
  7. © 2019 OPTiM Corp. 8 Optuna  概要 • PFNが開発したハイパーパラメータ最適化フレームワーク

    • PyTorch以外にも、Keras、LightGBM、MXNet、scikit-learn、XGBoostなど 多くのフレームワークに対応している • Optuna は次の試行で試すべきハイパーパラメータの値を決めるために、完了している試行の履歴を用いています。 そこまでで完了している試行の履歴に基づき、有望そうな領域を推定し、その領域の値を実際に試すということを繰り返します。 そして、新たに得られた結果に基づき、更に有望そうな領域を推定します。  メリット • 簡単にハイパーパラメータ探索できるので、とりあえず使って損なし  デメリット • ??? https://github.com/optuna/optuna https://tech.pref erred.jp/ja/blog/ optuna-release/
  8. © 2019 OPTiM Corp. 9 サンプルプログラムを見る(PyTorch 1/4) https://github.com/py torch/examples/blob/ master/mnist/main.py

    A:前処理、ループ処理部 B:ネットワーク部 C:学習メイン部 D:評価メイン部
  9. © 2019 OPTiM Corp. 10 サンプルプログラムを見る(PyTorch 2/4)  A:前処理、ループ処理部 •

    transforms.Compose: 画像に対してネットワークに入れる前の前処理を格納する • ToTensor: numpy.arrayな画像をPyTorchで学習できるように変換する • Normalize: 画像を正規化する • dataset1/2: 学習用(1)、検証用(2)データセットで、それぞれloaderにセットする • for部: Epoch毎にtrain、validを実行してスケジューラを更新する
  10. © 2019 OPTiM Corp. 11 サンプルプログラムを見る(PyTorch 3/4)  B:ネットワーク部 •

    ネットワーク内部: • Conv2d、Dropout2d、Linearを組み合わせたシンプルなネットワーク • forwardが毎回呼ばれる
  11. © 2019 OPTiM Corp. 12 サンプルプログラムを見る(PyTorch 4/4)  C:学習メイン部 •

    data: 入力画像 • target: 正解ラベル • output: ネットワークを通した推論結果 • loss: 損失関数の適用 • optimizer: オプティマイザのリセット/計算  D:評価メイン部 • 基本的にはtrainと同じ • 勾配計算をしないので with torch.no_grad() を忘れずに (推論Onlyの時も必要)
  12. © 2019 OPTiM Corp. 13 サンプルプログラムを見る(Ignite 1/2) https://github.com/pytorch/igni te/blob/master/examples/mnist /mnist_with_tensorboard.py

    A:各種パラメータとログの設定 C:データ読込部(PyTorchとほぼ同じ) B:ネットワーク部(PyTorchとほぼ同じ)
  13. © 2019 OPTiM Corp. 14 サンプルプログラムを見る(Ignite 2/2)  A:各種パラメータとログの設定 •

    writer: TensorBoardで可視化したいパラメータをaddする • trainer/evaluator: trainとtestをigniteで実行できるようにラップする • log_{training, validation}_results: • trainer.onで実行タイミングを制御できる • EPOCH_COMPLETEDなので、Epoch終了時に実行
  14. © 2019 OPTiM Corp. 16 Tips:Igniteで最も成績の良いEpoch上位N個の重みを保存する  save_handlerを利用する • to_save:

    重みを保存するなら、modelを設定する (GPUの場合はmodel.module) • DiskSaver: 保存先の設定 • n_saved: N個を保存する • filename_prefix: ファイル名の先頭に付ける名前 • score_function: スコアの計算をする(参照) • score_name: スコアの先頭に付ける名称 • global_step_transform: global_step_from_engine(trainer) などを設定 https://pytorch.org/igni te/handlers.html#ignite .handlers.Checkpoint こんな感じで保存される⇒ /tmp/models/Xception_model_370_acc=741935.pth
  15. © 2019 OPTiM Corp. 17 サンプルプログラムを見る(Optuna 1/3) https://github.com/optuna/ optuna/blob/master/exampl es/pytorch_ignite_simple.py

    B:ハイパーパラメータ設定部 D:データ読込部(PyTorchとほぼ同じ) C:ネットワーク部(PyTorchとほぼ同じ) A:Optuna呼出部
  16. © 2019 OPTiM Corp. 18 サンプルプログラムを見る(Optuna 2/3)  A:Optuna呼出部 •

    pruner(枝切): • 設定すると、筋の悪い組み合わせを停止できる • n_startup_trials: 枝切をスタートするタイミングで、5を設定すると5回目の試行から枝切判定が実行される • n_warmup_steps: 枝切判定するEpoch数を決める • create_study: • 最大化(最小化)する方向にハイパーパラメータを探索する • optimize • objective: B部で説明 • n_trials: 設定した試行回数を実行する • timeout: 設定した秒数になるまで試行回数を実行する
  17. © 2019 OPTiM Corp. 19 サンプルプログラムを見る(Optuna 3/3)  B:ハイパーパラメータ設定部 •

    pruning_handler: • PyTorch専用の枝切処理を入れる • ここではtrainerのaccuracyが 悪い場合に枝切を実行するよう設定 • return(state_metrics): • ここでは最適化したい値を返す • 今回はevaluatorのaccuracyを最適化 (create_studyで最大化を目指す)
  18. © 2019 OPTiM Corp. 21 Tips:OptunaでTensorBoardの活用  Optunaでハイパーパラメータを試行したものの、どんなパラメータが選択されたのか? • TensorBoardCallbackを利用する

    • 学習中または学習終了時に別ターミナルで tensorboard --logdir=./logs を実行 • 画面中に出てくるURLをブラウザで開く https://github.com/optuna/ optuna/blob/master/exampl es/tensorboard_simple.py
  19. © 2019 OPTiM Corp. 22 まとめ • 最新の論文実装が多く実装されており、サクッと動かすならこれでOK • PyTorchを使う上で、ループ処理などを書かなくて済む便利なライブラリ

    • LRSchedulerの設定や重みの自動保存も簡単に設定できる • ハイパーパラメータ最適化はこれに任せる • 可視化方法も色々ある