Amazon Web Services ブログ

Amazon SageMaker 自動モデルチューニング: 機械学習のために機械学習を使用する

今日は、Amazon SageMaker 自動モデルチューニングの一般向けリリースを発表します。自動モデルチューニングは、より正確なモデルのために、ハイパーパラメータースペースを検索するのに必要になる画一的な負荷を一掃します。開発者とデータ科学者はこの機能により、自身の機械学習モデルをトレーニングおよびチューニングするための膨大な時間と手間を省くことができます。ハイパーパラメーターチューニングジョブは、完了したトレーニングジョブの結果をもとに、様々なハイパーパラメーターの組み合わせで複数のトレーニングジョブを起動します。SageMaker はベイズ最適化に基づき、私たちのトレーニングジョブのハイパーパラメーターコンビネーションを推測するため、「メタ」機械学習モデルをトレーニングします。もう少し、掘り下げていきましょう。

機械学習プロセスにおけるモデルチューニング

開発者の典型的な機械学習プロセスには、探索的データ解析 (EDA)、モデル設計、モデルトレーニング、モデル評価の 4 つのステップがあります。SageMaker ではパワフルな Jupyter ノートブックインスタンス、内蔵型アルゴリズム、サービスを使用したモデルトレーニングなどを採用することで、すでにこれら各ステップの合理化が図られています。このプロセスのトレーニングの面に注目することで、私たちは通常、データを処理し、想定した結果に照らしてモデルの予測を評価したモデルへ、そのデータを移植します。私たちは全体的な入力データの一部、評価データを、モデルのトレーニングに使用したトレーニングデータとは離しておきます。そしてこの評価データを使用して、それまで見たことのないデータでモデルの動作を検証するのです。多くのケースではアルゴリズムを選択した、あと、またはカスタムモデルを構築したあとに、入力したデータに対する最高の結果を得るために、そのアルゴリズムのハイパーパラメーターで、最も可能性のあるスペースを検索するために必要になります。

ハイパーパラメーターは基礎となるアルゴリズムの操作とモデルのパフォーマンスに及ぶ影響を管理します。たとえば、トレーニングするエポックの数、ネットワークレイヤーの数、学習率、最適化アルゴリズム、その他などです。通常、ランダムな値、または他の問題と共通の値で開始し、変更の結果が見え始めるまで、調整を繰り返します。かつて、この作業は骨の折れる手作業でした。しかし、才能溢れる研究者たちの地道な努力のおかげで、SageMaker を使用してこうした手作業による手間をほとんどすべて排除できるようになりました。ユーザーに必要なのは、チューニングするハイパーパラメーター、探索するパラメーターの範囲、予算に応じたトレーニングジョブの合計数です。実際の動作を見てみましょう。

ハイパーパラメーターのチューニング

この機能のデモをご覧に入れるため、作業には標準の MNIST データセット、Apache MXNet フレームワーク、SageMaker Python SDK を使用します。下記で選択するもののすべては SageMaker example notebooks で入手できます。

まず、ノートブックインスタンス上で SageMaker Python SDK を使用し、従来の MXNet エスティメーターを作ります。


import boto3
import sagemaker
from sagemaker.mxnet import MXNet
role = sagemaker.get_execution_role()
region = boto3.Session().region_name
train_data_location = 's3://sagemaker-sample-data-{}/mxnet/mnist/train'.format(region)
test_data_location = 's3://sagemaker-sample-data-{}/mxnet/mnist/test'.format(region)
estimator = MXNet(entry_point='mnist.py',
                  role=role,
                  train_instance_count=1,
                  train_instance_type='ml.m4.xlarge',
                  sagemaker_session=sagemaker.Session(),
                  base_job_name='HPO-mxnet',
                  hyperparameters={'batch_size': 100})

ここまでは他の SageMaker の例でご覧になったものとよく似ているかもしれません。

次に、自動モデルチューニングのためのツールをインポートし、ハイパーパラメーター範囲を作成しましょう。


from sagemaker.tuner import HyperparameterTuner, IntegerParameter, CategoricalParameter, ContinuousParameter
hyperparameter_ranges = {'optimizer': CategoricalParameter(['sgd', 'Adam']),
                         'learning_rate': ContinuousParameter(0.01, 0.2),
                         'num_epoch': IntegerParameter(10, 50)}

チューニングジョブがこれらの範囲からパラメーターを作成し、それらを使用して、トレーニング能力を集中するのに最適な場所を決定します。次にパラメーターをいくつか示します。

  • Categorical パラメーターは個々のセットから 1 つの値を使用します。
  • Continuous パラメーターには最小値と最大値の間にある実数値を使用できます。
  • Integer パラメーターには指定された範囲内の任意の整数値を使用できます。

さて、範囲を定義できたので、成功メトリックスとトレーニングジョブのログでそのメトリックスを検出するための正規表現を定義していきましょう。


objective_metric_name = 'Validation-accuracy'
metric_definitions = [{'Name': 'Validation-accuracy',
                       'Regex': 'Validation-accuracy=([0-9\\.]+)'}]

さて、いくつか定義できたところで、早速チューニングジョブを開始しましょう。


tuner = HyperparameterTuner(estimator,
                            objective_metric_name,
                            hyperparameter_ranges,
                            metric_definitions,
                            max_jobs=9,
                            max_parallel_jobs=3)
tuner.fit({'train': train_data_location, 'test': test_data_location})

ここで SageMaker コンソールを開き、[Hyperparameter tuning jobs] (ハイパーパラメーターチューニングジョブ) サブコンソールを選択し、チューニングジョブをすべてチェックアウトします。

作成したばかりのジョブをクリックして、もう少し細部やチューニングの結果なども見てみましょう。

コンソールにはデフォルトで最高のジョブと使用されたパラメーターが表示されますが、他のジョブをそれぞれチェックアウトすることもできます。

それではノートブックインスタンスに話しを戻しましょう。ここに次の簡単な分析オブジェクトがあります。 tuner.analytics() これは一部の bokeh プロットを使用したトレーニングの結果を可視化するために使用します。これの一部の例は、SageMaker example notebooks で入手できます。

この機能は内蔵型アルゴリズム、SageMaker Python SDK で作成されたジョブ、または Docker で独自のトレーニングジョブを使用する場合に機能します。

また、Create hyperparameter tuning job (ハイパーパラメーターのチューニングジョブの作成) をクリックすることで、コンソールからチューニングジョブを作成することも可能です。

まず、ジョブの名前、IAM ロール、ジョブが実行される VPC があればそれを指定します。

次に、トレーニングジョブを設定します。内蔵型のアルゴリズムまたはカスタムの Docker イメージを使用できます。カスタムのイメージを使用する場合、これはログの対象となるメトリックスを検出するために regex を定義した場所になります。ここでは XGBoost を選択して、[Next] (次へ) をクリックします。

次に、ノートブックのサンプルと同様に、チューニングジョブのパラメーターを設定します。最適化するオブジェクトメトリックスとして、曲線の下の領域 (AUC) を選びます。これは内蔵型アルゴリズムであるため、このメトリックスの regex はすでに入力済みです。端数のない最小値と最大値を設定して、[Next] (次へ) をクリックします。

次の画面ではアルゴリズムで想定されている入力チャンネルと、モデルを出力するためのロケーションを設定します。通常、チャンネルを「トレーニング」するだけではなく、チャンネルの「評価」も行います。

最後に、このチューニングジョブのリソース制限を設定します。

これで準備は完了、 いよいよ チューニング!

その他のリソース

自動モデルチューニングを利用するためにユーザーが定義する必要があるのは、ハイパーパラメーターの範囲、成功メトリックスとそれを検出するための regex、並行して実行するジョブの数、実行するジョブの最大数など、ごくわずかな項目のみです。内蔵型アルゴリズムであれば、regex を定義する必要もありません。使用する並行ジョブの数と最終モデルの精度の間には、小さなトレードオフがあります。ここで max_parallel_jobs を増やすと、チューニングジョブが終了するまでの時間は格段に短くなりますが、平行度が低いと、一般的に最終結果の質が向上します。

Amazon SageMaker 自動モデルチューニングでは追加コストはありません。チューニングジョブが起動したトレーニングジョブで使用された基盤となるリソースのみ課金されます。この機能は今後、SageMaker が利用できるすべての リージョンで利用可能になります。この機能は API で使用可能で、自動モデルチューニングで起動されたトレーニングジョブは、コンソールから見ることができます。この文書でさらに詳しい情報をご覧いただけます。

この機能は開発者の時間と手間を大幅に節約してくれることでしょう。また、皆さんがこの機能をいかに活用するかについてぜひお話しを聞かせてください。いつものように、コメントまたは Twitter で皆さんのフィードバックをお待ちしています!

Randall