Amazon Web Services ブログ
Amazon SageMaker Ground Truth を使いワーカーのラベル付け効率を確認する
トレーニングデータセットのクリーンさと精度は、機械学習 (ML) が成功するかどうかの重要な要因です。間違ってラベル付けされたデータまたは不正確なデータを使用したトレーニングでは、モデルのパフォーマンスを低下させる可能性があります。では、データのラベリングを行うチームが正確に実施しているかどうかを簡単に判断するにはどうすればよいのでしょうか?
1 度に 1 人のワーカーの結果を手動で選別し、精度の高いデータを集計する方法があります。これよりも良い方法は自動化で、より迅速で正確な結果を得ることができます。
この投稿は、Amazon SageMaker Ground Truth を使用して、人間が行う作業の精度を分析する方法に焦点を当てています。Ground Truth でラベリングジョブを設定して送信し、そこから注釈を作成した作業者の精度を分析します。
この投稿は、Mechanical Turk (MTurk) ワーカータイプを使用して Amazon SageMaker でテキスト分類ラベリングジョブを実行し、その後にラベルの品質を確認する方法を学びたい方を対象としています。この投稿にはプロセスの各ステップを実行するチュートリアルがあるので、ML/AI または Amazon SageMaker の予備知識は必要ありません。
ユースケース
センテンスが人物、動物、または植物を参照しているかどうかを予測できるモデルを作成することを目指します。各例でモデルをトレーニングできますが、その前に、MTurk の作業者はトレーニングデータに正しく注釈を付ける必要があります。
前提条件
チュートリアルを完了するには、次の前提条件を設定する必要があります。
AWS アカウントの設定
まだお持ちでない場合は、AWSアカウントを作成してください。このチュートリアルでは AWS の使用料金が発生するため、終了したら必ずリソースをシャットダウンし、削除してください。
IAM アクセス許可の設定
以前に Ground Truth でラベリングジョブを作成したことがある場合、このチュートリアルを完了するために必要なアクセス許可を既に持っている可能性があります。これらのアクセス許可には、以下が含まれます。
- エンドユーザーの SageMakerFullAccess ポリシー – Amazon SageMaker GUI にアクセスしてこのチュートリアルで説明されている手順を実行するには、このチュートリアルを実行するユーザー、グループ、またはロールに SageMakerFullAccess ポリシーを適用する必要があります。このポリシーをまだお持ちでない場合は、管理者にこのポリシーの付与を依頼してください。
- Jupyter ノートブックと Ground Truth の実行ロールの SageMakerFullAccess ポリシー – このチュートリアルで作成する Jupyter ノートブックと Ground Truth のラベリングジョブは、SageMakerFullAccess ポリシーも持つロールで実行する必要があります。ロールを一度作成したら、Jupyter ノートブックと Ground Truth の両方に使用できます。
これらのロールをご自分で作成できる場合、Amazon SageMaker GUI のウィザードを使用してそれらを設定してください。これらのロールを作成するアクセス権がない場合は、次の手順を実行して、管理者にロールを作成するよう依頼してください。
- IAM コンソールで [Roles] を選択します。
- [Create role] をクリックします。
- [Service] で [SageMaker] をクリックします。
- [Next: Permissions] をクリックします。AmazonSageMakerFullAccess が表示されます。
- [Next: Tags] を選択します。
- [Next: Review] をクリックします。
- [Role name] で [
sagemaker-execution-role
] と入力します。 - [Create] をクリックします。
管理者は、新しく作成したこのロールの ARN をエンドユーザーに提供できます。
S3 バケットの設定
デフォルトでは、SageMakerFullAccess ポリシーは名前の中に sagemaker
を含む S3 バケットへのアクセスのみを許可します。バケットに適切な名前を付けるか、ポリシーをそれぞれに応じた変更を行い、適切なアクセスを提供してください。
ラベル付けの一部 (および後続のラベリング検証手順) では、S3 に対してファイルを読み書きする必要があります。これを行うには、S3 バケットを作成する必要があります。詳細については、「ステップ 1: Amazon S3 バケットを作成する」をご参照ください。
このバケットへのパブリックアクセスは必要ないため、許可しないでください。
Amazon SageMaker ノートブックインスタンスの設定
Amazon SageMaker ノートブックインスタンスは、Jupyter ノートブックアプリを実行する完全マネージド Amazon EC2 コンピューティングインスタンスです。詳細については、「ステップ 2: Amazon SageMaker ノートブックインスタンスの作成」をご参照ください。S3 バケットと同じリージョンにノートブックインスタンスを設定してください。
前の手順に従って、ノートブックインスタンスを実行する IAM ロールを指定する必要があります。この手順の詳細は、所有しているアクセス許可によって異なります。
実行ロールを作成するアクセス権がある場合、IAM を作成するときに、最も制限が多いアクセスに対し、特定のS3バケットフィールドでこのチュートリアル用に作成した特定のバケットへのアクセスを制限します。次のスクリーンショットをご覧ください。
実行ロールを作成するアクセス権がなく、管理者が新しいロールではなく実行ロールを作成した場合、[Enter a custom IAM role ARN] を選択し、実行ロールに管理者が提供した ARN を入力します。
Jupyter ノートブックの設定
すべてが正しく実行していることをテストするには、前の手順で作成したノートブックインスタンスにテスト Jupyter ノートブックを作成します。
このチュートリアルのマテリアルに対して ml.t2.medium を 1 時間実行すると、次のコストが発生すると推定されます。
- 0.016 USD/GB 受信データ
- 0.016 USD/GB 送信データ
- データ保存に 0.01 USD
- コンピューティング時間に 0.05 USD
合計で 0.11 USD となります。
ノートブックの料金の詳細については、「Amazon SageMaker の料金」をご参照ください。
マニフェストファイルの作成とアップロード
前提条件を満たしたので、入力およびゴールデンスタンダードマニフェストファイルを作成できます。
データセットファイルの作成
次のコードを含む dataset.manifest
という名前のローカルファイルを作成します。
次のコードを含む golden.manifest
という名前のローカルファイルを作成します。
dataset.manifest
dataset.manifest
ファイルは、ラベリングジョブの入力データセットとして使用されます。dataset.manifest
の各オブジェクトには、人物、動物、または植物のいずれかを説明するテキスト行が含まれています。これらのテキストの 1 行以上は、タスクとして作業者に表示されます。この作業者は、テキストの行が 3 つの分類のどれに最も適合するかを正しく識別する責任があります。
この投稿の dataset.manifest
には 7 行しかありません (作業者は最大 7 つのオブジェクトにラベルを付けることができます) が、この入力データセットファイルには最大 100,000 エントリを含めることができます。
golden.manifest
golden.manifest
を解答用紙またはゴールデンスタンダードとして使用し、dataset.manifest
のタスクに対する作業者のラベリング精度を確認します。golden.manifest
ファイルの各エントリは、dataset.manifest
ファイルの特定のオブジェクトの正しい (ゴールデン) ラベルと相関しています。この相関関係を実現するには、golden.manifest ファイルのキーを、dataset.manifest
ファイルの行番号 (インデックスがゼロから始まる) にマッピングします。
次の画像は、golden.manifest の各ゴールデンスタンダードの回答が、dataset.manifest
の関連するオブジェクトまたは質問にどのようにマッピングされるかを示しています。
左側の画像は golden.manifest
のエントリを表し、右側の画像は dataset.manifest
のエントリを表します。golden.manifest
に含まれる各キーは、dataset.manifest
のオブジェクトに関連付けられた完全に 1 つのゴールデンアンサーを表します。
golden.manifest
のゴールデン回答はそれぞれ、dataset.manifest
ファイルの有効なインデックス行番号にマッピングされます。ただしこの投稿では、入力 dataset.manifest
のすべてのオブジェクトインデックス (具体的には 4 と 5) に対する回答を定義していません。
データセット全体に均等に分散したゴールデン回答の多様なサブセットを作成することにより、データセット全体で作業者の精度を効果的にスポットチェックし、その作業者の精度を一般化できます。
入力 dataset.manifest
内のすべてのオブジェクトにゴールデン回答を提供することができます。これは、作業者の精度をより完全に (前提条件または条件を満たす可能性がある) 測定する場合に役立ちます。
データセットファイルの S3 へのアップロード
これで、両方のファイルを S3 バケットのルートディレクトリにアップロードできるようになりました。これらのファイルを S3 にアップロードする際には、すべてのデフォルトを受け入れることができます。詳細については、「S3 バケットにファイルとフォルダをアップロードする方法」 をご参照ください。
ラベリングジョブの作成
ファイルを S3 にアップロードしたら、ラベリングジョブを作成できます。以下の手順を完了してください。
- Amazon SageMaker コンソールで [Labeling jobs] を選択します。
- [Create labeling job] をクリックします。
- [Job overview] で次の情報を入力します
- [Job name] に
person-animal-plant
と入力します。 - [I want to specify a label attribute name different from the labeling job name] は選択しないでください。
- [Input dataset location] に作成したマニフェストファイルの S3 の場所を入力します。ここでは
s3://gec-sagemaker-blog/dataset.manifest
を使用します。 - [Output dataset location] に出力データが書き込まれる場所を入力します。ここでは
s3://gec-sagemaker-blog/output
を使用します。 - [IAM role] にラベリングジョブを実行する IAM ロールを入力します。
- [Job name] に
こちらに入力する内容は、所有するアクセス許可によって異なります。
実行ロールを作成するアクセス権がある場合は、ノートブックインスタンスを設定する際、前に作成したロールを再利用できます。[Use existing role] をクリックし、既存のロール名 (AmazonSageMaker-ExecutionRole-
で始まります) を選択します。
実行ロールを作成するアクセス権がなく、管理者が実行ロールを作成した場合、[Enter a custom IAM role ARN] を選択し、実行ロールに管理者が提供した ARN を入力します。
- [Task type] の [Task Category] で [Text] をクリックします。
- [Task Selection] で [Text classification] を選択します。
- [Next] をクリックします。
- [Select workers and configure tool] スクリーンで次のように入力します。
- [Worker Types] で [Amazon Mechanical Turk] を選択します。
- [Price per task] で [Low Complexity Tasks] のデフォルトを選択します。
- [The dataset does not contain adult content] をクリックします。
- [By selecting to have your dataset annotated by Amazon Mechanical Turk workers, you understand and agree…] をクリックします。
- [Enable automated data labeling] は選択しないでください。
- [Additional configuration] で [Number of workers per dataset object] に
9
を入力します。
- 同じページの Text classification labeling セクションの左側のセクションに、次のテキストを入力します。
- 上部のセクションで、次のテキストを入力します。
- [Select an option] で、ラベル
person
、animal
、plant
を追加します。 - [Create] をクリックします。
チュートリアルのこの部分では、次の料金が発生します。
- 7 つのオブジェクトに、単価 0.08 USD でラベル付け (合計 0.56 USD)
- 個別のワーカー 9 人が 7 つのオブジェクトに、1 ワーカー当たり 0.012 USD でラベル付け (合計 0.77 USD)
合計金額は 1.32 USD です。
料金の詳細情報については、「Amazon SageMaker Ground Truth の料金」および「Amazon SageMaker の料金」をご参照ください。
[Labeling Jobs] セクションをご覧いただくと、ラベリングジョブのステータスが [In Progress
] となっているのをご確認いただけます。これは、ラベル付けが実行中であることを示してます。
MTurk ベースのワーカーに関する詳細情報については、「Amazon Mechanical Turk ワークフォースを使用する」をご参照ください。
ジョブを開始する時点では、オブジェクトには 0/7
というラベルが付いています。ジョブが完了すると、このラベルが7/7
になり、ステータスが Complete
になります。このジョブ完了後、次のセクションに進んでください。
ワーカーによるラベル付けの効率性を分析する
ラベル付けジョブの完了後は、MTurk ワークフォースを使い、その結果を確認することができます。Amazon SageMaker は、ラベリングジョブ作成時に指定したディレクトリに、すべての出力を保存します。この記事では、S3 バケットにある output
ディレクトリがそれに当たります。
出力ディレクトリ構造の概要
このチュートリアルで使用している S3 バケットを表示し、output/person-animal-plant/annotations/worker-response/iteration-1
を開くと、7 つのサブディレクトリが確認できます。それらの各ディレクトリには、dataset.manifest
ファイルに記述されている一意のオブジェクトが個別に関連付けられています。0
ディレクトリでは、dataset.manifest
の最初のセンテンスのラベル付けジョブの結果を見ることができ、以降、2 つめのセンテンスに関しては 1
ディレクトリで、というように続きます。
詳細については「出力データ」をご参照ください。
手動でワーカーの正確性を特定する
0
ディレクトリにある JSON ファイルを確認します。使用しているワーカーが異なるため、このファイルでの結果は、ご自身のものと異なる場合があります。
この JSON ファイルには、次に示すコードに類似の内容が記述されています。
このコード例には、dataset.manifest
ファイルでの 0 番目 (最初) のセンテンスに、人物、動物、もしくは植物のラベル付けをした、2 つのワーカーによる結果が含まれています。対象となったセンテンスを次に示します。
このセンテンスは誰かの鼻について語っているものなので、人物としてのラベルが付けられます。当然、JSON ファイルを見ると、ワーカー ABC により人物のラベル付けが行われたことが確認できます。次の行からは、ワーカー XYZ も同様の処理を行ったことが分かります。
他のワーカーが異なるラベルを付けているかについては、このファイルの残りの部分を見ることで確認できます。ワーカーごとのラベル付け内容とその正確性レベルに関する洞察は、別ファイルの内容を見ることで得られます。
ワーカーの正確性の特定を自動化する
この記事の場合、(ディレクトリ 0
と 1
にある JSON 出力が対応する) 最初の 2 センテンスでは、各ラベル付けは一致しておりその結果は正確でした。しかし、(ディレクトリ 2
の JSON 出力が示す) 3 つめのセンテンスでは結果が一致していません。次に示すコードをご覧ください。
次に示すのは、インデックス 2
が付いた (dataset.manifest
ファイル内の 3 つめの) センテンスに対する結果です。
このセンテンスが人物についてのものか、あるいは動物についてのものなのかに関する混乱が見られます。各ワーカーごとに、正確性について詳しく知るためには、少し深く調べる必要があります。これにより、このタスクの明確さが不足していたのか、あるいは、タスク実行に必要なトレーニングがワーカーに対し十分に施されていなかったのかを、見極める事が可能になります。詳細については「Amazon SageMaker Ground Truth でのラベリングジョブ用の優れた説明の作成」をご参照ください。
自動的な正確性評価ロジックのセットアップ
Ground Truth は、各ワーカーが各オブジェクトをどのようにラベル付けしたかを表すデータを S3 に保存します。また、すべての注釈付けジョブに基づき Ground Truth が算出した、各オブジェクトに関する統合ラベルも利用できます。加えて、golden.manifest
ファイルにより、計算の正確性を確認することもできます。
これのデータはすべて、ワーカーの正確性を算出するロジックのセットアップに利用できます。
ワーカーの正確性の算出には、先に述べた、Jupyter ノートブックで実行している Python コードへの入力として使用したデータを使用します。
ノートブックのインスタンスへのコピー
ノートブックの取得は、次の手順に従い行います。
- Amazon SageMaker コンソールで、[Notebook instances] をクリックします。
- セットアップ中に作成したノートブックに対し、[Open Jupyter] をクリックします。
- [Jupyter GUI] で [SageMaker Examples] タブを開きます。
- ドロップダウンメニュー [Ground Truth Labeling Jobs] が現れるまでスクロールし、このメニューを展開します。
- [Identify Worker Accuracy.ipynb] で [Use] をクリックします。
- [Create copy] をクリックします。
これで、ノートブックが開くはずです。ご自身の Amazon SageMaker の構成で実行できるように、このノートブックを設定します。
Jupyter ノートブックの設定
ここからの手順では、Amazon SageMaker と S3 リソースが、すべて同一のリージョンで実行していることを前提にしています。これがあてはまらない場合、ここからの手順は機能しません。
ノートブックの設定を行うには、そのノートブックの最後のセルまでスクロールダウンし、次に示す各パスを、ご自身の設置に適合したものに修正します。
- bucket – ‘
gec-sagemaker-blog
‘ の部分を、ご使用になっている S3 バケットの名前に置き換えます。バケット名の引用符を忘れないようにしてください。
ここからの手順では、bucket_root_url
が連結された文字列を設定します。bucket_root_url
はそのまま残し、これに連結された部分だけ正確に修正するようにしてください。
- golden_answers – この部分は、S3 にある
golden.manifest
ファイルを指している必要があります。ここまでのラベリングジョブを実行している場合は、この値は、デフォルトのgolden.manifest
のままにしてください。 - worker_metrics_output – 正確性メトリクス出力が記述されたファイルの名前です。この値は、デフォルトの
worker_metrics.json
のままにします。 - labeling_job_output_location – ラベリングジョブの出力ディレクトリです。ここまでのラベリングジョブを実行している場合は、この値はデフォルトの出力先のままにしてください。
- labeling_job_name – 作成したラベル付けジョブの名前です。ここまでのラベリングジョブを実行している場合は、この値はデフォルトのままにしてください。
- [File] の下で [Save and Checkpoint] をクリックします。
- [Cell] の下で [Run All] をクリックします。
ノートブックの最終セルの下で、結果に関するレポート出力が確認できます。これは、write_worker_metrics
関数の 41 行目に記述されているものです。このコンソール表示は利便性のために用意されたもので、これにより、分析を実行するたびに worker_metrics.json
ファイルを S3 からダウンロードする必要がなくなります。
この出力が大きすぎてコンソールでの表示が不便な場合は、この部分をコメントアウトした上で、S3 バケットのルートにある worker_metrics.json
ファイル (もしくは、 worker_metrics_output
として指定したいずれかの先) から結果を取得することもできます。
ワーカーメトリクス出力の調査
ここまでで、プロセスの自動化ができました。その結果を深く探ることで、ワーカーのパフォーマンスに関するいくつかの洞察を取得することが可能です。
このメトリクスには、キーとしてワーカー ID が付与された、ワーカーごとのオブジェクトが含まれています。各キーに対応する値には、次のような属性があります。
- Total Number of Objects Annotated – これは、ワーカーが注釈を付けた (non-Golden Standard と Golden Standard を含む) 全オブジェクトの合計です。
- Number of Golden Standard Objects Annotated – ワーカーが注釈をつけた、Golden Standard オブジェクトの数です。ワーカーが注釈を付けた non-Golden Standard オブジェクトの数を知るには、注釈が付けられた全オブジェクトの数からこの数を引き算します。
- Average Golden Standard Accuracy – ワーカーにより Golden Standard オブジェクトに注釈が付けられる際には、次の数値が Python ロジックにより追跡されます。
- ワーカーが要求された注釈を付けるべき Golden Standard オブジェクトの数。
- ワーカーが正確な返答を返した Golden Standard オブジェクトの数。
これら 2 種類の数値の比率は、golden での正確な返答数を、Golden Standard の総数で割り算して求めます。この数値は、そのユーザーについての Golden Standard における平均精度スコアを示しています。パーセンテージで表示するには、この値に 100 を掛け算します。
- Average Accuracy Compared To Other Workers – (Golden と non-Golden を含む) ワーカーにより注釈が付けられたすべてのオブジェクトにおいて、ワーカーからのレスポンスは、Ground Truth が算出したレスポンスの (全ワーカーからの注釈により決まる) 合算値と比較されます。 パーセンテージで表示するには、この値に 100 を掛け算します。
出力例
最初に挙げるこの例では、ワーカー public.us-east-1.PDC が、合計で 3 つの注釈付けを実行しています。Golden Standard ファイルでは、3 つのうち 2つを参照できます。Golden Standard ファイルで注釈付けを行ったアイテムに関しては、正確性は 100% です。他のワーカーによる注釈付けが行われた (golden answers ファイルで参照され得るアイテムも含んだ ) すべてのアイテムでも、正確性は 100% を示しています。次に示すコードをご覧ください。
2 つめに挙げるこちらの例では、ワーカー public.us-east-1.SRB が、合計で 5 つの注釈付けを実行しています。前の例でのワーカーに比べ多くの注釈付けを実行しているものの、その正確性は、Golden Standard、および (それぞれ 75% と 80% を示す) 他のワーカーに比べても完璧とはいえません。次に示すコードをご覧ください。
In this third example, the worker public.us-east-1.XYZ performed only one annotation.The object they performed that annotation against was not in the golden standard set.Therefore, the golden standard accuracy for this worker is 0%.However, the one annotation this worker did do was 100% accurate, relative to the results from the others who worked on it.次のコードを参照してください。
クリーンアップ
クリーンアップにより、全体を整理し、追加的なコストの発生を防止することができます。
S3 と Jupyter ノートブックのデータは削除する前に確実にオフラインのコピーを作成しておき、後に参照したいデータを保存します。
S3 でのコストがかからないようにするためには、このチュートリアルで使用したバケットと、その内部の全ファイルを削除しておきます。Jupyter ノートブックのコストがかからないようにするには、そのノートブックを停止した上で削除します。
まとめ
この記事では、Ground Truth でラベリングジョブをセットアップし送信するための一連のガイドを提供しました。その上で、当該ラベリングジョブを実行したワーカーの精度を分析しました。
ここでのコードは、いかようにも改善および発展させて利用できます。目的に応じて機能追加や修正を行っていただいて結構です。同時に、それが他のユーザーにもメリットを提供すると考えられる場合は、レポジトリに対してプルリクエストを作成してください。そうすれば、この記事を参照された他の方にも、その修正点が利用できるようになります。
著者について
Zack Slayton は、Amazon のソフトウェア開発エンジニアです。余暇での彼女は、書籍の種類を選ばずに読書を楽しみ、家族と良い時間を過ごしています。
Geremy Cohen は、AWS のソリューションアーキテクトとして、お客様が最先端のクラウドベースソリューションを構築することを支援しています。余暇での彼は、ビーチを少し散歩したり、家族と供にベイエリアを散策してまわったり、あるいは、自宅を修理したりいじったりしながら、BBQ も楽しんでいます。