機械学習

Optunaでハイパーパラメータの自動チューニング -Pytorch Lightning編-

optunaでハイパーパラメータ最適化 pytorch-ligthning編

こんにちは。

現役エンジニアの”はやぶさ”@Cpp_Learningです。最近は、Pytorchを使って深層学習を楽しんでいます。

今回は、ハイパーパラメータ自動最適化フレームワーク Optuna を使って、ハイパーパラメータの自動チューニングを実践したので、備忘録も兼ねて本記事を書きます。

Optunaとは

Optunaやハイパーパラメータについては、PFN公式ブログに丁寧な解説がありますので、本記事では割愛し…

Optunaを活用したハイパーパラメータ自動チューニングのイメージのみを説明します。

従来、人がチューニングしていたハイパーパラメータを…

Optuna

Optunaが代わりにやってくれます(ハイパーパラメータの自動チューニング)

Optuna

出典:PFNエンジニアの講演資料

以上!

なお、上図は Chainer の例ですが、以下のExamplesコードが用意してあります。

LightGBM のハイパーパラメータをチューニングすることに特化した LightGBMTuner なんてのもあります。

Optunaの基本的な使い方

Optunaの基本的な使い方を紹介します。

インストール

Optunaは以下のコマンドでインストールできます。

pip install optuna

Optunaの基本的なコード

以下がOptunaの基本的なコードです。

目的関数を定義し、Studyで最適化(スコア最小化)を実行します。なお、スコア最大化の場合は以下のコードを使います。

トライアル数ではなく、時間をトリガーに最適化を終了させることもできます。以下のコードを使えば、60secでトライアルが終了します。

トライアル数と時間の両方を設定することもできます。例えば「トライアル数:100だけど、10min(600sec)超える場合は打ち切り」などは以下のコードで実現できます。

最適化対象のコード(チューニング例)

最適化対象のコード例は以下の通りです。

パラメータを6~12(int)の範囲でチューニングしたり、3 or 5 or 7のように3つのパラメータからチューニングするなどが可能です。

最適化の結果

最適化の結果は以下のコードで確認できます。

トライアルの様子はデータフレーム形式で確認できます。

基本的な使い方については以上になります。

スポンサーリンク

実践!Optunaでハイパーパラメータの自動チューニング -Pytorch Lightning編-

今回は、Pytorch Lightning で設計したCNNのハイパーパラメータをOptunaで自動チューニングしてみます。

Pytorch Lightningについては、インストール方法から実践まで以下の記事で説明済みのため、本記事では割愛します。

PyTorch Lightning入門から実践まで -自前データセットで学習し画像分類モデルを生成-
PyTorch Lightning
PyTorch Lightning入門から実践まで -自前データセットで学習し画像分類モデルを生成-ディープラーニングフレームワークPytorchの軽量ラッパー”pytorch-lightning”の入門から実践までのチュートリアル記事を書きました。自前データセットを学習して画像分類モデルを生成し、そのモデルを使って推論するところまでソースコード付で解説しています。...

最適化対象

PyTorch LightningのExample(公式) では以下の項目をOptunaでチューニングしています。

  • NNのレイヤー数(n_layers)
  • ドロップアウト(dropout)

今回は、レイヤー数を固定して以下の項目をOptunaでチューニングしてみます。

  • CNNのチャンネル数(n_channels)
  • NNのニューロン数(n_neurons)
  • オプティマイザーoptimizer)
  • 学習率(lr)

Import

最初はimportから

Logger

Loggerクラスを自作します。

CNN設計

Pytorchの公式チュートリアル を参考にCNNを設計し、隠れ層のチャンネル数などをOptunaでチューニングします。

Optimizer

オプティマイザー選定および学習率のチューニングについてもOptunaを活用するため、以下の関数を自作します。

※関数化は必須ではありませんが、推奨です。

  • 関数化により、後から出てくる学習システムのコードがスッキリします
  • クラス化と迷いましたが、今回は関数にしました

System設計

PyTorch Lightningでは、以下のような学習システムを設計します。

Optuna用の変数:self.trial があること以外は、Pytorch Lightningの基本的なコードと同じです。

Objective

最適化対象のコード(目的関数)を自作します。

今回は、accuracyを最適化(最大化)します。

Optimize hyperparameters of the model

Studyで最適化を実行します。

今回は、トライアル数:100, Timeout:600(600secで打ち切り)としました。

Result of optimization

以下のコードで最適化の結果を確認します。

今回の最適化結果は以下の通りでした。

  • Number of finished trials: 83
  • Best trial:
    • Value: 0.9720982142857143
    • Params:
      • n_channels: 6
      • n_neurons: 115
      • optimizer: Adam
      • lr: 0.008573323660481427

 

トライアル数:83(10分で100トライアル終了しなかった)、Value(Accuracy):0.97を叩き出したベストハイパーパラメータ(Params)が上記の通りです。

以下のコードでトライアルの様子を確認できます。

本記事では表を出しませんが、トライアルの終盤はオプティマイザー:Adam一択だったことを確認できました。

はやぶさ
はやぶさ
自分でチューニングしたら、83トライアルでValue: 0.97を出すのは難しかったと思う。ありがとう Optuna!

以上で実践も終了です。

まとめ

Optunaの基本的な使い方から、Optuna + Pytorch Lightning の実践まで説明しました。

optunaでハイパーパラメータ最適化 pytorch-ligthning編

Optunaによる自動最適化Pytorch Lightningによる学習システムの組み合わせ…名付けて『自動最適化機能付き学習システム』ってところかな(*・ω・)ノ♪

本記事で公開しているソースコードは自由に使ってOKです(改良も問題なし)。

Optuna + Pytorch Lightnigを是非使ってみてください。

はやぶさ
はやぶさ
本記事が参考になれば嬉しいです。また、Optunaで試したことなどを情報共有して頂けたら、とても嬉しいです。

よろしくお願いします。

PyTorchの実践的なコードを多数収録
実践的なデータ分析の技術を学べる良書
LINEスタンプ配信中!

フクロウのLINEスタンプ

当サイトのマスコットキャラクター

「フクロウのくるる」が

LINEスタンプになりました!

勉強で疲れたあなたに癒しをお届け☆

お迎え待ってます(*・ω・)ノ♪

今すぐお迎えする

40個セットがたったの50コインとお得です