Amazon Web Services ブログ

アクティブラーニングで Amazon SageMaker ラベリングワークフロー用の独自のモデルを持ち込む

Amazon SageMaker Ground Truth を使うと、正確にラベル付けされた機械学習 (ML) データセットを簡単に低価格で構築することができます。ラベル付けコストを削減するために、SageMaker Ground Truth はアクティブラーニングを使用して、ラベル付けが難しいデータオブジェクト (画像やドキュメントなど) と簡単なものを区別します。難しいデータオブジェクトは人間の労働者に送信して注釈を付け、簡単なデータオブジェクトは自動的に機械学習でラベル付けします (自動化されたラベル付けまたは自動ラベリング)。

SageMaker Ground Truth の自動ラベリング機能は、事前定義された Amazon SageMaker アルゴリズムを使用してデータにラベルを付け、サポートされている SageMaker Ground Truth 組み込みタスクタイプの 1 つを使用してラベリングジョブを作成する場合にのみ使用できます。

このブログ記事を使って、独自のアルゴリズムでアクティブラーニングワークフローを作成し、そのワークフローでトレーニングと推論を実行します。この例は、カスタムラベル付けジョブでアクティブラーニングと自動注釈を実行するための出発点として使用できます。

この記事には 2 つの部分があります。

  • パート 1 では、Amazon SageMaker 組み込みアルゴリズムの BlazingText を使用してアクティブラーニングワークフローを作成する方法を示します。
  • パート 2 では、BlazingText アルゴリズムをカスタム ML モデルに置き換えます。

これらのパートで使用するコードを実行およびカスタマイズするには、ノートブックインスタンスの SageMaker Examples セクションにあるノートブック bring_your_own_model_for_sagemaker_labeling_workflows_with_active_learning.ipynb(ノートブック) を使用します。このコードはさらにカスタマイズできます。たとえば、この GitHub リポジトリsrc ディレクトリにあるコードを使用して、ランダムな選択とは異なるアクティブラーニングロジックを使用できます。

この記事では、UCI ニュースデータセットを使用したカスタムアクティブラーニングワークフローについて説明します。このデータセットには、ビジネス (b)、科学とテクノロジー (t)、エンターテインメント (e)、健康と医薬 (m) の 4 つのカテゴリのいずれかに分類される約 420,000 の記事のリストが含まれています。

ソリューションの概要

このソリューションでは、AWS Step Functions を使用して、テキスト分類ラベル付けジョブのアクティブラーニングワークフローを作成します。Step Functions サービスは、分散アプリケーションを管理する簡単な方法を提供します。

次の図は、このソリューションのアクティブラーニングループロジックの概要を示しています。

GitHub の次の Python モジュールは、上記の高レベルの手順に対応しています。

  • 「入力マニフェストの分析と処理」は、Bootstrap で指定されています。
  • 「アクティブラーニングを開始するのに十分なラベル付きデータがありますか?」は、MetaData で指定されています。
  • CreateLabelingJob で人間のラベルデータを保持」は、Labeling で指定されています。
  • 「ラベル付きデータをマニフェストに追加する」および「すべてのラベル付きデータを出力マニフェストにエクスポートする」は、Output で指定されています。
  • 「完了のチェック」以外の残りのステップは、ActiveLearning で指定されています。
  • 「完了のチェック」は Python モジュールに属しておらず、Step Function で直接指定されています。

アクティブラーニングワークフローには、次のステップが含まれています。

  1. 入力マニフェストを分析して、すでにラベル付けされているデータオブジェクトの数 (カウント) を決定します。アクティブラーニングループを開始するには、データの少なくとも 20% にラベルを付ける必要があります。
    • すべてのデータにラベルが付けられている場合は、現在のマニフェストを最終的な出力マニフェストとしてコピーします。
    • ラベルが付けられているデータが 20% 未満の場合は、データの 20% を人間に送信して、CreateLabelingJob を使用してラベル付けします。
  2. モデルをトレーニングするのに十分なデータがある場合は、アクティブラーニングループを開始します。
    • 変換ジョブの結果からラベル推測の信頼性が最も高いデータに自動的にラベル付けします。
    • CreateLabelingJob を呼び出して、人間に、ラベル付けされていない低い推論信頼度のデータオブジェクトのサブセットにラベル付けしてもらいます。
  3. ループを繰り返します。

前提条件とセットアップ

この記事を使用してカスタムアクティブラーニングワークフローを作成するには、次の前提条件を完了する必要があります。

  • AWS アカウントを作成します。
  • このチュートリアルを完了するために必要な権限を持つ IAM ロールを作成します。IAM ロールには、次の AWS 管理ポリシーがアタッチされている必要があります。
    • IAMFullAccess
    • CloudWatchFullAccess
    • AWSLambdaFullAccess
    • AWSStepFunctionsFullAccess
    • AmazonSageMakerFullAccess
    • AWSCloudFormationFullAccess
  • Amazon SageMaker の ラベル付けトレーニングバッチ変換AWS CloudFormation、および Step Functions に関する知識。

さらに、ノートブックを使用するには、Amazon SageMaker Jupyter ノートブックインスタンスが必要です。新しい Amazon SageMaker Jupyter Notebook インスタンスの作成方法については、「ノートブックインスタンスの作成」を参照してください。AmazonSageMakerFullAccess IAM ポリシーがアタッチされた IAM ロールを使用して、ノートブックインスタンスを作成します。

ノートブックインスタンスを起動したら、インスタンスの SageMaker の例Ground Truth Labeling Jobs セクションで bring_your_own_model_for_sagemaker_labeling_workflows_with_active_learning.ipynb を探します。Amazon SageMaker サンプルノートブックを見つける方法については、「サンプルノートブックの使用」を参照してください。

CloudFormation スタックの起動

最初のステップは、CloudFormation スタックを起動することです。これにより、アクティブラーニングワークフローを作成するために必要なリソースが AWS Lambda、Step Functions、および IAM に作成されます。

下の [Launch Stack] ボタンを使用して、CloudFormation コンソールの AWS リージョン us-east-1 でスタックを起動できます。別の AWS リージョンでスタックを起動するには、GitHub リポジトリの README にある手順を使用します。

この CloudFormation スタックは、AWS Step Functions で 2 つのステートマシンを生成します。ActiveLearning-*ActiveLearningLoop-* です (*は CloudFormation スタックを起動するときに使用した名前です)。

コスト

このチュートリアルのパート 1 とパート 2 を Amazon SageMaker Jupyter Notebook インスタンスで実行すると、次のコストが発生します。

  • Amazon SageMaker Ground Truth で人間によるデータのラベリングコスト。これは、用いるワークフォースのタイプによって異なります。SageMaker Ground Truth を初めて使用する場合は、プライベートワークフォースを使用して、自分自身をワーカーとして含めて、ラベル付けジョブの設定をテストすることをお勧めします。コストの詳細については、https://aws.amazon.com/sagemaker/groundtruth/pricing/ を参照してください。
  • Amazon SageMaker でのトレーニングと推論のコスト。このコストは、使用するアルゴリズムのタイプによって異なります。Amazon SageMaker の料金の詳細については、https://aws.amazon.com/sagemaker/pricing/ をご覧ください。
  • Amazon SageMaker Jupyter ノートブックの EC2 コスト。https://aws.amazon.com/sagemaker/pricing/instance-types/ を参照して、作成するノートブックインスタンスのタイプで発生するコストをご確認ください。
  • AWS Lambda と Step Function のコスト。提供される CloudFormation テンプレートを使用して作成するアクティブラーニングワークフローは、AWS Lambda と Step Functions を使用します。
  • S3 のストレージコスト。S3 の料金の詳細については、https://aws.amazon.com/s3/pricing/ をご覧ください。

パート 1: BlazingText を使用したアクティブラーニングワークフローの作成

Amazon SageMaker Jupyter ノートブックインスタンスでノートブックのパート 1 を使用して、アクティブラーニングワークフローに必要なリソースを作成します。具体的には、次のことを行います。

  • データを消去し、入力マニフェストファイルを作成します。
  • ラベル付けジョブの作成に必要なリソースを作成します。たとえば、ラベルのカテゴリとワーカータスクテンプレートを指定して、ワーカー UI を生成します。

これらのリソースを使用して、ラベル付けジョブリクエストを (JSON 形式で) 設定します。パート 1 の最後に、この JSON をコピーして、CreateLabelingJob を呼び出す Step Function に貼り付けます。

入力マニフェストの作成とジョブリソースのラベル付け

マニフェストファイルを作成するには、次の手順を実行します。

  1. Amazon SageMaker ノートブックインスタンスでノートブックを開きます。
  2. Amazon SageMaker の環境を設定します。次のコードは、データのセッション、ロール、リージョン、S3 バケットを定義します。
    sess = sagemaker.Session()
    role = get_execution_role()
    region = sess.boto_session.region_name
    bucket = sess.default_bucket(); key='sagemaker'
  3. UCI News Dataset データセットをダウンロードして解凍します。このチュートリアルでは、ファイル newsCorpora.csv を使用し、そのファイルからランダムに 10,000 件の記事を選択してデータセットを作成します。各記事は、入力マニフェストファイルの 1 行に対応しています。
  4. データセットを消去して、10,000 件の記事のサブセットを作成します。
  5. データセットを news_subset.csv に保存します。

このファイルを使用して、入力マニフェストファイルを作成します。アクティブラーニングループを開始するには、データの 20% にラベルを付ける必要があります。アクティブラーニングコンポーネントをすばやくテストするために、この記事には、入力マニフェストのデータセットで提供されている元のラベルの 20% が含まれています。

この部分的にラベル付けされたデータセットをアクティブラーニングループへの入力データとして使用します。このチュートリアルでは、アクティブラーニングを使用して残りのラベルを生成する方法を示します。

ノートブックの残りの部分では、ラベリングジョブ設定を作成するために必要なリソースを指定します。この中には以下のものが含まれています。

  • S3 バケットに保存されたラベルカテゴリ JSON ファイル。
  • ワーカー UI を作成するためのワーカータスクテンプレート。
  • 作業チーム ARN。これをカスタマイズして、パブリック (Amazon Mechanical Turk)、プライベート、またはベンダーの作業チームを使用できます。プライベートワークフォースを使用するには、USE_PRIVATE_WORKFORCETrue に設定します。
  • Lambda 関数の前後の ARN。
  • ワーカーがタスクを見つけて完了するのに役立つタスクのタイトル、説明、およびキーワード。

これらのリソースは、your human_task_config JSON で使用します。

  1. 次のコードで JSON を生成します。
    print(json.dumps(ground_truth_request, indent=2))
  2. 結果をコピーします。これを使用して、Step Functions でアクティブラーニングワークフローを開始します。

アクティブラーニングワークフローを開始する

ノートブックを使用してラベリングジョブリクエストを設定する JSON を生成したら、それを使用してアクティブラーニングワークフローを開始できます。CloudFormation スタックは、Amazon SageMaker BlazingText アルゴリズムをデフォルトで使用するように構築されています。

BlazingText でアクティブラーニングワークフローを開始するには、次の手順を実行します。

  1. AWS Step Functions コンソールで、[State Machines] を選択します。ステートマシン ActiveLearningLoop-* を選択します。「*」は CloudFormation スタックを起動したときに使用した名前です。
  2. 必要に応じて、アクティブラーニングワークフローに実行名を付けます。
  3. ノートブックからコピーした JSON を Input – optional コードブロックに貼り付けます。
  4. [Start execution] を選択します。

アクティブラーニングワークフローのモニタリング

データの 20% にラベルを付けて開始したため、アクティブラーニングワークフローが開始されます。ワークフローの進行状況をモニタリングするには、次の手順を実行します。

  1. AWS Step Functions コンソールで、[State Machines] を選択します。
  2. ステートマシン ActiveLearningLoop-* を選択します。

[Executions] セクションには、アクティブラーニングワークフローとそのステータスのリストがあります。

  1. ワークフローの状態を表示するには、リストからワークフローを選択します。

ステータスは、[Visual workflow] セクションでモニタリングできます。

データのラベル付けが完了すると、ラベル付けされたデータが S3 バケットの出力マニフェストファイルに書き込まれます。次の図は、アクティブラーニングワークフローの様子を示しています。

すべてのデータにラベルが付けられたら、すべてのラベルが S3 バケットの出力マニフェストファイルにエクスポートされます。次の図は、完全なアクティブラーニングワークフローの様子を示しています。

 

パート 2: カスタムモデルを作成してアクティブラーニングワークフローに統合する

パート 2 では、独自のカスタムトレーニングと推論アルゴリズムを、開発したアクティブラーニングワークフローに組み込む方法を示します。

このセクションでは、Keras のディープラーニングモデルを使用して、アクティブラーニングワークフローにカスタムモデルを追加します。Amazon SageMaker Jupyter ノートブックの UCI データセットから 1,000 データポイントを使用してモデルをトレーニングします。このモデルは、このデモで使用することのみを目的としており、このチュートリアルの残りの部分では、トレーニングと推論アルゴリズムのみを使用します。

このセクションを完了するには、ノートブックのパート 2 を使用してください。

このセクションでは、次の手順を実行したことを前提としています。

  • この記事の前提条件を完了していること。
  • 提供されている CloudFormation スタックを起動すること。
  • この記事のパート 1 のセクション「入力マニフェストの作成とジョブリソースのラベル付け」を完了すること。

モデルの開発とコンテナ化

この記事のモデルを開発してコンテナ化する方法は、カスタム TensorFlow Docker コンテナを使用して ML モデルを構築、トレーニング、デプロイすることに関する次の GitHub リポジトリに触発されました。

ノートブックを使用して、次のことができます。

  • データセットを読み取り、クリーンアップします。
  • Keras Tokenizer クラスを使用してデータオブジェクトをトークン化します。
  • データセットをトークン化した後、それを使用してモデルをトレーニングできます。Keras ディープラーニングモデルをトレーニングしました。
  • モデルを Docker コンテナにコンテナ化します。
  • コンテナを ECR に追加します。Amazon SageMaker は、アクティブラーニングワークフロー中にトレーニングと推論のためにこの画像を取得します。

ノートブックの最後のコードセルは、Docker イメージの ECR ID を印刷します。Amazon SageMaker 全体のトレーニングと推論に使用できます。

コンテナをアクティブラーニングワークフローに持ち込む。

アルゴリズムが基準を満たしていることを確認したら、このセクションを使用して、パート 1 で使用した BlazingText アルゴリズムをアクティブラーニングワークフローのカスタム ML モデルに置き換えます。

ステップ 1: コンテナ ECR 参照を更新する

コンテナ ECR 参照を更新するには、以下の手順を実行します。

  1. AWS Lambda コンソールで、*-PrepareForTraining-<###> という名前の Lambda 関数を探します。*は CloudFormation スタックを起動したときに使用した名前で、-<###> は文字と数字のリストです。
  2. 次のコードのような既存のアルゴリズム仕様を特定します。
    # from pick the algorithm used for training.
    @property
    def algorithm_specification(self):
    """
    configure the docker container uri for the training algorithm.
    """
    return {
    # This assumes we are running in us-east-1 (IAD).
    # Refer to this doc to tweak this model if you run it in other regions.
    #https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-#docker-registry-paths.html
    
    "TrainingImage": "811284229777.dkr.ecr.us-east-1.amazonaws.com/blazingtext:latest" 
    "TrainingInputMode":"Pipe"
    }
    
  3. 811284229777.dkr.ecr.us-east-1.amazonaws.com/blazingtext:latest からの TrainingImage をノートブックの最後の印刷ステートメントの出力に置き換えます。

ステップ 2: バッチ戦略を変更する

CreateTransformJob は、MultiRecordSingleRecord の 2 つのバッチ戦略をサポートしています。詳細については、「CreateTransformJob」を参照してください。Amazon SageMaker BlazingText アルゴリズムは MultiRecord をサポートしていますが、このチュートリアルで使用されている Keras コンテナは SingleRecord をサポートしています。バッチ戦略を変更するには、次の手順を実行します。

バッチ戦略を変更するには:

  1. AWS Step Functions コンソールで、[State Machines] を選択します。
  2. ActiveLearning-*」の近くのラジオボタンを選択します。
  3. [Edit] を選択します。
  4. バッチ変換ジョブの呼び出しを担当する CreateTransformJob 状態を探します。次のコードを参照してください。
            "CreateTransformJob": {    
    "Type": "Task",
    "Resource": "arn:aws:states:::sagemaker:createTransformJob.sync",
         	 		"Parameters": {
                             "BatchStrategy": "MultiRecord"
    		...
  5. MultiRecordSingleRecord に置き換えます。
  6. [Save] を選択します。

次のスクリーンショットは、この編集を行った後のステートマシンコンソールの外観を示しています。

これらの手順の後、パート 1 の手順を繰り返して、アクティブラーニングワークフローを開始します。具体的には、[Start an Active Learning Workflow] セクションを使用してアクティブラーニングワークフローを開始する必要があります。

ステートマシンが正常に完了した後、カスタムトレーニングおよび推論アルゴリズムを使用して、マシンと人間の両方のラベルを使用してラベル付きデータを生成しました。

クリーンアップ

将来請求が発生しないようにするには、チュートリアルに使用されているノートブックインスタンスを停止して削除します。

また、Amazon SageMaker コンソールで、このチュートリアルの実行中に作成された、トレーニング (Training セクション)、変換 (Inference セクション)、またはラベリング (Ground Truth セクション) ジョブを停止します。

結果

この記事のパート 1 では、データの 52% が人間によってラベル付けされ、48% が自動ラベリングされました。これらのパーセンテージは、使用する特定のトレーニングアルゴリズム、推論アルゴリズム、アクティブラーニングロジックに左右されます。独自のアクティブラーニングワークフローを実装する場合、これらの数値は、使用するアルゴリズムとアクティブラーニングロジック、および必要なラベルの精度のレベルによって異なる場合があります。

独自のモデルをアクティブラーニングワークフローに取り込むと、より良い結果 (自動ラベル付けされるデータの割合が高くなる) のために、モデルのトレーニングに使用されるラベル付けされたデータにノイズが存在しても、モデルが期待どおりに動作し続けるようにします。

まとめ

この記事では、アクティブラーニングワークフローを作成し、それを使用して ML モデルの推論と人間のワーカーの両方から高品質のラベルを作成しました。

このワークフローをさまざまなカスタムラベル付けタスクに使用して、大規模なデータセットのラベル付けのコストを削減できます。任意のカスタム学習アルゴリズムとアクティブラーニングロジックを持ち込み、この例をニーズに合わせて変更できます。Blazing Text を使用してアクティブラーニングワークフローを開始してプレビューするには、クラウド形成スタックを起動してパート 1 を完了します。


著者について

Koushik Kalyanaraman は、SageMaker Ground Truth チームのソフトウェア開発エンジニアです。余暇には、自分でボードゲームを開発することを志しています。

 

 

 

Andrea Morandi は、ストラテジックスペシャリストチームの AI/ML スペシャリストソリューションアーキテクトです。彼は、お客様が AWS で ML アプリケーションを提供および最適化するのを助けています。Andrea は、ボローニャ大学 (イタリア) の天体物理学で博士号を取得しています。妻とベイエリアに住んでおり、余暇にはハイキングをするのが好きです。

 

 

 

Talia Chopra は、機械学習と人工知能を専門とする AWS のテクニカルライターです。彼女は AWS の複数のチームと協力して、Amazon SageMaker、MxNet、AutoGluon を使用しているお客様向けの技術ドキュメントとチュートリアルを作成しました。余暇には、瞑想や自然の中の散歩を楽しんでいます。