Amazon SageMakerで「ハイパーパラメータ自動チューニング」の結果が再利用できるようになりました(「warm start」機能のアップデート)

SageMakerで「ハイパーパラメータ自動チューニング」の結果が再利用できるようになりました!!! これはすごい嬉しい!
2018.11.20

概要

こんにちは、yoshimです。
SageMakerで「ハイパーパラメータ自動チューニング」の結果が再利用できるようになりました!!!
AWS Machine Learning Blog

ハイパーパラメータチューニングに苦労している人にとってはとても嬉しいアップデートなのではないでしょうか? 早速、チュートリアルを試してみたので、ご紹介します。

目次

1.何が嬉しいのか

今までのハイパーパラメータ自動チューニングでは、「ハイパーパラメータチューニングJOBを実行する度に1から学習し直し」といった手間があったのですが、今回のアップデートでは、「ハイパーパラメータ自動チューニングをする際に、以前の学習結果を再利用することができる」ようになりました。

「このハイパーパラメータもチューニングした方がいいかな」、とか「範囲を変更してみたいな」となった時に、改めて1から学習し直すとお金も時間もかかるので、以前の学習結果を利用できるというのは凄い嬉しいですね。
これで、モデルの学習にかかる時間や手間を削減できて嬉しい人も多いはずです。というか、私はとても嬉しいです。

2.この機能の利用方法

「warm start」機能を利用するために必要なことは、下記の2つのパラメータを設定するだけです。

・参照する親チューニングJOB(5つまで指定可能。リスト形式)
・「warm start」の形式を指定する。下記の2つのうちのいずれかを選択する
  • IDENTICAL_DATA_AND_ALGORITHM:利用するアルゴリズム、データが同じならこれを指定。
  • TRANSFER_LEARNING:データ格納先やデータの中身、アルゴリズムの一部(分類クラス数等)に変更があった場合は、このパラメータを指定することで転移学習ができる

具体的なコードの話で言うと、ハイパーパラメータ自動チューニングJOBのパラメータ設定時に下記のような処理が増えました。

「warm start」の設定を指定して、

from sagemaker.tuner import WarmStartConfig, WarmStartTypes

parent_tuning_job_name = <tuning_job_name> # 親JOB名を指定
warm_start_config = WarmStartConfig(WarmStartTypes.IDENTICAL_DATA_AND_ALGORITHM, # 「warm start」の形式を指定
                                    parents={parent_tuning_job_name})

チューナーに設定を組み込む。

tuner_warm_start = HyperparameterTuner(imageclassification,
                            objective_metric_name,
                            hyperparameter_ranges,
                            objective_type='Maximize',
                            max_jobs=5,
                            max_parallel_jobs=2,
                            base_tuning_job_name='warmstart',
                            warm_start_config=warm_start_config # configを埋め込む
                            )

この後は、いつも通りfitするだけです。

こちらの「WarmStartTypes」、「WarmStartConfig」、「HyperparameterTuner」クラスが今回のアップデートに関係ある部分になります。  

3.チュートリアル

今回実施したチュートリアルでは、ビルトインアルゴリズムの「画像分類」で、下記のように「warm start」機能を紹介していました。

1.普通にハイパーパラメータ調整JOBを実行
2.「1」の結果を用いて、「WarmStartTypesを、IDENTICAL_DATA_AND_ALGORITHM」として実行
3.「2」の結果を用いて、「WarmStartTypesを、TRANSFER_LEARNING」として実行

いずれも5回トレーニングするので「2」では、「5回分の学習結果を基に、更に5回分の学習をした」状態になります。 「3」は「2の学習結果を基に、」5回分トレーニングした結果を得られています。
コードはチュートリアルの通りなのですが、学習の結果を描画してみます。

・「1.普通にハイパーパラメータ調整JOBを実行」の学習結果

まずは、普通にハイパーパラメータ調整JOBとして5回学習した結果を描画しています。
横軸がJOBのID、縦軸が検証用データセットでの精度です。
5回学習しただけなので、まだまだ精度がいまいちです。

・「2.「1」の結果を用いて、「WarmStartTypesを、IDENTICAL_DATA_AND_ALGORITHM」として実行 」の学習結果

続いて、 「1」の結果を用いて学習した結果です。
合計10回分の学習の結果を描画してみました。

10回分の学習結果

まだまだ精度も低いですね。

・「3.「2」の結果を用いて、「WarmStartTypesを、TRANSFER_LEARNING」として実行」の学習結果

続いて、合計15回分の学習結果を描画してみました。

今までの学習の成果が出たのか、少し上がり始めましたね。
とはいえ、このチュートリアルで指定している「チューニングJOB実行回数」や「エポック数」が少ないためまだまだ微妙です。
これを「エポック数を多くする」、「絞り込むハイパーパラメータの範囲を絞り込む」、「チューニングJOBの回数を増やす」等をすることで、より良い結果が得られるかと思います。

理想としては、AWS Machine Learning Blogで紹介されているように、ハイパーパラメータチューニングJOBの結果をちゃんと引き継げているような結果になると嬉しかったのですが、今回はうまくいきませんでした。
(ハイパーパラメータチューニングJOBごとに色分けがされており、横軸はJOB実行時間)

4.まとめ

以前のハイパーパラメータチューニングJOBの結果を再利用できる、というのは「ハイパーパラメータチューニング」に苦しむ人にとって、とても嬉しいアップデートです。
もし「ハイパーパラメータの自動チューニング」機能を使っているのなら、是非使ってみてください。