Amazon SageMakerの自動モデルチューニングを使用したハイパーパラメータ最適化の高度なテクニックを探求してください

Amazon SageMakerでのハイパーパラメータ最適化における高度なテクニック:自動モデルチューニングの探求

高性能な機械学習(ML)ソリューションを作成するためには、ハイパーパラメータとしても知られるトレーニングパラメータを探索し、最適化する必要があります。ハイパーパラメータは、学習率、バッチサイズ、正則化強度など、具体的なモデルとタスクに応じて調整するためのツマミやレバーです。ハイパーパラメータを探索するには、各パラメータの値を系統的に変化させ、モデルのパフォーマンスへの影響を観察します。このプロセスには追加の努力が必要ですが、利点も大きいです。ハイパーパラメータの最適化(HPO)は、トレーニング時間の短縮、モデルの精度の向上、新しいデータへの一般化の改善につながることがあります。

この記事では、Amazon SageMaker Automatic Model Tuningでハイパーパラメータを最適化する方法を探求します。以前に、SageMakerの組み込みアルゴリズムに対して単一のジョブの最適化を探索し、特定のハイパーパラメータ値の影響について学びました。ハイパーパラメータのチューニングジョブは、良好なパフォーマンスに近づくのに役立ちますが、モデルが特定のハイパーパラメータにどれだけ敏感かを理解し、次のチューニングジョブに活かすこともできます。学んだことに基づいてハイパーパラメータとその値の範囲を見直し、最適化の取り組みを対話形式にすることができます。また、ML実践者として私たちがこれらの実行中に知識を蓄積するように、Amazon SageMaker Automatic Model Tuning(AMT)ではウォームスタートを使用して、前のチューニングジョブで獲得した知識を次のチューニングジョブでも保持することができます。

この記事では、カスタムトレーニングアルゴリズムとベイジアン最適化やランダムサーチなどの異なるHPO戦略で複数のHPOジョブを実行します。また、ウォームスタートを活用して試行を視覚的に比較し、ハイパーパラメータ空間の探索を洗練させます。

SageMaker AMTの高度なコンセプト

次のセクションでは、以下のトピックについて詳しく見ていき、SageMaker AMTがどのようにMLプロジェクトにおいてそれらを実装するのに役立つかを示します。

  • SageMakerトレーニングでカスタムトレーニングコードと人気のあるMLフレームワークScikit-learnを使用する
  • 評価と最適化のためのログに基づいてカスタム評価メトリックを定義する
  • 適切な戦略を使用してHPOを実行する
  • ウォームスタートを使用して、モデルとの一連のハイパーパラメータ検索を対話形式にする
  • 解決策ライブラリを使用して、2つのHPO戦略とチューニングジョブの結果を比較するための高度な可視化技術を使用する

最初の記事で使用した組み込みアルゴリズムを使用している場合も、独自のトレーニングコードを使用している場合も、SageMaker AMTはMLモデルの最適化に向けたシームレスなユーザーエクスペリエンスを提供しています。試行と結果を自動的に追跡する主要な機能を提供します。同時に、基礎となるインフラストラクチャを自動的に管理します。

この記事では、SageMaker組み込みアルゴリズムから離れて、カスタムコードを使用します。SklearnのRandom Forestを使用します。ただし、先ほどの記事と同じMLタスクとデータセット、つまり手書き数字の検出を使用します。Jupyterノートブックの内容2_advanced_tuning_with_custom_training_and_visualizing.ipynbをカバーし、さらに読み進めるためにコードを並行して実行するようお誘いいたします。

さらに深く掘り下げて、カスタムトレーニングコードを使用してモデルをビルドし、デプロイし、実行する方法、およびハイパーパラメータの探索空間を探索して結果を最適化する方法を見つけましょう。

MLモデルの構築とハイパーパラメータの最適化の実行方法

典型的なMLソリューションの構築プロセスはどのようなものでしょうか?さまざまなユースケースや多様なMLタスクが存在するため、ステップバイステップのアプローチのために以下のメンタルモデルを提案します:

  1. 手元のMLシナリオを理解し、要件に基づいてアルゴリズムを選択します。たとえば、監視付き学習アルゴリズムを使用して画像認識タスクを解決したい場合があります。この記事では、引き続き手書き画像認識シナリオと先ほどの記事と同じデータセットを使用します。
  2. SageMaker Training内または外部のさまざまなオプションから、SageMaker Trainingでアルゴリズムの実装を選択します。また、タスクに最適な基になるメトリックを定義し、最適化したいもの(精度、F1スコア、ROCなど)を決定する必要があります。SageMakerは、ニーズやリソースに応じて4つのオプションをサポートしています:
    • Amazon SageMaker JumpStartを介して、事前学習済みモデルを使用でき、そのまま使用するか微調整することができます。
    • 前の記事で行ったように、XGBoostなどの組み込みアルゴリズムを使用してトレーニングとチューニングを行います。
    • Scikit-learn、TensorFlow、PyTorchなどの主要なフレームワークのいずれかを基にしたカスタムモデルのトレーニングとチューニングを行います。AWSは、この目的のために予め作成されたDockerイメージの選択肢を提供しています。この記事では、このオプションを使用し、プリメイドのコンテナイメージの上で独自のコードを実行することで、迅速に実験できるようにします。
    • それ以外のフレームワークやソフトウェアを使用したい場合は、独自のカスタムDockerイメージを持ち込むこともできます。このオプションは最も手間がかかりますが、柔軟性と制御度が最も高くなります。
  3. データでモデルをトレーニングします。前のステップでのアルゴリズムの実装によっては、トレーニングデータを参照し、トレーニングジョブを実行するだけで簡単な場合も

    MLのアルゴリズムとモデルサイズによっては、ハイパーパラメータの最適化の最後のステップが予想以上の困難になることがあります。次の質問は、この段階でのMLの実践者にとって典型的で、あなたにはおなじみのものかもしれません:

    • 私のMLの問題において影響を与えるようなハイパーパラメータはどのようなものですか?
    • どのようにして巨大なハイパーパラメータの空間を効果的に探索し、最適な値を見つけることができますか?
    • 特定のハイパーパラメータの値の組み合わせがパフォーマンス指標にどのように影響するのですか?
    • コストが重要です。リソースを効率的に活用する方法はありますか?
    • どのような調整実験が有益であり、それらを比較するにはどうすればよいですか?

    これらの質問に答えるのは簡単ではありませんが、良いニュースがあります。SageMaker AMTは、重い作業を引き受けてくれ、適切なHPO戦略と探索したい値の範囲を選ぶことに集中することができます。さらに、私たちの視覚化ソリューションを使用することで、よくパフォーマンスの良いハイパーパラメータの値を効率的に見つけるための反復的な分析と実験のプロセスを容易にすることができます。

    次のセクションでは、Scikit-learnを使用してゼロからデジット認識モデルを構築し、すべての概念を実践しながら紹介します。

    ソリューションの概要

    SageMakerは、モデルのトレーニング、評価、チューニングに非常に便利な機能を提供しています。エンドツーエンドのMLライフサイクルのすべての機能をカバーしているため、Jupyterノートブックから離れる必要もありません。

    最初の投稿では、SageMakerの組み込みアルゴリズムであるXGBoostを使用しました。今回はデモのために、独自のトレーニングコードを提供するため、ランダムフォレスト分類器に切り替えます。フレームワークとしてScikit-learnを使用します。では、特定のMLフレームワークを使用することを表現するにはどうすればよいでしょうか?SageMakerは、トレーニング用のプレビルドされたDockerコンテナイメージを取得するために、別のAWSサービスをバックグラウンドで使用します。Amazon Elastic Container Registry(Amazon ECR)です。

    この記事では、以下の手順を詳しく説明します。コードの断片とダイアグラムを使用して、つながりを示します。前に述べたように、可能な場合はノートブックを開いてコードセルをステップバイステップで実行し、AWS環境にアーティファクトを作成してください。アクティブな学習の方法はありません。

    1. まず、データをロードして準備します。手書きの数字データを含むファイルをアップロードするためにAmazon Simple Storage Service(Amazon S3)を使用します。
    2. 次に、トレーニングスクリプトとフレームワークの依存関係を準備します。カスタムのトレーニングコードをPythonで記述し、いくつかの依存ライブラリを参照してテストランを行います。
    3. カスタムの目的のメトリックを定義するために、SageMakerはコンテナログファイルから必要なメトリックを抽出するための正規表現を定義することができます。
    4. scikit-learnフレームワークを使用してモデルをトレーニングします。プレビルドのコンテナイメージを参照して、対応するEstimatorオブジェクトを作成し、カスタムのトレーニングスクリプトを渡します。
    5. AMTを使用してさまざまなHPO戦略を試すことができます。この記事では2つの戦略に焦点を当てています:ランダムサーチとベイズサーチ。
    6. SageMakerのHPO戦略を選択します。
    7. チューニング結果を視覚化、分析、比較します。私たちの視覚化パッケージを使用すると、どの戦略がより良いパフォーマンスを発揮し、どのハイパーパラメータの値がメトリックに基づいて最高のパフォーマンスを提供するかを発見することができます。
    8. ハイパーパラメータスペースの探索とHPOジョブのウォームスタートを継続します。

    AMTは、スケーリングと管理を担当し、Amazon Elastic Compute Cloud(Amazon EC2)インスタンス上で様々なチューニングジョブを実行するための基礎となるコンピュートインフラストラクチャを処理します。これにより、インスタンスのプロビジョニングや、オペレーティングシステムやハードウェアの問題の処理、ログファイルの集約などを自分で行う必要はありません。MLフレームワークのイメージはAmazon ECRから取得し、チューニング結果を含むモデルアーティファクトはAmazon S3に保存されます。すべてのログとメトリックは、必要に応じて簡単にアクセスして追加の分析を行うためにAmazon CloudWatchに収集されます。

    前提条件

    この記事はシリーズの続きですので、SageMaker AMTとHPOに関する最初の記事を読むことをおすすめしますが、必須ではありません。また、MLの概念とPythonプログラミングの基礎知識が役立ちます。また、この記事を読みながら、GitHubリポジトリの付属のノートブックに沿って進めることをおすすめします。ノートブックは最初のノートブックとは独立して実行できますが、サブフォルダからいくつかのコードが必要です。READMEファイルに説明されているように、完全なリポジトリを環境にクローンすることを確認してください。

    コードを試したり、インタラクティブな可視化オプションを使用することで、学習体験を大幅に向上させることができます。ですので、ぜひご覧ください。

    データの読み込みと準備

    まず最初に、トレーニングに必要なデジットデータがSageMakerからアクセス可能であることを確認します。Amazon S3を使用すると安全かつスケーラブルな方法でこれを行うことができます。ソースコードの詳細や、独自のデータに適応させるために自由に変更してください。

    sm_sess = sagemaker.session.Session(boto_session=boto_sess, sagemaker_client=sm)BUCKET = sm_sess.default_bucket()PREFIX = 'amt-visualize-demo's3_data_url = f's3://{BUCKET}/{PREFIX}/data'digits         = datasets.load_digits()digits_df      = pd.DataFrame(digits.data)digits_df['y'] = digits.targetdigits_df.to_csv('data/digits.csv', index=False)!aws s3 sync data/ {s3_data_url} —exclude '*' —include 'digits.csv'

    digits.csvファイルには特徴データとラベルが含まれています。各数字は8×8の画像中のピクセル値で表されます。以下の画像は数字4の場合のものです。 Digits Dataset from Scikit-learn

    トレーニングスクリプトとフレームワークの依存関係の準備

    データがS3バケットに格納されたので、PythonでScikit-learnをベースにしたカスタムトレーニングスクリプトを定義することができます。SageMakerでは、トレーニング時にPythonファイルを参照するだけで済むようになっています。Scikit-learnやpandasなどの依存関係は、次の2つの方法で指定できます:

    • requirements.txtファイルで明示的に指定することができます
    • SageMakerが提供するまたはカスタムビルドされたMLコンテナイメージにあらかじめインストールされていることがあります

    いずれのオプションも一般的な依存関係管理の方法と考えられており、既におなじみかもしれません。SageMakerは、PyTorch、TensorFlow、Scikit-learnなど、多くの人気のあるデータサイエンスおよびMLフレームワークを準備済みの管理された環境でサポートしています。追加のrequirements.txtファイルは使用していませんが、試しにいくつかのライブラリを追加してみてください。

    私たちの実装のコードにはfit()というメソッドが含まれており、数字認識タスクのための新しいクラシファイアを作成し、トレーニングします。最初の記事ではSageMakerの組み込みのXGBoostアルゴリズムを使用しましたが、今回はMLライブラリのScikit-learnが提供するRandomForestClassifierを使用しています。クラシファイアオブジェクトのfit()メソッドの呼び出しにより、CSVデータの80%のサブセットを使用したトレーニングプロセスが開始されます:

    def fit(train_dir, n_estimators, max_depth, min_samples_leaf, max_features, min_weight_fraction_leaf):        digits = pd.read_csv(Path(train_dir)/'digits.csv')        Xtrain, Xtest, ytrain, ytest = train_test_split(digits.iloc[:, :-1], digits.iloc[:, -1], test_size=.2)        m = RandomForestClassifier(n_estimators=n_estimators,                                max_depth=max_depth,                                min_samples_leaf=min_samples_leaf,                               max_features=max_features,                               min_weight_fraction_leaf=min_weight_fraction_leaf)    m.fit(Xtrain, ytrain)    predicted = m.predict(Xtest)    pre, rec, f1, _ = precision_recall_fscore_support(ytest, predicted, pos_label=1, average='weighted')        print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}')        return m

    完全なスクリプトは、GitHubのJupyterノートブックでご覧いただけます。

    完全なトレーニングプロセスのためにコンテナリソースを起動する前に、スクリプトを直接実行してみましたか?これは、コードに文法エラーがないかを迅速に確認し、データ構造のサイズが一致しているかなど、早期に他のエラーをチェックするのに役立つ良い習慣です。

    コードをローカルで実行する方法は2つあります。まず、ノートブックで直接実行することができます。これにより、Pythonデバッガを使用することもできます:

    # ノートブックからコードを実行する場合。Pythonデバッガpdbを使用することも可能です。ファイル train.py から fit('data', 100, 10, 1, 'auto', 0.01) を実行します。

    または、コマンドラインからトレーニングスクリプトを実行することもできます。これはコンテナ内で使用したい場合と同じ方法です。必要に応じて、さまざまなパラメータを設定したり、デフォルト値を上書きしたりすることもできます。たとえば:

    !cd src && python train.py --train ../data/ --model-dir /tmp/ --n-estimators 100

    出力として、目的の評価指標(精度、再現率、F1スコア)に基づいたモデルの最初の結果を見ることができます。たとえば、pre: 0.970 rec: 0.969 f1: 0.969です。

    非常に素早いトレーニングなので、悪くない結果ですね。しかし、これらの数値はどこから来たのでしょうか?何をすれば良いのでしょうか?

    カスタム目的関数の定義

    忘れずに、私たちの目標は、私たちのタスクに関連する目標メトリクスに基づいてモデルを完全にトレーニングしチューニングすることです。カスタムトレーニングスクリプトを使用しているため、SageMakerでこれらのメトリクスを明示的に定義する必要があります。

    スクリプトは、print関数を使用して、トレーニング中に精度、再現率、F1スコアなどのメトリクスを出力します:

    print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}')

    標準出力はSageMakerに取り込まれ、ログストリームとしてCloudWatchに送信されます。後でSageMaker AMTでこれらのメトリック値を取得し、それらと作業するために、出力を解析する方法に関する情報を提供する必要があります。これは、正規表現ステートメントを定義することによって実現できます(詳細については、Monitor and Analyze Training Jobs Using Amazon CloudWatch Metricsを参照してください):

    metric_definitions = [    {'Name': 'valid-precision',  'Regex': r'pre:\s+(-?[0-9\.]+)'},    {'Name': 'valid-recall',     'Regex': r'rec:\s+(-?[0-9\.]+)'},    {'Name': 'valid-f1',         'Regex': r'f1:\s+(-?[0-9\.]+)'}]

    先のコードの最初のメトリックの定義を一緒に見てみましょう。SageMakerは、pre:で始まり、1つ以上の空白文字が続き、抽出したい数値が続くログを探します。そのような値を見つけるたびに、それを名前がvalid-precisionのCloudWatchメトリックに変換します。

    Scikit-learnフレームワークを使用してモデルをトレーニングする

    トレーニングスクリプトtrain.pyを作成し、SageMakerがCloudWatchでメトリックを監視する方法を指示した後、SageMaker Estimatorオブジェクトを定義します。このオブジェクトは、指定したインスタンスタイプでトレーニングジョブを開始し、使用します。ただし、このインスタンスタイプは、Amazon SageMaker Studioのノートブックで実行しているものと異なる場合があります。なぜなら、SageMaker Studioは、ノートブックとは別のコンピュートインスタンスでトレーニング(および推論)ジョブを実行するためです。これにより、ジョブがバックグラウンドで実行される間、ノートブックで作業を続けることができます。

    framework_versionパラメータは、トレーニングジョブで使用するScikit-learnのバージョンを指定しています。また、estimatorにはimage_uriを渡すこともできます。事前に構築されたSageMakerのDockerイメージのいずれかが使用可能かどうかを確認し、そのまま使用するか、拡張機能と共に使用することができます。

    さらに、use_spot_instancesTrueに設定することで、EC2 Spot Instances上でSageMakerトレーニングジョブを実行することができます。これらは予備の容量インスタンスであり、コストを最大で90%節約できます。これらのインスタンスは、トレーニングジョブの実行時に柔軟性を提供します。

    estimator = SKLearn(    'train.py',    source_dir='src',    role=get_execution_role(),    instance_type= 'ml.m5.large',    instance_count=1,    framework_version='0.23-1',    metric_definitions=metric_definitions,    # Managed Spot Trainingを使用する場合、以下の3行をコメント解除します    # use_spot_instances= True,    # max_run=  60 * 60 * 24,    # max_wait= 60 * 60 * 24,    hyperparameters = {'n-estimators': 100,                       'max-depth': 10,                       'min-samples-leaf': 1,                       'max-features': 'auto',                       'min-weight-fraction-leaf': 0.1})

    Estimatorオブジェクトが設定された後、fit()関数を呼び出してトレーニングを開始します。トレーニングデータセットへのパスをAmazon S3上で指定します。これと同じ方法でバリデーションデータとテストデータも指定できます。トレーニング済みのモデルを後続のコードセルで使用するため、waitパラメータをTrueに設定します。

    estimator.fit({'train': s3_data_url}, wait=True)

    ハイパーパラメータの定義とチューニングジョブの実行

    これまで、1つのハイパーパラメータの値でモデルをトレーニングしましたが、それらの値は良かったのでしょうか?それとももっと良い値を探すことができるでしょうか?ハイパーパラメータチューナークラスを使用して、ハイパーパラメータ空間全体をシステマチックに探索してみましょう。チューナーでこの空間をどのように検索するのでしょうか?必要なパラメータは、最適化をガイドする目的のメトリック名と目的のタイプです。最適化戦略は、さらに検索空間を定義するための重要な引数です。次の4つの異なる戦略から選ぶことができます:

    • グリッドサーチ
    • ランダムサーチ
    • ベイズ最適化(デフォルト)
    • ハイパーバンド

    これらの戦略について詳しく説明し、後で選択するためのいくつかのガイダンスを提供します。

    チューナーオブジェクトを定義して実行する前に、アーキテクチャの観点から理解を再確認しましょう。SageMaker AMTのアーキテクチャの概要については、前回の記事で説明し、以下に一部を再掲します。

    Amazon SageMaker Automatic Model Tuning Architecture

    チューニングしたいハイパーパラメータと固定したいハイパーパラメータを選択することができます。動的ハイパーパラメータの場合、最適化に使用できるhyperparameter_rangesを提供します。ランダムフォレスト分類器を使用しているため、Scikit-learn Random Forestのドキュメントからハイパーパラメータを利用しています。

    また、チューナーが使用できるトレーニングジョブの最大数と並列トレーニングジョブの最大数でリソースを制限します。これらの制限が、さまざまな戦略の結果を比較するのにどのように役立つかを見ていきます。

    tuner_parameters = {    'estimator': estimator,    'base_tuning_job_name': 'random',    'metric_definitions': metric_definitions,    'objective_metric_name': 'valid-f1',    'objective_type': 'Maximize',    'hyperparameter_ranges': hpt_ranges,    'strategy': 'Random',    'max_jobs': n, # 50    'max_parallel_jobs': k # 2    } 

    Estimatorの fit 関数と同様に、チューニングジョブを開始するためには、tunerの fit を呼び出します:

    random_tuner = HyperparameterTuner(**tuner_parameters)random_tuner.fit({'train': s3_data_url}, wait=False)

    これだけで、SageMakerにバックグラウンドでトレーニングジョブ( n=50)を実行させることができます。各ジョブは異なるハイパーパラメータの組み合わせを使用します。詳細な結果はこの記事の後で確認します。しかし、その前に、ベイジアン最適化戦略を適用した別のチューニングジョブを開始しましょう。両方の戦略を完了した後で、視覚的に比較します。

    tuner_parameters['strategy']             = 'Bayesian'tuner_parameters['base_tuning_job_name'] = 'bayesian'bayesian_tuner = HyperparameterTuner(**tuner_parameters)bayesian_tuner.fit({'train': s3_data_url}, wait=False)

    注意すべきなのは、SageMakerは必要な計算インスタンスを独立にオーケストレーションするため、両方のチューニングジョブを並列で実行できることです。これは、異なるアプローチを同時に試みるプラクティショナーにとって非常に便利です。

    SageMakerのHPO戦略を選択する

    HPO戦略には、SageMaker AMTでいくつかのオプションがあります。グリッドサーチ、ランダムサーチ、ベイジアン最適化、Hyperbandという戦略があり、これらの戦略は、自動チューニングアルゴリズムが指定されたハイパーパラメータの範囲をどのように探索するかを決定します。

    ランダムサーチは非常にシンプルです。指定された範囲の値の組み合わせをランダムに選択し、順次または並列で実行します。まるで目隠しでダーツを投げて目標に当てるようなものです。私たちはこの戦略で開始しましたが、別の戦略にすることで結果は改善するでしょうか?

    ベイジアン最適化は、ランダムサーチとは異なるアプローチを取ります。過去の選択結果を考慮し、最良の結果をもたらす可能性が高い値を選択します。前回の探索結果から学習したい場合は、前のチューニングジョブの後に新しいチューニングジョブを実行することでしか実現できません。これによって、ベイジアン最適化は以前の実行結果に依存します。しかし、並列化の可能性が高いHPO戦略は何でしょうか?

    Hyperband は興味深い戦略です!マルチファイデリティ戦略を使用しており、有望なトレーニングジョブにリソースを動的に割り当て、パフォーマンスが低いジョブを停止します。したがって、Hyperbandはリソースを効率的に使用し、前のトレーニングジョブから学習します。パフォーマンスの低い構成を停止した後、新しい構成が開始され、その値がランダムに選択されます。

    モデルのニーズや性質に応じて、ランダムサーチ、ベイジアン最適化、またはHyperbandのどれかをチューニング戦略として選択することができます。それぞれが独自のアプローチと利点を持っているため、MLの探索に最適なものを検討することが重要です。MLプラクティショナーにとっての良いニュースは、各試行が目的メトリックに対してどのような影響を与えるかを視覚的に比較することで、最適なHPO戦略を選択できるということです。次のセクションでは、異なる戦略の影響を視覚的に確認する方法を見ていきます。

    チューニング結果の可視化、分析、および比較

    チューニングジョブが完了すると、エキサイティングな時がやってきます。どのような結果が得られるのでしょうか?ベースモデルに比べて、メトリックの面でどの程度の向上が期待できるのでしょうか?利用ケースにおいて最もパフォーマンスの良いハイパーパラメータの組み合わせは何でしょうか?

    HPOの結果を簡単に表示する方法は、SageMakerコンソールを訪れることです。 Hyperparameter tuning jobs の下に、目的メトリック( valid-f1 )によって測定された最良のパフォーマンスを提供したハイパーパラメータの値の組み合わせが、各チューニングジョブごとに表示されます。

    Hyperparameter tuning jobsのメトリック

    それだけが必要なことでしょうか?MLプラクティショナーとしては、それらの値に興味があるだけでなく、モデルの内部動作についてさらに理解を深め、その可能性を最大限に引き出し、経験的なフィードバックによって直感を強化したいと思うことでしょう。

    良い可視化ツールは、HPOによる改善を時間の経過とともに理解するのに大いに役立ちます。各個別のハイパーパラメータが目的メトリックに与える影響を示し、チューニング結果をさらに最適化するためのガイダンスを提供します。

    私たちはamtvizカスタムビジュアライゼーションパッケージを使用してチューニングジョブを視覚化および分析します。それは使いやすく、有益な機能を提供します。いくつかの個別のチャートを解釈することによって、その恩恵を実証し、最終的にランダムサーチとベイジアン最適化を並べて比較します。

    まず、ランダムサーチの視覚化を作成しましょう。これは、amtvizからvisualize_tuning_job()を呼び出し、最初のチューナーオブジェクトを引数として渡すことで行えます:

    from amtviz import visualize_tuning_jobvisualize_tuning_job(random_tuner, advanced=True, trials_only=True)

    いくつかのチャートが表示されますが、まずはステップバイステップで進めましょう。出力から最初の散布図は以下のように見え、どのテーブルでも認識できないいくつかの視覚的な手掛かりを提供しています。

    ハイパーパラメータ最適化ジョブ結果

    各点は、その開始時間(x軸)に基づいて特定のハイパーパラメータセットによって生成された、個々のトレーニングジョブのパフォーマンス(y軸の目的関数valid-f1)を表しています。したがって、チューニングジョブの期間にわたるモデルのパフォーマンスの進行を見ることができます。

    点線はこれまでに見つかった最良の結果を強調し、時間の経過とともに改善を示しています。最も優れた2つのトレーニングジョブのF1スコアは約0.91でした。

    累積進行状況を示す点線以外に、チャートで傾向を見ることができますか?

    おそらく見えないかもしれません。これは予想されることです。なぜなら、ランダムHPO戦略の結果を表示しているからです。各トレーニングジョブは異なるがランダムに選択されたハイパーパラメータセットを使用して実行されました。チューニングジョブを継続した場合(または同じ設定で別のジョブを実行した場合)、時間の経過とともにより良い結果が得られる可能性がありますが、確実ではありません。ランダム性は厄介なものです。

    次のチャートは、ハイパーパラメータが全体のパフォーマンスに与える影響を評価するのに役立ちます。すべてのハイパーパラメータが視覚化されていますが、簡潔さのために、n-estimatorsmax-depthの2つに焦点を当てます。

    ハイパーパラメータジョブの詳細

    最も優れた2つのトレーニングジョブは、それぞれ約20と80のn-estimators、および約10と18のmax-depthを使用していました。各ドット(トレーニングジョブ)には正確なハイパーパラメータの値がツールチップで表示されています。これらの値はすべてのチャートで動的にハイライトされ、多次元のビューを提供します!それを見ましたか?各ハイパーパラメータは、目的メトリックに対して、別々のチャートとしてプロットされています。

    では、n-estimatorsについてどのような洞察を得られますか?

    左のチャートに基づいて、非常に低い値の範囲(10未満)は、高い値と比べてより多くの不良結果をもたらすことが多いようです。したがって、より高い値はモデルのパフォーマンスを向上させるのに役立つかもしれません—興味深いです。

    一方、max-depthハイパーパラメータと目的メトリックの相関はかなり低いです。一般的な観点からは、どの値の範囲がより良いパフォーマンスを発揮しているかは明確ではありません。

    要約すると、ランダムサーチは比較的短い時間で適切なハイパーパラメータセットを見つけるのに役立ちます。また、良い解に偏りませんが、探索空間のバランスの取れたビューを提供します。ただし、リソースの利用効率はあまり高くありません。既知の不良結果をもたらす値の範囲でトレーニングジョブを継続して実行し続けます。

    次に、ベイジアン最適化を使用した2番目のチューニングジョブの結果を検証しましょう。ランダムサーチチューナと同様に、amtvizを使用して結果を視覚化することができます。または、さらに良い方法として、両方のチューニングジョブを1つのチャートセットで比較するための機能を使用できます。非常に便利です!

    visualize_tuning_job([random_tuner, bayesian_tuner], advanced=True, trials_only=True)
    ハイパーパラメータ最適化ジョブ Bayesian VS Random

    今回は、ランダムサーチ(オレンジの点)とベイジアン最適化(青の点)の全トレーニングジョブの結果を可視化しているため、点が増えています。右側には、すべてのF1スコアの分布を可視化した密度チャートが表示されています。多数のトレーニングジョブがF1スケールの上部(0.6以上)で結果を達成しています。これは良い結果です!

    ここからの重要なポイントは何でしょうか?散布図は、ベイジアン最適化の利点を明確に示しています。過去の実行から学習できるため、時間とともにより良い結果をもたらします。そのため、同じ数のトレーニングジョブを使用した場合、ベイジアンを使用した結果はランダムに比べて大幅に改善されました(0.967対0.919)。

    amtvizでは、さらに多くのことができます。詳細に見ていきましょう。

    SageMaker AMTにチューニングのための大量のジョブ実行を指示すると、一度に多くの試行を表示すると混乱することがあります。そのため、これらのチャートをインタラクティブにしています。各ハイパーパラメータの散布図をクリックしてドラッグすることで、特定の値範囲にズームインし、結果の視覚的解釈を洗練させることができます。他のすべてのチャートも自動的に更新されます。これは非常に役立つ機能ですね。次のチャートは例ですので、ノートブックで実際に試してみてください。

    ハイパーパラメータ最適化ジョブの可視化機能

    最大効果を追求する調整マニアとして、さらなるハイパーパラメータチューニングジョブの実行によりモデルのパフォーマンスをさらに向上させることができるかもしれません。ただし、この場合は、すでに改善された結果が期待できる範囲のハイパーパラメータ値を探索することができます。たとえば、チャートに示されているように、n-estimatorsの値が100から200の範囲に焦点を当てることができます。これにより、AMTは最も有望なトレーニングジョブに集中し、調整の効率を高めることができます。

    要約すると、amtvizは、モデルのハイパーパラメータがパフォーマンスに与える影響をより深く理解し、調整活動でより賢い判断をするための豊富な可視化機能を提供します。

    ハイパーパラメータスペースの探索とウォームスタートHPOジョブの継続

    SageMaker AMTは、効率的にハイパーパラメータの探索空間を探索するのに役立ちます。しかし、結果を繰り返し改善するために複数のチューニングラウンドが必要な場合はどうでしょうか?最初に述べたように、最適化のフィードバックサイクル、つまりモデルとの「会話」を構築したいと考えています。毎回最初から始めなければなりませんか?

    ウォームスタートハイパーパラメータチューニングジョブの概念について見てみましょう。これは、前回のHPO実行で学んだ内容を再利用して新しいチューニングジョブを開始するものです。これにより、チューニングの時間とコンピューティングリソースをより効率的に使用できます。前の結果をさらに繰り返し改善することができます。ウォームスタートを使用するためには、WarmStartConfigを作成し、warm_start_typeIDENTICAL_DATA_AND_ALGORITHMと指定します。これは、ハイパーパラメータの値は変更するが、データやアルゴリズムは変更しないことを意味します。新しいチューニングジョブに前の知識を伝えるようAMTに指示します。

    前のベイジアン最適化とランダムサーチのチューニングジョブをparentsとして参照することで、両方をウォームスタートに使用できます:

    warm_start_config = WarmStartConfig(warm_start_type=WarmStartTypes.IDENTICAL_DATA_AND_ALGORITHM,                                    parents=[bayesian_tuner_name, random_tuner_name])tuner_parameters['warm_start_config'] =  warm_start_config

    ウォームスタートを使用する利点を確認するには、次のチャートを参照してください。これらは、前回と同様にamtvizによって生成されたもので、今回はウォームスタートに基づいて別のチューニングジョブが追加されています。

    ハイパーパラメータ最適化ジョブウォームスタート

    左のチャートでは、新しいチューニングジョブが主に性能指標グラフの右上隅に存在することが観察されます(オレンジでマークされたドットを参照)。ウォームスタートは前の結果を再利用しているため、これらのデータポイントはF1スコアの上位結果に存在しています。この改善は右側の密度チャートにも反映されています。

    言い換えれば、AMTは以前のトライアルからの知識に基づいて有望なハイパーパラメータ値のセットを自動的に選択します。これは次のチャートで示されています。たとえば、アルゴリズムはF1スコアの低い値を持つn-estimatorsに対して頻繁にテストを行わないでしょう。ウォームスタートのおかげで、そのようなリソースの無駄遣いはありません。

    ハイパーパラメータ最適化可視化されたジョブ

    クリーンアップ

    HPOの実験が完了したら、不要なコストが発生しないように、S3バケット内のamt-visualize-demoというプレフィックスを持つすべてのファイルを削除し、またSageMaker Studioリソースをシャットダウンする必要があります。

    次のコードをノートブックで実行して、この投稿からすべてのS3ファイルを削除します:

    !aws s3 rm s3://{BUCKET}/amt-visualize-demo --recursive

    データセットやモデルアーティファクトを保持したい場合は、コード中のプレフィックスをamt-visualize-demo/dataに変更してデータのみを削除するか、モデルアーティファクトのみを削除するためにamt-visualize-demo/outputに変更できます。

    結論

    MLソリューションの構築のアートには、ハイパーパラメータの探索と最適化が関与しています。これらのノブとレバーの調整は要求されますが、トレーニング時間の短縮、モデルの精度向上、および全体的な優れたMLソリューションにつながる報酬のあるプロセスです。SageMaker AMTの機能は、複数のチューニングジョブを実行し、ウォームスタートを行い、さらなるレビューやビジュアル比較、分析のためのデータポイントを提供します。

    この投稿では、SageMaker AMTで使用するHPO戦略について説明しました。ランダムサーチから始めて、ハイパーパラメータを検索空間からランダムにサンプリングするシンプルで効果的な戦略を比較しました。次に、確率モデルを使用して最適なハイパーパラメータを探索するベイジアン最適化の結果と比較しました。初期トライアルを通じて適切なHPO戦略と優れたハイパーパラメータの値範囲を特定した後、ウォームスタートを使用して将来のHPOジョブを効率的に実行する方法を示しました。

    定量的な結果の比較を通じてハイパーパラメータの探索空間を探索することができます。横並びの視覚的比較を提案し、対話型探索のための必要なパッケージも提供しました。ハイパーパラメータの調整の旅でどれくらい役立ったか、コメントでお知らせください!

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

Microsoft BingはNVIDIA Tritonを使用して広告配信を高速化

Jiusheng Chen氏のチームは加速しました。 彼らは、NVIDIA Triton Inference ServerをNVIDIA A100 Tensor Core GPUで実行する...

機械学習

このAIニュースレターは、あなたが必要とするすべてです#62

今週は、METAのコーディングモデルの開発とOpenAIの新しいファインチューニング機能の進展を見てきましたMetaは、Code LLaMA...

人工知能

「製造業におけるAIの10の注目すべきユースケース」

現代製造業の急速な進化の中で、人工知能(AI)の導入が類を見ない革命を引き起こしました。本記事では、製造業におけるAIの...

機械学習

「Azure Lightweight Generative AI Landing Zone」

「Azure AI サービスに基づくランディングゾーンの構築に関する完全ガイドでは、AI プロダクトを紹介し、AI の活用により利益...

機械学習

「さまざまな深層学習を用いた天気予測モデルに関する研究」

気象予測の世界的な影響を考慮して、様々な研究コミュニティの研究者の関心を引いてきました。最近のディープラーニング技術...

AIニュース

「AIがバービーの画像を作成し、人種差別の批判を受ける」

近日、バービーの映画に関する話題の中で、異なる国を表すAI生成のバービーの画像がインターネット上で話題となっています。...