強化学習
対話システム
NextremerDay 13

End-to-Endでタスク指向対話するTC-Botを紹介してみる

TC-Botとは?

Nextremer Advent Calendar 2017 13日目の記事です。

TC-BotはMicrosoftResearchが発表したEnd-to-End Task-Completion Neural Dialogue Systemsの著者による実装です。
これは論文のタイトル通り、タスク指向対話をEnd2Endで行なうテキストベースの対話システムになります。
TC-Botの特徴としては次の2つがあります。

  1. 強化学習による対話管理
  2. ユーザシミュレータを使用した対話管理部の学習

ユーザシミュレータとは、ルールベースでユーザの応答規則を記述したシミュレータです。
TC-Botでは、このユーザシミュレータとの対話を通してエージェント(対話管理部)の学習を進めてゆきます。

ユーザシミュレータを使用することにより、
1. 従来の対話コーパスを強化学習の訓練データに使用できる
2. 一定の応答精度になるまでモデルをオフラインで訓練できる

といったメリットがあります。

TC-Botではデフォルトでは映画チケット予約、映画検索、の2つのタスクを行なうことができます。

提案手法について

スクリーンショット 2017-12-12 21.35.15.png
([2]より引用)

システムの概要は上図の通りです。

映画チケット予約タスクを例に説明すると、
ユーザシミュレータは各エピソードにおいて達成したいGoalを持っています。
Goalはjson形式で表現されます。
例えば「『明日』『シアトル』の『regal meridian 16』で『16時』から上映する『ズートピア』を観る」だと次のようになります。

{
"date":"tomorrow",
"city":"seatle",
"place":"regal merdian 16",
"starttime":"16:00",
"moviename":"zootopia"
}

対話を通じてユーザシミュレータからこの条件を聞き出し、条件マッチするチケットを規定ターン以内に予約することができればタスク成功となります。

なお、シミュレータとエージェントがやり取りする意味フレームは次のような形式で表現されます。

{
  "request_slots": {
    "ticket": "UNK"
  },
  "diaact": "request",
  "inform_slots": {
    "theater": "regal meridian 16",
    "moviename": "zootopia"
  },
  "nl":"Can I get tickets for zootopia at regal meridian 16?"
}

diaactは発話行為で、inform slotsは伝達する情報、request slotsには要求する情報、nlにはこれらを自然言語で表現した文が入ります。
これらのやり取りで対話を進めていきます。

またエージェントの入力値となるのは対話履歴です。
前ターンのユーザの発話行為、inform slots・request slotsののone-hot表現、既に回答済みのスロット情報などがベクトル化され状態として表現されます。

まとめるとTC-Botにおける設定は次のとおりです。

環境 = ユーザシミュレータ
行動 = 発話行為・スロット
状態 = 対話履歴
報酬 = タスク成否

報酬はタスクの成否に応じて固定で、学習が進むに連れより早くタスクを達成できるようになってゆきます。

使い方

READMEに詳しく書かれているので説明の必要は無いかと思いますが、次のコマンドでDL〜学習を開始できます。
なお、Pythonは2.X系でないと動きません。

$ git clone https://github.com/MiuLab/TC-Bot.git
$ cd TC-Bot/src
$ python run.py --agt 9 --usr 1 --max_turn 40
          --movie_kb_path ./deep_dialog/data/movie_kb.1k.p
          --goal_file_path ./deep_dialog/data/user_goals_first_turn_template.part.movie.v1.p
          --write_model_dir ./deep_dialog/checkpoints/rl_agent/
          --dqn_hidden_size 80
          --experience_replay_pool_size 1000
          --episodes 500
          --simulation_epoch_size 100
          --run_mode 3
          --act_level 1
          --batch_size 16
          --warm_start 1
          --warm_start_epochs 120

感想

TC-BotはEnd-to-Endでのタスク指向対話を行なう対話システムです。
実装もnumpyの使用以外はほぼフルスクラッチで書かれており、対話システムとしても非常にシンプルに実装されているので、色々と参考になります。

強化学習での対話管理は現時点ではまだまだ課題も多いですが、柔軟な対話には欠かせない技術だと思うので、今後の動向も目が離せません。

参考

[1]MiuLab/TC-Bot
[2]End-to-End Task-Completion Neural Dialogue Systems
[3]A User Simulator for Task-Completion Dialogues