【MTurk入門】機械学習とかでよく耳にするAmazon Mechanical Turkとは&活用例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/9a15b087-b04f-fd6d-f140-5e5b58f3187b.png)
（[公式Twitter](https://twitter.com/amazonmturk)アイコンから拝借）

世界最大規模の**クラウドソーシングプラットフォーム**の１つで、Amazon.comのサービスです。

**合わせて読みたい過去記事:**

- [Amazon Mechanical Turk API (Python, boto3)を使ってお手軽タスク外注](https://qiita.com/ssmsaito/items/c0c514d76abcd532b59e)
- [【リクエスター必読】MTurkの報酬額基準は$7.25/h〜](https://qiita.com/ssmsaito/items/3a28dbce3cc55ff4e283)


# 前提：クラウドソーシングとは

<details><summary>知ってる方は飛ばしちゃってください。クリックすると開きます。</summary>
<div>
インターネット上の不特定多数の人々（**クラウドワーカー、ワーカー**）に対して何らかの仕事を外注するプロセス・サービスを**クラウドソーシング**と呼びます。ここでは**金銭報酬**が主な原動力であり（※一部例外あり）、ワーカーの仕事の対価として仕事の依頼者が支払います。

...ぐらいの広い言葉なんですが、実施形態としてもう少し細かい分類が主に４種類あり、

1. **マイクロタスク型** ... **数秒〜小一時間ぐらいのウェブUI上で完結する作業**が主。仕事はすぐに開始でき、ワーカーの作業量に応じて対価が支払われる。

2. **プロジェクト型** ... 複雑で専門的知識を伴う仕事をプロジェクトベースで発注する。いわゆる**個人事業主・フリーランス**的な言葉から連想される形態。

3. **コンペティション型** ... **デザインなどの創造的な仕事**が主に扱われる。公募に対して複数人のワーカーが成果物を提出し、採用されたワーカーのみ金銭報酬を獲得できる。

4. **ボランティア型** ... シチズンサイエンスなどで用いられる。金銭報酬は発生せず、代わりに**貢献・やりがい・楽しさ**などがワーカーのモチベーションとなる。

となっています。
（参考元：[機械学習プロフェッショナルシリーズ　ヒューマンコンピュテーションとクラウドソーシング](https://www.kspub.co.jp/book/detail/1529137.html)[^hcomp-book]より、自身の解釈により一部文言を編集）

日本国内だと[クラウドワークス](https://crowdworks.jp/)とか[ランサーズ](https://www.lancers.jp/)は聞いたことあるのではないでしょうか。
最近の傾向を追えてないのですが、これらは**プロジェクト型・コンペティション型**の形態がメインとなっていそうなのがウェブサイトから見て取れます。マイクロタスク型も対応しているようです。

↓　クラウドワークス公式ウェブサイト（https://crowdworks.jp/ ）より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/0d26f9fd-91cc-1a01-485f-72463280a6cd.png)

↓　ランサーズ公式ウェブサイト（https://www.lancers.jp/ ）より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/cc2c7afc-85e6-cc10-7f74-142322973ff2.png)
</div>
</details>

[^hcomp-book]: 機械学習プロフェッショナルシリーズ　ヒューマンコンピュテーションとクラウドソーシング - https://www.kspub.co.jp/book/detail/1529137.html

# Amazon Mechanical Turk

**マイクロタスク型**に特化した、英語が共通言語のプラットフォームです。**MTurk**とか**AMT**とか略されることが多いです。

#### 概要

通例、マイクロタスク型クラウドソーシングでは、タスクを依頼するユーザーは**Requester（リクエスター）**、仕事内容は**Microtask（マイクロタスク）**と呼ばれます。
特にMTurkでは、マイクロタスクは**HIT（ヒットと読む）**とよばれ、仕事を行う単一のウェブページを特に指します。
その他の基本原理は上述したものと同じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/9c95c3ec-6d4e-87d6-8a2e-e98919d2cee8.png)

ワーカーとリクエスターのそれぞれのユーザーになることができます。
※ただしワーカーアカウントに関しては、5~10年ほど前から[米国在住者以外のワーカー登録の多くが承認が通らないという状態](https://www.reddit.com/r/mturk/wiki/index#wiki_who_can_sign_up.3F)になっていたりするらしく、**登録できる可能性は現状そこまで高くない**かもしれません。

#### ワーカー人口

[Difallahらの論文](https://www.ipeirotis.com/wp-content/uploads/2017/12/wsdmf074-difallahA.pdf)によれば、MTurkでは2017年11月時点で**10万人**以上のワーカー（常時**2千人**以上のアクティブなワーカー）を擁しており、75%が米国在住者、16%がインド在住者とのこと。
プラットフォームの言語は英語ですが、依頼するタスクの中身はこれに限りません。

#### タスク内容

「マイクロ」なタスクといえど、MTurkにおけるタスク内容は様々で、例えば

- 音声や画像などの文字書き起こし
- ウェブサイトの人力スクレイピング
- 長文の要約
- アンケート
- システムの評価実験

など、色んな種類のものが散見されます。

## 実際の見た目

**ワーカーのUI**を少しだけ紹介します。
※リクエスタのUIについてはあまり参考になるものが見当たらないので載せませんが、[このあたり（公式ガイド）](https://docs.aws.amazon.com/AWSMechTurk/latest/RequesterUI/CreatingYourBatchofHITs.html)を見るといいかもしれません。

#### HIT一覧

以下はワーカーがログインしてから最初に見る画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/51088c2b-4a87-1761-d68a-4d4e5818c9a0.png)

中央〜下部の表は、現在公開されているHITグループの一覧です。
実際は、テーブルの行はもっと下まで（デフォルトだと20件）伸びていて、かつ何十ページもあります。
左から順に、**リクエスタ名・タイトル・含むHITインスタンス数・1HITあたり報酬額・グループ公開後の経過日時・HITグループに対する操作**　が提示されています。
オレンジ色の行は、HITを行うために資格を得る必要があり、現在は選べないことを表しています。
ページ上部の検索ボックスで任意のクエリを入力することで、HITの絞り込みも可能です。

#### HIT作業画面

提示された情報を参考に、ワーカーは自分のペースで行いたいHITグループを選び、作業を行っていきます。開始する前に一旦プレビューするか、いきなり開始するかを選ぶことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/553b5ad6-9e5d-9ddf-533c-bb32018622da.png)

ここでは、「Receipt Transcription」というHITグループに含まれる、1万を超えるHITのうちの１つ（ランダムに選ばれる）がページ内のIFrameとして組み込まれて表示されます。
このHITで作業し回答を提出（Submit）した結果が、UI上部に示された額の報酬が支払われる対象となります。

## メリット

クラウドソーシングのプラットフォームが多数存在する中でも、MTurkの強みは**小回りがきくこと**・**自由度が高いこと**だと思います。

### すぐタスクを依頼できる

何もない状態からタスク依頼まで必要なステップは、ざっくりまとめると

1. AWSアカウントとMTurkアカウントを作る
2. HIT報酬用に、MTurkアカウントへプリペイド金額をチャージ or AWSのクレジットカード情報を紐付ける
3. HITを用意する

です[^mturk-api-tutorial]。1.は申込み自体は**数分**で完了し、2.もログイン後簡単にできます。

一方、かかりそうなのは3.ですが、**すぐ使えるテンプレートがたくさん用意されている**のがMTurkのアツい点です。これを使えばタスク作りはほぼ終わっているようなもんです。
[公式ページ](https://requester.mturk.com/create/projects/new)からログインしなくても見られます。
2021年2月時点で、アンケート系2種類、ビジョン系11種類、言語系10種類、その他6種類、の**合計29種類のテンプレート**が用意されていて、割と機能も充実しているので、リクエスタにとってはありがたい環境です。たとえばVisionのInstance Segmentationというテンプレートならこんな見た目になっています。

![ezgif-1-f7e8699f32c0 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/ed750912-24da-30ea-08ec-c7ae639c3e6f.gif)



こういった描画ツールを自作で作るのはなかなか骨が折れますよね。もちろんタスクによってはカスタマイズする必要も出てくるでしょうが、ここまでやってくれるならタスク投げるまでは本当にすぐです。

[^mturk-api-tutorial]: https://docs.aws.amazon.com/AWSMechTurk/latest/AWSMechanicalTurkGettingStartedGuide/SetUp.html

### タスクのカスタマイズが自由

テンプレートがすぐに使えて便利な一方、やはりトレードオフとして設計の制約は付き物ですので、画像はここに置きたいんだ！とか、表示を遅らせたいんだ！など、必ずしも自分のタスク設計に合致するとは限りません。

そういう時は**一から自分で作る**ことももちろんできます。ウェブプログラミングの知識（フロントエンド：HTML/CSS/JavaScript　＋　必要ならバックエンド）が必要になりますが、この場合はワーカーに自分のウェブアプリのユーザーになってもらうような状態に等しいので、**ウェブアプリ上で処理可能・取得可能なことは"原理的には"何でもできます**。例えば、

- **ワーカーの回答結果を自前サーバーのDBで管理する**
    - 通常は「HITページ内のinputタグの値をPOSTしてMTurkのサーバーへ送信・記録する」という方法をとりますが、実は送信情報に回答そのものを含めることは義務ではありません。フォームをPOSTする前に**回答情報を自分のウェブサーバー等を経由してDBに別途保存**したりするほうが、回答をすぐチェックできるし、検索クエリ等も投げられるし、永続化もできるので、ほとんどの場合扱いやすいです。
- **タスクの中身を動的にワーカーへ配信する**
    - テンプレートを用いる場合はタスク内容のコンテンツ（ラベリング対象のサンプル等）が静的な配信となるか、できてもHITごとにコンテンツをランダムに出し分ける程度です。自前ページなら、**ワーカーのブラウザ上のJavaScriptからバックエンドにAJAXリクエストを投げ、タスクコンテンツを受信して非同期に描画する**ように組むことで、コンテンツに優先度を設定してサンプルごとの回答の集まりやすさを制御したり、ワーカーの正確さによりタスクを出し分けたりすることが可能です。

実際、私のタスクでもよく上記の手法を用いています。図にして比較すると、まず静的なページを用いた流れが以下のようになるのに対し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/a348f351-99d6-f9d3-e74c-c92746ae648b.png)

**自前アプリを作る**と以下のようなことができます（オレンジ色が該当する部分）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/2714af66-c367-e2c7-7776-b9a4b43c5dbd.png)

### 公開APIがある

話の流れ的に一番最後になってしまいましたが、これは**MTurk以外の殆どのプラットフォームには用意されていない、最も強力な機能**だと思います。

MTurkはそもそもAWSのサービスの一つです。他のAWSのサービスと同じように、MTurkにも実行プログラムから一連の操作を行うことを可能とする[API群](https://docs.aws.amazon.com/AWSMechTurk/latest/AWSMturkAPI/Welcome.html)が用意されています。
[サポートしている言語](https://aws.amazon.com/jp/getting-started/tools-sdks/)も、Python・Javascript（ブラウザ/Node.js）・Ruby・PHP・Javaその他多数...と、かなり幅広いです。

操作対象も相当幅広いです。HIT・ワーカー・Qualification(ワーカーフィルタリング用の資格情報)・回答情報等それぞれのリソースに対し、get/create/delete系のオペレーションが一通り揃っています。先述のように**自前サーバーによる運用と組み合わせて使う**などすれば**かなり最強**です。

後述の活用例で具体的に紹介しますが、例えば機械学習アプリケーションの運用に際しては、精度向上や未知データへの対応などのために[Active Learning（能動学習）](https://knowledge.sakura.ad.jp/5931/)のような**Human-In-The-Loop**なアプローチは必須になるでしょう。
「モデルが人間を必要としたまさにその時、どこからどうやって人に助けてもらえばいいの？」という問いに対し、**機械学習プログラムの出力の確信度が低い時、自動的にMTurkへアノテーションタスクを投げ、回答が集まった直後にその集計結果を追加学習する！**みたいなのは割と実現しやすく、テンションも上がる方法の一つかもしれません。

## MTurkの活用例

あるシステムやワークフローにおける**クラウドワーカーの役割**にフォーカスして、色々な観点から紹介していきたいと思います。研究論文がメインですが、どれも実用化まではそう遠くないものです。

個人的に特に推したいポイントとして、クラウドソーシングをデータ集めのために動かす**オフライン**な用途だけでなく、人間同士が、あるいは人間と機械（ソフトウェア）が、**あるシステムの中で協調しながら**一つの答えを導くような**オンライン**な用途も注目していただきたいと思います。

### 学習データセット構築

とはいえ真っ先に思いつくのはこの用途ではないでしょうか。
数々の有名な機械学習データセットがMTurkを用いて構築されています。いくつか挙げると以下のとおりです。

- [ImageNet](http://www.image-net.org/)
    - 物体名称ラベルが付与された画像データセット。
    - ある検索クエリに対してヒットした48枚の画像を提示し、クエリに合致するものを選ばせるHIT[^imagenet-ui]![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/e656d2ca-e7a1-553f-0ff0-e9dee8da3e05.png)
- [MS COCO](https://cocodataset.org/)
    - セグメンテーションとキャプション付与が行われた画像データセット。
    - １つの画像に対し、①画像に映る該当ラベルのオブジェクトの列挙、②列挙されたラベルに対応するオブジェクトの位置の特定、③おおよその位置をもとに行うセグメンテーション、の３つのステップをそれぞれ異なるHITとして作り、それぞれの回答結果を用いてパイプライン化する[^mscoco-pipeline]。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/e4d78b37-798a-76fb-d4e2-1a7799330381.png)
- [SQuAD](https://rajpurkar.github.io/SQuAD-explorer/)
    - 文書読解のためのQAデータセット。
    - ある段落の文章について、5つ質問文をワーカーに考えてもらい、答えを段落中でハイライトさせるHIT[^squad-ui]。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/5a83f7bd-dd0f-e3b7-f875-056783f995f3.png)

などがあります。それぞれ相当な数（数十万〜数百万）のデータサンプルを含んでいて、大量の人力を比較的容易に動員できるMTurkならではの規模感だと言えるでしょう。

[^imagenet-url]: http://www.image-net.org/
[^imagenet-ui]: https://www.groundai.com/project/do-imagenet-classifiers-generalize-to-imagenet/1
[^mscoco-pipeline]: https://arxiv.org/pdf/1405.0312.pdf
[^squad-ui]: https://arxiv.org/pdf/1806.03822.pdf

### コンテンツクリエーション

MS COCOやSQuADのタスクのように、異なる質問に対する異なるクラウドワーカーの回答をパイプラインで繋ぐことで、クラウドワーカーに**クリエイティブな成果物**を作ってもらうことも出来ます。

- [Storia：一連のSNS投稿から物語文生成](https://dl.acm.org/doi/abs/10.1145/2818048.2820072)
    - Twitterなどの一連のSNS投稿から、ある出来事（サッカーの試合とか）についての**まとめ記事を生成**する。
    - SNS投稿をワーカーに見せ、**①ある投稿についての質問を考える、②その質問に回答する**、というHITをそれぞれ行わせ、**Q&Aセット**を作る。その結果と関連する一連のSNS投稿を見ながら、さらに他の何人かのワーカーが構造を守りながら**一段落分の文章を書き**、最終的にワーカーの**多数決で優れた文章を決める**。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/93537ff6-54af-4987-b6c5-10e13f245992.png)


### 「人工知能」風に振る舞う

やたら汎用性の高いAIだ！と思っていたら、**実は人間が中に入っていた**、という[Mechanical Turkという名前の由来](https://www.pewresearch.org/internet/2016/07/11/what-is-mechanical-turk/)をそのまんま再現したようなクラウドソーシングの利用法です。
一見ジョークのようにも聞こえますが、**機械での自動化をゴリゴリに頑張るよりも、時には人間が解いたほうが色々と都合がいい**ということを示す、実運用にも至っている大真面目なアプリケーションです。

- [Vizwiz：視覚障害者向けカメラ被写体説明アプリ](https://dl.acm.org/doi/abs/10.1145/1866029.1866080)
    - 目の見えない人でも写真撮影ができ、**被写体について任意の質問を投げかけると説明を音声で読み上げ**てくれるスマホアプリ。[私が短期留学中にお世話になったボス](https://www.cs.cmu.edu/~jbigham/)が学生だった頃の成果です。
    - **スマホで撮影した写真**と**音声入力した質問クエリ**をワーカーに提示し、質問に答える説明文を入力させるHIT。**HITを小刻みに投げることで常に検索結果上位に来るようにし、ワーカーの目に留まりやすくする**手法も用いることで、ユーザーが質問を入力してから**最短10秒程度で応答が返ってくる**。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/d32243a4-ffe4-d19b-dc53-b81c959cd9ae.png)


- [Chorus：クラウドワーカー駆動チャットボット](https://arxiv.org/abs/1708.03044)
    - Google Hangouts上で動くチャットアプリで、「近場でなんか良い店ない？」的なざっくりした質問など、どんなクエリでも対話を通して柔軟に答えてくれる。
    - HIT上にワーカーが待機し、リアルタイムで調べ物やユーザーとのやり取りを行っていく。つまり**MTurkワーカーがオペレーターのように振る舞っている**。また、未来のユーザーのためにもワーカーをHIT上で待機させておく（プーリングしておく）ことで、**アプリを起動した瞬間からワーカーとの対話が可能**となる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/07de0a16-f78d-4a74-9caa-21b00a0efc46.png)


### 機械学習と人間が協調するAI

最後に、**クラウドワーカー駆動アプリと機械学習のハイブリッド**なアプリケーションを紹介します。機械と人間のそれぞれの得意なところを補いながら、**機械学習モデルも同時に成長させていく**という、Human-In-The-Loopの王道的な用途です。

- [Zensors：街中のカメラで任意のイベントの自動監視](https://dl.acm.org/doi/abs/10.1145/2702123.2702416)
    - 室内・室外問わず好きな場所に設置したカメラの画像について、「今ラウンジのテーブルに座ってる人は何人？」とか「猫はいま何してる？」などの**好きなクエリを文字列で登録するだけで、それを周期的にモニタリングできる**アプリ。
    - ユーザーが監視システム上でカメラを登録する時、特に注目すべき領域が定まっている場合はそれを選択させると、その領域だけを切り取った画像をクエリとともにワーカーへHITとして提示し、質問へ回答させる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/389707fa-c359-a837-7c8f-100eb90839f1.png)
    - タスクによっては、段々と実環境のラベル付きデータが集まることで**機械学習モデルだけでも良い精度が出るようになる**。その場合はクラウドワーカーにHITを投げないことでコストを削減し、未知データなどで識別の確信度が下がった場合にはまたワーカーにHITを投げる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052741/c88f2f89-2d2a-ed3a-142f-d84a2c1d9238.png)



## デメリット

メリットだけを書いているとMTurk教の人だと思われてしまうので、反対の面も書きます。もちろんMTurkは万能ではなく、他のプラットフォームのほうが向いている場合もあるし、なんならクラウドソーシングを使わないほうがいい場面もあります。
ということも踏まえ、ご自身のアクションの参考にしていただけると幸いです。

### 英語が前提

冒頭にも書きましたが、ワーカーの大半が英語話者なため、作るタスクや集まるデータも英語が基本です。
リクエスターには色んな国籍の人がいるので完璧な英語は必ずしも求められてませんが、あまり拙い英語だと**タスク内容そのものへの誤解が生じ、正しく回答が得られない**などのリスクはあります。
日本語タスクを作ることも原理的には可能ですが、もともと日本語話者ワーカーの分母は少ない上、近年は[米国人以外のワーカー受け入れを停止しているらしい](https://www.reddit.com/r/mturk/wiki/index#wiki_who_can_sign_up.3F)という情報もあるので、期待しないほうがいいでしょう。

### 回答精度を高めるには工夫が必要

プラットフォームによってはワーカー一人ひとりの作業品質を重視し、トレーニングやテストを行うところもありますが、MTurkではそういったものはなく、作業の正確性は**ワーカー個人の経験・スキルやリクエスターのタスク設計**に委ねられています。
一般に、特になにもしない（設計したタスクをそのまま公開する）と、時間帯やその時々で変化しますが、集まる2~3割の結果は**勘違い回答**や**悪意のある回答(ボットも含め)**が集まるというのが私の体感です。

もちろん対策はあり、具体的にいくつか挙げると、

1. **ワーカーの事前フィルタリング** ... リクエスターが独自に設計した**事前テスト**用のマイクロタスクにおいて、設定した基準をクリアしたワーカーだけにメインのマイクロタスクを公開する。

2. **回答の冗長化** ... たとえば識別タスクのデータラベリングにおいて、１サンプル当たり3人とか5人分の回答を集めて、**多数決**や**平均化処理**などを行う。

3. **ワーカーの事後フィルタリング** ... 明らかに変な回答は目視で弾けばOK。あるいは、**定期的に回答が既知の問題を仕込んで**おいて、その精度によってワーカーごとの回答結果の扱いを変える。

などがあり、お互いに併用も可能です。上記は比較的簡単だし精度改善も期待できる方法ですが、それでも手間がかかってしまうのは否めないです。


# おわりに

Amazon Mechanical Turk （MTurk）の概要と活用例について説明しました。聞いたことあるけどあんま知らない、みたいな方の理解の一助になれば幸いです。

日本では何故か、MTurkはもとより、クラウドソーシング自体がいまいち認知されていません。日本に存在するプラットフォームの特性上、オフラインのデータ収集はまだしも、「**機械学習と人力が本当の意味で協調する未来**」へのビジョンについてはいまいち見えにくいからかもしれません。

Human-In-The-Loopの研究もだいぶ進んできましたので、向こう数年でいよいよ実用化・ビジネス化の機運が高まってくるころだと思います（私の会社でもまさにそのチャンスを狙っているところです）。こうしたクラウドソーシングの活路を少しでも皆さんに共有し、一緒にこの界隈を盛り上げてくれる仲間が増えたら良いなと思っている次第です。