Github: https://github.com/facebookresearch/ParlAI
ParlAI(「パーレイ」と発音)はPythonで実装されたダイアログAI研究のフレームワークです。
その目標は研究者を提供することです:
- ダイアログモデルの共有、訓練、テストのための統一されたフレームワーク
- 多くの一般的なデータセットを1か所で利用でき、複数のタスクを実行できます
- データ収集と人間の評価のためのAmazon Mechanical Turkのシームレスな統合
SQuad 、 bAbIタスク 、 MS MARCO 、 MCTest 、 WikiQA 、 WebQuestions 、 SimpleQuestions 、 WikiMovies 、 QACNN&QADailyMail 、 CBT 、 BookTest 、 bAbIダイアログタスク 、 Ubuntuダイアログ 、 OpenSubtitles 、 Cornell Movieなどの一般的なデータセットを含む20以上のタスクが現在サポートされています 。 VQA-COCO2014 、 VisDialおよびCLEVR 。 現在の完全なタスクリストについては、 ここを参照してください。
PyTorchとLua Torchを使用したトレーニング神経モデルの例、GPUのバッチトレーニング、CPUのHogwildトレーニングなどがあります。 代わりにTensorflowを使用することも簡単です。
私たちの目標は、地域に根ざした方法で成長するために訓練するタスクとエージェントの数です。
ParlAIについては、 「ParlAI:ダイアログリサーチソフトウェアプラットフォーム」、arXiv:1705.06476に記載されています。
私たちは早期リリースのベータ版です。 いくつかの冒険と荒い縁を期待してください。
最新の追加と更新についてはニュースページを、その他のドキュメントについてはhttp://parl.aiのWebサイトを参照してください 。
目標
対話モデルの評価のための統一されたフレームワーク
- 必要に応じてタスク/データセットをダウンロードし、それらに同じ簡単なインターフェイスを提供します
- データセットの入力と評価のフレームワーク/メトリックを統合する
-
agents/
ディレクトリは、研修コードをリポジトリに提出して他者と共有することを奨励している - 再現性を助ける
最終目標は、さまざまなスキルを含む一般的な対話です
- シミュレートされた言語タスクと実際の言語タスクをシームレスに組み合わせる
- マルチタスクモデルの開発と評価を奨励
- 特定のデータセットへのモデルのオーバーフィットを軽減するのに役立ちます
最終目標は人々との真の対話です
- Mechanical Turkを介して人とのライブ対話を訓練し評価する
- あなたの対話エージェントとターッカーを接続するための簡単なセットアップ
- さまざまな研究グループのターク実験を比較することを許可する
ヒューマンインタラクションのための作業対話モデルをブートストラップする一連のデータセット
- リポジトリに入る新しいデータセットを構築する動機づけ
プロパティ
- すべてのデータセットは自然な対話のように見えます。単一のフォーマット/ APIです。
- 固定データセット(会話ログ)とインタラクティブ(オンライン/ RL)の両方のタスク。
- リアルタスクとシミュレートタスクの両方。
- VQAのビジュアルなど、他のメディアをサポートします。
- Mechanical Turkを使用してデータを実行/収集/評価することができます。
- Pythonフレームワーク。
- PyTorchを使ったトレーニングの例。
- zmqを使用して、Python以外のツールボックス、Lua Torchの例を紹介します。
- モデルのホグワイルドおよびバッチトレーニングをサポートします。
基本的な例
注:これらの例のいずれかが失敗した場合は、 要件のセクションをチェックして、何か不足していないかどうかを確認してください。
“1kトレーニングの例” bAbIタスクのタスク1の10個のランダムな例を表示する:
python examples/display_data.py -t babi:task1k:1
同時にbAbIタスクとSQuADデータセットで、マルチタスクの100のランダムサンプルを表示します:
python examples/display_data.py -t babi:task1k:1,squad -n 100
人間エージェントを使ってbAbIテストセットを評価する(ローカルキーボードを入力として使用する):
python examples/eval_model.py -m local_human -t babi:Task1k:1 -dt valid
Movies Subredditデータセットの検証セットでIRベースラインモデルを評価する:
python examples/eval_model.py -m ir_baseline -t "#moviedd-reddit" -dt valid
同じIRベースラインモデルの予測を表示する:
python examples/display_model.py -m ir_baseline -t "#moviedd-reddit" -dt valid
“10kトレーニング例” bAbIタスク1のseq2seqモデルを32個の例のバッチサイズで訓練すると、検証時に精度が95%に達する(pytorchが必要):
python examples/train_model.py -t babi:task10k:1 -m seq2seq -mf /tmp/model_s2s -bs 32 -vtim 30 -vcut 0.95
バッチサイズが32の例(pytorchとregex)のSQuadデータセットで、注意深いLSTMモデルを学習します。
python examples/train_model.py -m drqa -t squad -bs 32 -mf /tmp/model_drqa
要件
ParlAIには現在Python3が必要です。
コアモジュールの依存関係はrequirement.txtにリストされています。
(parlai / agentsに含まれる)いくつかのモデルには追加の要件があります。 DrQAはPyTorchをインストールする必要があり、MemNNモデルはLua Torchをインストールする必要があります。 インストール手順についてはそれぞれのWebサイトを参照してください。
ParlAIのインストール
次のコマンドを実行して、リポジトリを複製し、ParlAIをインストールします。
git clone https://github.com/facebookresearch/ParlAI.git ~/ParlAI
cd ~/ParlAI; python setup.py develop
クローンされたディレクトリがサイトパッケージにリンクされます。
これは、このサンプルへのアクセスを容易にし、必要なものを変更できるようにするため、推奨されるインストール手順です。 これは、リポジトリに別のタスクを提出する場合に特に便利です。
必要なデータはすべて〜/ ParlAI / dataにダウンロードされ、必要であれば非データファイル(MemNNコードなど)は〜/ ParlAI / downloadsにダウンロードされます。 これらのファイルで使用されているスペースを削除する必要がある場合は、これらのディレクトリを安全に削除することができ、必要なファイルはすべて再度ダウンロードされます。
世界、エージェント、教師
ParlAIの主な概念(クラス):
- 世界 – 環境を定義します(非常にシンプルで、2人のエージェントが互いに話すことができます)。
- エージェント – 世界のエージェント、例えば学習者。 (複数の学習者が存在する可能性があります)
- 教師 – 学習者と会話するエージェントの一種。これまでに挙げたものの1つを実装します。
ワールドとその中のエージェントを定義した後、world.parley()関数を呼び出すトレーニング、テスト、または表示のためにメインループを実行することができます。 左のパネルにはメインのスケルトンが、右側にはparley()の実際のコードが示されています。
行動と観察
すべてのエージェント(教師を含む)は、単一の形式、すなわち、観察/行動オブジェクト(python dict)で互いに話します。 これは、エージェント間でテキスト、ラベル、報酬を渡すために使用されます。 これは、話す(演技する)または聞く(観察する)ときには同じオブジェクトタイプですが、フィールド内の値が異なる別のビューです。 フィールドは次のとおりです。
これらの各フィールドは、データセットに応じて技術的にはオプションですが、「テキスト」フィールドはほぼすべての取引所で使用されます。
bAbIのような固定された教師あり学習データセットの場合、トレーニングセットからの典型的な交換は次のようになる(テストセットはラベルを含まない)。
Teacher: {
'text': 'Sam went to the kitchen\nPat gave Sam the milk\nWhere is the milk?',
'labels': ['kitchen'],
'label_candidates': ['hallway', 'kitchen', 'bathroom'],
'episode_done': False
}
Student: {
'text': 'hallway'
}
Teacher: {
'text': 'Sam went to the hallway\nPat went to the bathroom\nWhere is the milk?',
'labels': ['hallway'],
'label_candidates': ['hallway', 'kitchen', 'bathroom'],
'episode_done': True
}
Student: {
'text': 'hallway'
}
Teacher: {
... # starts next episode
}
...
コード
コードはいくつかのメインディレクトリに設定されています:
- core :フレームワークのプライマリコードを含む
- エージェント :異なるタスク(例えば、機械学習モデル)と相互作用できるエージェントを含み、
- 例 :異なるループ(建物の辞書、列車/評価、データ表示)のいくつかの基本的な例が含まれています。
- タスク :ParlAI内から利用できるさまざまなタスクのコードが含まれています。
- mturk :Mechanical Turkを設定するためのコードとサンプルのMTurkタスクが含まれています
各ディレクトリについては、依存関係の順に詳しく説明します。
コア
コアライブラリには、次のファイルが含まれています。
- agents.py :このファイルには、あなた自身のモデルで拡張できるいくつかの基本的なエージェントが含まれています
- エージェント :他のすべてのエージェントの基本クラスで、監視テーブルを受け取って応答するテーブルを返すact()メソッドを実装します
- Teacher :エージェントの子で、メトリックを返すためのレポートメソッドも実装しています。 タスクがTeacherクラスを実装する
- MultiTaskTeacher :教師に渡された “タスクストリング”に基づいて教師のセットを作成し、その中に複数の教師を作成し、それらの間を交互に
- create_task_teacher:与えられたタスク文字列から教師をインスタンス化する(例: ‘babi:task:1’または ‘squad’)
- build_data.py :タスク用のデータを設定するための基本ユーティリティ。 ファイルシステムに異なる機能が必要な場合は、オーバーライドすることができます。
- dict.py :一般的なNLP形式の辞書を観測から構築するためのコードが含まれています
- DictionaryAgent:ディクショナリ内の単語の索引および頻度を追跡し、その文をその辞書または索引の索引に構文解析するエージェント
- metrics.py :ダイアログの評価指標を計算します。たとえば、ランキングメトリックなどです。
- params.py:argparseを使ってParlAIのコマンドライン引数を解釈する
- teachers.py :ダイアログベースのタスクやデータを格納するためのデータクラスを扱う教師が含まれています
- FixedDialogTeacher :固定データを使用する教師の基本クラス
- DialogTeacher :教師が固定チャットログでダイアログを行う基本クラス
- FbDialogTeacher :FBダイアログデータフォーマットでデータを解析する関数
setup_data
を実装する教師
- thread_utils.py:Hogwildマルチスレッド(マルチプロセッシング)で使用するためのユーティリティクラス/関数
- SharedTable:メトリックを追跡するための、ロックで保護された共有メモリの辞書形式のインターフェースを提供します。
- worlds.py :タスクが内部で実行されるための一連の基本的な世界を含んでいます
- 世界 :他のすべての世界の基本クラス、
__enter__
、shutdown
、__enter__
、__exit__
- DialogPartnerWorld :ターンベースの2エージェント通信のデフォルトワールド
- MultiAgentDialogWorld :2つ以上のエージェントのラウンドロビンターンベースエージェント通信
- HogwildWorld :複数のスレッド(プロセス)を使用するときに、各スレッドごとに別々の世界を設定するデフォルトの世界
- 世界 :他のすべての世界の基本クラス、
エージェント
エージェントディレクトリには、共有使用のためにParlAIフレームワークに承認されたエージェントが含まれています。 あなたは新しいものを寄付することをお勧めします! 現在このディレクトリ内にあります:
- drqa : PyTorchに実装された注意深いLSTMモデルDrQAで、SQuadデータセットで競合する結果が得られます。
- memnn :Lua Torchのエンドツーエンドメモリネットワークのコード
- remote_agent : ZMQを介して接続するエージェントの基本クラス(memnn_luatorch_cpuはこれを使用します)
- ir_baseline : TFIDF加重マッチングで候補回答を採点する簡単な情報検索ベースライン
- repeat_label :送信されたすべてのデータを単に繰り返すための基本クラス(例えば、ファイルへのパイプ接続、デバッグ)
- local_human :キーボードからの入力をエージェントのact()関数として受け取り、人間が環境内で行動できるようにします
例
このディレクトリには、いくつかの基本ループの例が含まれています。
- base_train.py: デフォルトのエージェント親クラスを使用したトレーニング/検証ループの概要を示す非常に簡単な例
- display_data.py:agent.repeat_labelを使用して、コマンドラインで提供される特定のタスクのデータを表示します。
- display_model.py: コマンドラインで提供される特定のタスクに関する提供されたモデルの予測を表示します
- eval_model.py: 名前付きエージェントを使用して、コマンドラインで提供される特定のタスクの評価指標データを計算します
- build_dict.py:core.dict.DictionaryAgent を使ってコマンドラインで提供される特定のタスクから辞書をビルドする
- drqa: Chenらの注意深いLSTM DrQAモデルを訓練する方法を示します。 Squadで。
タスク
最初のリリースでは、次のデータセット(左側のパネルに表示されています)が含まれていました。そのうちの1つにアクセスするのは、データセット表示ユーティリティ(右パネル)に示すように、タスクの名前をコマンドラインオプションとして指定するのと同じくらい簡単です。
SQuad、bAbIタスク、MCTest、WikiQA、WebQuestions、SimpleQuestions、WikiMovies、QACNN、QADailyMail、CBT、BookTest、bAbIダイアログタスク、Ubuntu、OpenSubtitles、Cornell Movie、VQAなどの一般的なデータセットを含む、20以上のタスクが最初のリリースでサポートされました。 -COCO2014。 それ以来、VQAv2、VisDial、MNIST_QA、Personalized Dialog、InsuranceQA、MS MARCO、TriviaQA、およびCLEVRなど、いくつかのデータセットが追加されています。 現在の完全なタスクリストについては、 ここを参照してください。
ParlAIでタスクを選択するのは、上記の画像(右)に示すように、コマンドラインでタスクを指定するのと同じくらい簡単です。 以前にデータセットが使用されていなかった場合、ParlAIは自動的にデータセットをダウンロードします。 すべてのデータセットが(同じダイアログAPIを使用して)ParlAIで同じ方法で処理されるため、ダイアログエージェントは原則として、それらのいずれかの間でトレーニングとテストを切り替えることができます。 さらに、コマンドライン “-t babi、squad”などのカンマ区切りのリストを提供するだけで、これらの2つのデータセット、またはすべてのQAデータセットを一度に使用することで、一度に多くのタスクを指定できます(マルチタスク) (-t #qa)または実際にParlAIのすべてのタスクを一度に(-t #all)実行します。 その目的は、非常に豊富なダイアログモデルの構築と評価を容易にすることです。
各タスクフォルダには、
- タスクのデータを設定するためのbuild.pyファイル(データのダウンロードなど)は、初めて要求されたときにのみ実行され、タスクが使用されていない場合はダウンロードされません。
- agents.pyファイルには、core.create_taskがコマンドライン引数からこれらのクラスをインスタンス化するために使用するデフォルトまたは特別な教師クラスが含まれています(必要な場合)。
- 新しい/複雑な環境を定義する必要のあるタスクに対して、 worlds.pyファイルをオプションで追加することができます。
独自のタスクを追加するには:
- (オプション)build.pyを実装して必要なデータをダウンロードする
- 少なくともDefaultTeacher(Teacherまたはその子の1つを拡張する)を持つagents.pyを実装してください。
- データがFBダイアログ形式の場合、FbDialogTeacherサブクラス
- そうでなければ…
- データが固定ログで構成されている場合、extend DialogTeacherとcore.data.TextDataを使用することができます。この場合、core.dataに記述されている形式に従ってデータに対して繰り返し可能な独自のsetup_data関数を記述するだけです
- あなたのデータが他のフィールドを使用している場合は、呼び出されるたびにあなたのタスクからの観測を提供する独自のact()メソッドを記述します
MTurk
ParlAIの重要な部分は、データの収集、トレーニング、評価のためのMechanical Turkとのシームレスな統合です。
Human TurkerはParlAIの代理人とも見なされ、person-person、person-bot、またはグループチャットの複数の人とボットがすべて標準的な枠組みの中で会話し、エージェントにコードを変更することなく望むように役割を切り替えることができます。 これは、Turkersも、観測/アクションdictのフィールドを使用して、同じインターフェースの(かなり印刷された)バージョンを介して送受信するからです。
現在、データの収集、ボットの人間による評価、地元の人間と遠隔のトルコ人との間のラウンドロビンチャットの3つの例を提供しています。
mturkライブラリには、次のディレクトリがあります。
- コア :このディレクトリには、MTurkチャットインタフェースをサポートするAWSバックエンドを設定するためのコアコード、HITの作成と承認のためのコード、MTurkインタフェースを標準
Agent
クラスにカプセル化するラッパークラスMTurkAgent
います。 - タスク :このディレクトリには、3つのサンプルのMTurkタスクが含まれています。
- qa_data_collection :SQuadのランダムな段落を与えられたターッカーからの質問と回答を得る。
- model_evaluator :Redditムービーダイアログデータセットの情報検索ベースラインモデルを評価するようturkersに依頼します。
- multi_agent_dialog :ローカルの2人の人間エージェントと2人のトルコ人の間でラウンドロビンチャット。
MTurkタスクを実行するには:
- 実行するタスクのディレクトリに移動します。
-
<num_hits>
、<num_assignments>
、<reward>
を適切に設定して、python run.py -nh <num_hits> -na <num_assignments> -r <reward> [--sandbox]/[--live]
を実行します。 ライブをプッシュする前に--sandbox
を使用してMTurkサンドボックスモードでタスクを実行してください。
独自のMTurkタスクを追加するには:
- 新しいタスクのためにmturk / tasksディレクトリ内に新しいフォルダを作成する
- task_config.pyを実装します。task_config.pyには、少なくとも次のフィールドがあり
task_config
。-
hit_title
:HITに含まれるタスクの種類についての短い記述的なタイトル。 Amazon Mechanical TurkのWebサイトでは、HITのタイトルが検索結果に表示され、HITがどこにでも記載されています。 -
hit_description
:説明には、HITに含まれるタスクの種類に関する詳細情報が含まれます。 Amazon Mechanical TurkのWebサイトでは、HITの説明が検索結果の拡大表示とHITと割り当て画面に表示されます。 -
hit_keywords
:HITを記述する1つ以上の単語またはフレーズをコンマで区切って指定します。 MTurkのウェブサイトでは、これらの単語がHITを検索するために使用されます。 -
task_description
:HITタスクのプレビューページとチャットページの左側に表示される詳細なタスクの説明。 HTMLフォーマットをサポートしています。
-
- MTurkAgentが
MTurkAgent
住んでいるのかを設定し実行するためのコードでrun.pyを実装します。 - (オプション) worlds.pyを実装し、Worldクラスから
World
クラスまで拡張します。
MTurkの例と独自のタスクを作成して実行する方法については、MTurkチュートリアルを参照してください。
サポート
バグレポートや機能リクエストについてご不明な点がございましたら、お気軽にGithub Issuesのページに投稿してください 。
チーム
ParlAIは現在Emily Dinan、Alexander H. Miller、Kurt Shuster、Jack Urbanek、Jason Westonによって管理されています。 他の主要な貢献者の非網羅的なリストには、ウィン・フォン、アダム・フィッシュ、ジャセン・ルー、アントワーヌ・ボーデス、デヴィ・パリキ、ドルフ・バトラー、フィリップ・デ・アビラ・ベルベット・ペレス、チャオ・パンが含まれる。
引用
あなたの仕事でParlAIを使用する場合は、 arXivの論文を引用してください:
@article{miller2017parlai,
title={ParlAI: A Dialog Research Software Platform},
author={{Miller}, A.~H. and {Feng}, W. and {Fisch}, A. and {Lu}, J. and {Batra}, D. and {Bordes}, A. and {Parikh}, D. and {Weston}, J.},
journal={arXiv preprint arXiv:{1705.06476}},
year={2017}
}
ライセンス
ParlAIはBSDライセンスを受けています。 我々はまた、追加の特許付与を提供する。