DUICUO

Optunaを用いたPyTorchモデルのハイパーパラメータチューニング

Optunaはオープンソースのハイパーパラメータ最適化フレームワークです。フレームワークに依存せず、あらゆる機械学習・深層学習フレームワークで使用できます。この記事では、表形式のデータを例に、Optunaを用いてPyTorchモデルのハイパーパラメータを調整する方法を説明します。

Optuna は Python の pip コマンド(例:`pip install Optuna`)を使ってインストールできます。あるいは、`conda install -c conda-forge Optuna` を使って Anaconda ベースの Python ディストリビューションをインストールすることもできます。

ご覧のとおり、基本的な Python 言語で数行のコードを書くだけで、あらゆるニューラル ネットワークの実験を作成して実行できます。

OPUTNAはシンプルなAPIベースの実装を備えており、ユーザーは最適化するメトリクスと調査するハイパーパラメータ空間を定義できます。最適化プロセスは、単一の関数を呼び出すだけで実行されます。確率的探索、グリッドサーチ、ベイズ最適化など、幅広い最適化アルゴリズムをサポートしています。さらに、連続値、整数値、カテゴリカルハイパーパラメータ、そして複雑な依存関係を持つハイパーパラメータの最適化もサポートしています。

オプトナの簡単な紹介

まず、Oputna フレームワークの基本的な用語について学びましょう。

トライアル: - トライアルは、対象関数を評価するプロセスです。対象関数に渡されるこのオブジェクトは、パラメータの候補の取得、トライアルステータスの管理、カスタムトライアルプロパティの設定/取得のためのインターフェースを提供します。

スタディ: 1つのスタディは1つの最適化タスク、つまり一連の実験に対応します。このオブジェクトは、新しい実験の実行、実験履歴へのアクセス、そしてスタディ自体のユーザー定義プロパティの設定/取得のためのインターフェースを提供します。

Studyクラスには、新しいStudyオブジェクトを作成するための重要なメソッドcreate_studyが含まれています。その主要なパラメータは次のとおりです。

  • 目的: 目的関数はOptunaの最適化ハイパーパラメータ選択の中核です。ブルートフォースグリッドサーチも目的関数の最小化を目指しますが、どのハイパーパラメータの組み合わせが良いか悪いかは実際には考慮されません。
  • サンプラー: 値提案の基礎となるアルゴリズムを実装するサンプラーオブジェクト。None が指定された場合、単一目的最適化には TPESampler が使用され、多目的最適化には NSGAIISampler が使用されます。
  • Pruner: 失敗した試行を早期に停止することを決定するプルーナーオブジェクト。None が指定された場合は、デフォルトで MedianPruner が使用されます。
  • Study_name: 調査の名前。このパラメータを「なし」に設定すると、一意の名前が自動的に生成されます。
  • 方向: 多目的最適化プロセスにおける方向のシーケンス。

PyTorchモデル

Optna のハイパーパラメータ検索に対応するには、次のようなさまざまなパラメータに基づいて異なる PyTorch モデルを返す関数が必要です。

ハイパーパラメータには、In_Features、N_Layers、DropOut、N_output が含まれます。

Trial は、Oputna によって合格した Trial 実装です。

目的関数

目的関数は、最適化したいハイパーパラメータから構成されます。この例では、前述のモデルのハイパーパラメータに加えて、learning_rate、weight_decay、そして様々な最適化パラメータを最適化する必要があるため、以下のように定義します。

トレーニングループ

学習ループはOptunaの最も重要な構成要素です。以下の例では、目的関数を定義するパラメータ辞書をパラメータ化しています。

勉強

前述の通り、Optunaの研究ではデータセットに対して複数回の試行を実施し、損失関数としてRMSEを用いたため、RMSEを最小化することが目標でした。本研究では、TPESampler.Tree構造の推定器を使用しました。

結果表示

データセットが非常に小さかったため、実験は25ループで終了しました。詳細は以下の通りです。RMSEを0.058に最小化する最適な実験とハイパーパラメータの組み合わせを以下に示します。

 Study statistics: Number of finished trials: 25 Number of pruned trials: 0 Number of complete trials: 25 Best trial: FrozenTrial(number=18, state=TrialState.COMPLETE, values=[0.058233041420927334], datetime_start=datetime.datetime(2023, 5, 21, 5, 9, 43, 683621), datetime_complete=datetime.datetime(2023, 5, 21, 5, 10, 7, 935450), params={'learning_rate': 0.0010084133367699304, 'optimizer': 'Adam', 'weight_decay': 0.00013535005248600755, 'n_layers': 2, 'dropout': 0.2, 'n_units_l0': 7, 'n_units_l1': 6}, user_attrs={}, system_attrs={}, intermediate_values={}, distributinotallow={'learning_rate': FloatDistribution(high=0.01, log=True, low=0.001, step=None), 'optimizer': CategoricalDistribution(choices=('Adam', 'RMSprop', 'SGD')), 'weight_decay': FloatDistribution(high=0.001, log=True, low=0.0001, step=None), 'n_layers': IntDistribution(high=4, log=False, low=2, step=1), 'dropout': FloatDistribution(high=0.5, log=False, low=0.1, step=0.1), 'n_units_l0': IntDistribution(high=8, log=False, low=2, step=1), 'n_units_l1': IntDistribution(high=7, log=False, low=2, step=1)}, trial_id=18, value=None) Value: 0.058233041420927334 Best Trail Params: learning_rate: 0.0010084133367699304 optimizer: Adam weight_decay: 0.00013535005248600755 n_layers: 2 dropout: 0.2 n_units_l0: 7 n_units_l1: 6

次の関数を使用して結果を視覚化することもできます。

optuna.visualization.plot_optimization_history(研究)

optuna.visualization.plot_param_importances(研究)

optuna.visualization.plot_slice(研究)

optuna.visualization.plot_parallel_coordinate(研究)

これで、Optuna を用いた PyTorch モデルのチューニングプロセス全体が完了しました。この記事のソースコードと完全な実行結果は、こちらでご覧いただけます。この例をチューニングしたり、学習したりしたい場合は、こちらのリンクをご覧ください: https://www.kaggle.com/code/averma111/pytorch-ps3e15-optuna