Amazon Web Services ブログ

ハイパーパラメータチューニングジョブのウォームスタートを使って、Amazon SageMaker 自動モデルチューニングの効率をさらに向上

今年初め、当社は Amazon SageMaker 自動モデルチューニング を発表しました。これは開発者とデータ科学者が、機械学習モデルのトレーニングとチューニングにかかる多くの時間と労力を削減することを可能にしてくれます。本日、自動モデルチューニングでハイパーパラメータチューニングジョブのウォームスタートを開始します。データ科学者と開発者は、選択された親ジョブに基づいて新しいハイパーパラメータチューニングジョブを作成できるようになり、親ジョブで実行されたトレーニングジョブを事前知識として再利用できます。ハイパーパラメータチューニングジョブのウォームスタートは、ハイパーパラメータチューニングプロセスを加速し、チューニングモデルのコストを削減します。

データ科学者と開発者は、すでに自動モデルチューニングを使用してモデルを効率的にチューニングすることができましたが、さらに多くの支援が必要な分野があります。例えば、小規模予算でハイパーパラメータチューニングジョブを開始し、結果を分析後に、より大きな予算でモデルのチューニングを続けることを決定します。潜在的に異なるハイパーパラメータ設定を使用することもあります (チューニングにより多くのハイパーパラメータを追加したり、一部のハイパーパラメータで異なる検索範囲を試すなど)。もう 1 つの例は、データ科学者または開発者が、以前のモデルチューニングの後に新しいデータを収集し、モデルを再チューニングする場合です。どちらの場合も、このモデルの以前のチューニングジョブから収集した事前知識を使用してハイパーパラメータチューニングジョブを開始すると、最高のモデルに素早くアクセスし、顧客のコストを節約することに役立ちます。しかし、以前に行ったすべてのチューニングジョブはゼロから開始になります。同様のチューニング構成で同じモデルがすでにチューニングされていても、情報は再利用されませんでした。

ハイパーパラメータチューニングジョブのウォームスタートはこれらのニーズに対応します。ここでは、ウォームスタートを活用してモデルを繰り返しチューニングする方法を紹介します。

ウォームスタートを活用した画像分類モデルのチューニング

この例では、画像分類子を作成し、ウォームスタートを利用して複数のハイパーパラメータチューニングジョブを実行することによって、画像分類子を繰り返し調整します。Amazon SageMaker 組み込み画像分類アルゴリズム を使用して、モデルを Caltech-256 データセットでトレーニングします。完全なサンプルノートブックはこちらから参照できます。

ハイパーパラメータチューニングジョブの開始と起動

ノートブックインスタンスの作成、データセットの準備、Amazon S3 へのプッシュ、ハイパーパラメータチューニングジョブの起動から直接起動する手順は省略します。サンプルノートブックにはすべての詳細がありますので、ここではプロセスを検討はしません。

この最初のチューニングジョブを実行して、検索スペースについて学習し、画像分類でチューニング可能なパラメータをチューニングする影響を評価します。このジョブは、モデルのチューニングが有望であるかどうか、そして後続のチューニングジョブを作成してチューニングを続行するかどうかを評価します。

チューニングジョブを作成するには、最初に組み込み画像分類アルゴリズム用のトレーニング推定器 (Estimator) を作成し、チューニングする予定のものを除いて、このアルゴリズムのすべてのハイパーパラメータの値を指定する必要があります。組み込み画像分類アルゴリズムのハイパーパラメータについての詳細は、こちらの文書 を参照してください。

s3_output_location = 's3://{}/{}/output'.format(bucket, prefix)
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket, prefix), content_type='application/x-recordio')
s3_input_validation = sagemaker.s3_input(s3_data='s3://{}/{}/validation/'.format(bucket, prefix), content_type='application/x-recordio')
sess = sagemaker.Session()

imageclassification = sagemaker.estimator.Estimator(training_image,
                                    role,
                                    train_instance_count=1,
                                    train_instance_type='ml.p3.8xlarge',
                                    output_path=s3_output_location,
                                    sagemaker_session=sess)

imageclassification.set_hyperparameters(num_layers=18,
                                        image_shape='3,224,224',
                                        num_classes=257,
                                        num_training_samples=15420,
                                        mini_batch_size=128,
                                        epochs=50,
                                        optimizer='sgd',
                                        top_k='2',
                                        precision_dtype='float32',
                                        augmentation_type='crop')

推定器が使用できるようになりましたので、推定器を使用してハイパーパラメータチューニングジョブを作成し、チューニングするハイパーパラメータの検索範囲と、実行するトレーニングジョブの合計数を指定できます。

私たちはモデルの品質 (つまり目標メトリック) に最も影響を与えると考えられる 3 つのハイパーパラメータを選択しました。最適なモデルとなる値はまだ分からないので、画像分類文書で指定されているモーメンタムと weight_decay の検索範囲を指定し、学習率の検索範囲を小さくしました (0.0001, 0.05)。

  • learning_rate: トレーニングアルゴリズムがモデルを最適化する速度を制御します。学習率が低いほど精度は向上しますが、モデルのトレーニングには時間がかかるようになります。学習率が高くなっても、モデルの精度は向上しません。この属性のバランスを上手く取る必要があります。
  • メモ: 前回の更新の方向からの情報を使い、現在の更新を知らせます。デフォルト値 0 は、現在のバッチ内の情報のみに基づいて重みの更新が行われることを意味します。
  • weight_decay: 過学習となった場合には、重みにペナルティを付けます。デフォルト

値 0 はペナルティなしを意味します。

この場合、Amazon SageMaker の組み込みアルゴリズムの 1 つを使用しているため、目標メトリックの正規表現を指定する必要はありません。

from sagemaker.tuner import IntegerParameter, CategoricalParameter, ContinuousParameter, HyperparameterTuner

hyperparameter_ranges = {'learning_rate': ContinuousParameter(0.0001, 0.05),
                         'momentum': ContinuousParameter(0.0, 0.99),
                         'weight_decay': ContinuousParameter(0.0, 0.99)}

objective_metric_name = 'validation:accuracy'

tuner = HyperparameterTuner(imageclassification,
                            objective_metric_name,
                            hyperparameter_ranges,
                            objective_type='Maximize',
                            max_jobs=10,
                            max_parallel_jobs=2) 

ハイパーパラメータチューニングジョブが終了後、Amazon SageMaker Python SDK の HyperparameterTuningJobAnalytics API アクションを使用して、メトリックのテーブルを取り込むことができます。

tuner_parent = sagemaker.HyperparameterTuningJobAnalytics(tuning_job_name)
tuner_parent.dataframe().sort_values(['FinalObjectiveValue'], ascending=False)

このテーブルは、実行されたトレーニングジョブのサブセットを示しています。ノートブックを実行すると、すべての結果を見ることができます。チューニング中のハイパーパラメータは、画像分類アルゴリズムの目標メトリックの値に大きな影響を与えることを確認してください。異なる値を選択すると、非常に異なる結果が得られます。

HPO_Analyze_TuningJob_Results.ipynb ノートブックを使用すると、チューニングジョブが進行するごとに目標メトリックがどのように変化するかをプロットすることができます。

自動モデルチューニングが探索空間を介して学習が進むに連れて、目標メトリックの値が改善されることが分かります。さらに多くのトレーニングジョブを実行することで、0.33 の検証精度を上回る改善が得られる可能性があります。仮説を検証するため、他の 10 のトレーニングジョブを使って、2 つ目のチューニングジョブを実行します。今回は、最初のチューニングジョブから収集した学習を再利用するためにウォームスタートを使用します。

チューニングプロセスのランダム性を考慮すると、説明したような傾向を得られないのではないかと心配するかもしれません。同じ実験を実行しても同じ結果は得られませんが、通常はモデル品質の改善の全体的な傾向は見られるはずです。

ウォームスタート構成を使用した、ハイパーパラメータチューニングジョブの設定と起動

新しいチューニングジョブでウォームスタートを使用するには、2 つのパラメータを指定する必要があります。

  • 新しいチューニングジョブを開始点として使用する親チューニングジョブのリスト。(親の最大数は 5 にすることができますが、この例では 1 を使用します)。
  • ウォームスタート構成の種類:
    • IDENTICAL_DATA_AND_ALGORITHM ウォームは、基本的に同じタスクで以前の評価を使用してチューニングジョブを開始することで、探索空間のわずかな変化を可能にします。このオプションは、データセットとアルゴリズムコンテナが変更されていない場合に使用する必要があります。
    • TRANSFER_LEARNING ウォームは、類似タスクからの評価を使用してチューニングジョブを開始し、探索空間、アルゴリズム画像、データセットの変更を可能にします。

この例では、データセットやアルゴリズムを変更していないため、より多くのトレーニングジョブを実行しているだけなので、IDENTICAL_DATA_AND_ALGORITHM を使用します。

Amazon SageMaker コンソールを使用して、ウォームスタートを使用して 2 つ目のチューニングジョブを開始します。Amazon SageMaker コンソールを開き、左側のナビゲーションペインで Training を選択し、次に Hyperparameter tuning jobsCreate hyperparameter tuning job を選択します。ページの上部にある [Warm start type] で identical data and algorithm を有効にします。次のステップでは、新しいチューニングジョブの親ジョブを選択します。

コンソールでは、親チューニングジョブから Copy settings を使用して、新しいチューニングジョブの値を簡単に入力できます。Copy settings を選択後、フォームに入力されます。Next を選択し、静的およびチューニング可能なハイパーパラメータが正しく表示されることを確認します。

この場合、ハイパーパラメータの値は変更されませんので、もう一度 Next を選択して、ウォームスタートを使用して新しいチューニングジョブを作成するだけです。非常に簡単です!

ウォームスタートハイパーパラメータチューニングジョブが完了後、tuner.analytics() を使用して、親チューニングジョブ (ブラックデータポイント) とウォームスタート (赤いデータポイント) を使用して起動した新しいチューニングジョブの経時的な目標メトリックを可視化するノートブックに戻ることができます。

新しいチューニングジョブは、親チューニングジョブから事前の知識のおかげで、非常に早い時期に良好なハイパーパラメータ設定を見つけることができたことが分かります。最適化を継続すると、目標メトリックは改善を続けて 0.47 に達しました。これは最初のチューニングジョブを最初から実行したときの指標 (0.33) よりも大幅に高くなっています。

最後に、ウォームスタートを使用してチューニングジョブの転送学習を適用する方法を示すために、データセット内のより多くのデータ拡張を使用して、3 つ目のチューニングジョブを実行することで、検証精度がさらに向上するかを見てみましょう。より多くのデータ拡張を適用するには、Amazon SageMaker の事前構築済み画像分類アルゴリズムで公開されている augmentation_type ハイパーパラメータを使用できます。トレーニング時に crop_color_transform 変換をデータセットに適用します。この変換では、クロップおよびカラー変換に加えて、画像にはランダム変換 (回転、傾斜、アスペクト比の変化など) が適用されます。

最後のハイパーパラメータチューニングジョブを作成するには、新しいデータ拡張を適用した結果としてのデータセットが変更されるため、Transfer learning WarmStartType を使用します。親チューニングジョブとして以前に実行した 2 つのチューニングジョブとその他に実行した 10 のチューニングジョブの両方を使用します。この最後のハイパーパラメータチューニングジョブを起動するノートブックに戻ってみましょう。

from sagemaker.tuner import WarmStartConfig, WarmStartTypes

parent_tuning_job_name_2 = warmstart_tuning_job_name
transfer_learning_config = WarmStartConfig(WarmStartTypes.TRANSFER_LEARNING,
                                    parents={parent_tuning_job_name,parent_tuning_job_name_2})

imageclassification.set_hyperparameters(num_layers=18,
                                        image_shape='3,224,224',
                                        num_classes=257,
                                        num_training_samples=15420,
                                        mini_batch_size=128,
                                        epochs=50,
                                        optimizer='sgd',
                                        top_k='2',
                                        precision_dtype='float32',
                                        augmentation_type='crop_color_transform')

tuner_transfer_learning = HyperparameterTuner(imageclassification,
                            objective_metric_name,
                            hyperparameter_ranges,
                            objective_type='Maximize',
                            max_jobs=10,
                            max_parallel_jobs=2,
                            base_tuning_job_name='transferlearning',
                            warm_start_config=transfer_learning_config)

tuner_transfer_learning.fit({'train': s3_input_train, 'validation': s3_input_validation},include_cls_metadata=False)

最後に、新しいハイパーパラメータチューニングジョブが完了したら、親チューニングジョブ (黒と赤のデータポイント) と、ウォームスタート転送学習 (青色のデータポイント) を使用して起動した新しいチューニングジョブの経時的な目標メトリックの変化を可視化するために、tuner.analytics() を使用できます。

チューニングジョブ完了後、目標メトリックは再び改善され、0.52 に達しました。

この結果に満足ならば、自動モデルチューニング記述 API で BestTrainingJob を取得する、またはコンソールに移動して、最高のモデルを生成したトレーニングジョブを見つけることができます。コンソールから、Amazon SageMaker ホスティングエンドポイントにモデルをデプロイできます。

結論

要約すると、私たちは以前の反復で収集した学習を失うことなく、探索空間を反復して探索することに役立つ、ウォームスタートを使用した 1 つのユースケースを探ることができました。また、データセットまたはアルゴリズムが変更された場合でも、以前のハイパーパラメータチューニングジョブで使用されていたデータセットやアルゴリズムには十分近いと思われる場合には、以前のチューニングジョブの学習を転送するためにウォームスタートを使用できることも示しました。

ハイパーパラメータチューニングジョブのウォームスタートは、現在 Amazon SageMaker が 利用可能なすべての AWS リージョンで利用可能になりました。Amazon SageMaker 自動モデルチューニングの詳細は、Amazon SageMaker 文書を参照してください。


 

著者について

Patricia Grao は Amazon AI のソフトウェア開発マネージャーです。彼女は Amazon Search で検索ランキングとクエリの理解に取り組んでいる間に、機械学習に興味を持つようになりました。彼女は Amazon SageMaker 自動モデルチューニングを発表したチームの一員でした。

 

 

 

Fela Winkelmolen は Amazon AI の応用科学者であり、Amazon SageMaker の自動モデルチューニング機能を発表したチームの一員でした。

 

 

 

 

Fan Li は Amazon SageMaker の製品マネージャーです。彼は社交ダンスが趣味でしたが、現在では 8 歳の息子が好きなものは何でも好きです。