Skip to content

Deep Reinforcement Learning for Dialogue Generation

Higepon Taro Minowa edited this page Feb 21, 2018 · 95 revisions

ルール:ごまかさない。日本語でOK。適宜手書きの数式など入れること。

参考リンク

あらすじ

papers/deep-reinforcement-learning-for-dialogue-generation.md の和訳。

この論文は、generic や繰り返しループになってしまう response をコントロールするために neural conversational agents をつくるためのいくつかのアイデアを組み合わせている。 モデルは seq2seq + attention でまず MLE loss で学習する。その後特定の conversational properties のために最適化されるように policy gradients で微調整される。具体的には3種類のrewardを定義している。

  • 返事のしやすさ: 手動で集めた返事のしづらいつまらないレスポンスのリストにあるレスポンスを返してしまう確率ではかる。確率が小さいほうrewardが高い。
  • 情報の流れ: 同じ人からでる連続したレスポンスには異なる情報があるべき。cosine similarity が小さいほど良い
  • 意味的結束性: source と target の相互情報量。問いかけに対して response は make sense でないといけない。q: question, a: answer のとき P(a|q) + P(q|a)

モデルはいつもの supervised objective function で事前学習される。source は直前2つの発話をつなげたものだ。そしてそれから2段階の policy gradient 学習をする。1つ目は相互情報量だけをrewardとしたもの、そし2つめは先述の3つを組み合わせたものだ。その policy network (= seq2seq model) は state(1つ前の発話)が与えられたときに各レスポンスごとの確率分布を生成する。

ひとつのiterationで gradient を概算するために、seq2seq model はfrozen されて複数のレスポンスをモデルから生成する。レスポンスごとのrewardはその後平均を取る。gradientはレスポンスに現れる最初のL個のtokenから MLE を利用して、残りの T - Lはpolicy graidient を利用して計算される。その際に L は徐々に0に近づける。(= longterm reward に近づける)

結果の評価は会話の続いた長さ、現れた unigram, bigrams のユニーク数とhとの評価。

Abstract

seq2seq は良いのだけど未来の会話の方向性を無視した近視眼的な output を出しがち。future reward をモデル化することで良いゴールを達成するよ。提案するモデルでは2人の virtual agent をシミュレートする。vitual agents は policy gradient mothods を使って良い sequence がでるように reward を与えられる。

Intorduciton

Seq2Seq は1つ前の発話から、次に最も起きそうな発話を generate する。Seq2Seq はすごく良いけど2つの問題点がある。

(1) maximum-likelihood estimation (MLE) objective function 使っているけど。これが人間相手の会話で一番良い方法かわからないよね。人間と会話することを教えるのにこれ最善なのだろうか。面白くて、多様で、情報に富んだフィードバックを提供しつつユーザーを keep engaged できるかな。 具体的な例としては seq2seq はすごく generic な返事をしがち。I don't know とか。(筆者注:これは僕の chatbot でも起こっていて問題視している)

(2) 無限ループに入るパターンがあること。 例)

A: Where are you going? 
B: I’m going to the restroom.
A: See you later.
B: See you later.
A: See you later.
B: See you later.

これも MLE が繰り返しを認識していないことが原因である。

というわけなので以下の2点の改善ができそう。

(X) chatbot の真の目的を reward として定義できる (MLE ではなく)

(Y) generic response が long term でどういう影響をあたえるのかモデリングする

Neural reinforcement learning (RL) というものを導入する。これにより developer が long term rewards を設定できる。これらを実現するために seq2seq を backbone として、2人の virtual agent が可能性のある返信を模索しつつ予想される reward を最大化するように動作する。 我々の良い会話の定義は

  • 将来を考慮している(forward-looking)
  • 会話のキャッチボールが続く(interactive)
  • 首尾一貫としている(coherent)

でこれらをヒューリスティックにおおよそ定義する。 ちなみに MLE は最尤推定な。

Related Work

3.Reinforcement Learning for Open-Domain Dialogue

RL のコンポーネントについて説明する。提案する学習システムは2人の agent から構成される。1つめのagentから生成された文を p、2つめのagentからのものをqとする。agent は順番にお互いに話しかける。全体の会話は p1, q1, p2, q2, ... のように2人の agent から生成された文の sequence として表現できる。agent たちが seq2seq model によって定義された policy に沿ってとったactionが文のsequenceを生成したという見方もできる。seq2seq のパラメータは 4.3 で詳しく説明される policy search を利用して future reward を maximize されるように最適化される。Q-learning (todo) を使うよりも policy graident を利用するほうが適切である。そうすることによって seq2seq を MLE で最適化したパラーメタ(もっともらしい返事をするもの)で初期化してから、long term reward に最適化するように policy を変更することができるようになる。

3.1 Action

Action a とは生成しようとしている発話のことである。会話の sequence の長さは任意なのでaction空間はinfiniteである。

3.2 State

State は一つ前の会話を指し [pi, qi] とする。pi と qi を文字列連結したものを LSTM encoder にfeedすることで会話のヒストリーはvector形式の内部表現に変換される。

3.3 Policy

Policy はP(pi+1|pi, qi) のように LSTM encoder decoder の形式で表される。一つ前の会話 pi, qi が与えらたときに pi + 1 が生成される条件付き確率。Policy は確率論的な(stochastic)な表現を使う。deterministic policy は諸々の理由により使わない。

3.4 Reward

Reward r はそれぞれのactionに対して得られる。(つまり発話ごとに)。

Ease of answering

機械によって生成される文は返事がしやすいものであるべきだ。本論文では「返事のしやすさ」を「つまらない返答」が発話される確率の -log として定義することを提案する。我々は手作業で「つまらない返答」Sのリストを作った。リストは8つの "I don't know" など seq2seq でよく起こりがちな見られるものからなる。

他にもたくさん「つまらない返答」は生成されるが vector 空間でSと似たような領域にいるので大丈夫。pseq2seq と P(p i+1|pi, qi) は違うものだ。前者はMLE objective で最適化されたもの、後者はRLセッティングによってlong-term future に最適化された policy だ。

Information Flow

Agent 達は各会話ターンで対話を先にすすめて繰り返しを防ぐために新しい情報を提供するべきだと考える。そのため同じ agent は連続したターンで似たような文を生成した場合 penalty 受けるべきだと提案する。下記 hpi と hpi+1 の cosine similarity を使ってこの reward を表現する。

Semantic Coherence (意味的な整合性)

生成された文が reward が高いが、文法がおかしかったり整合性が取れていないような状況を避けるために、文の適切性も量る必要がある。そのため action a と過去のターンの相互情報量を使い、それらが保証されるようにした。

p_backward は Seq2Seq で source と target をひっくり返して学習させたものである。target の length の影響をコントロールするためにそれぞれ 1/N してある。 (higepon:注)これは a と qi が関連が高いほうが reward が高くなるということかな。

注:相互情報量(そうごじょうほうりょう、英: Mutual information)または伝達情報量(でんたつじょうほうりょう、英: Transinformation)は、確率論および情報理論において、2つの確率変数の相互依存の尺度を表す量である。最も典型的な相互情報量の物理単位はビットであり、2 を底とする対数が使われることが多い。

最終的な total の reward は

である。

Simulation

2つのagentが順々にお互いに話すプロセスをシミュレートすることで、state-action空間をexploreして、rewardを最適化するポリシー pRL(Pi+pi, qi)を学習できるようにするというのがここでのメインアイデアである。AlphaGo-styleの戦略をとった、それはRLシステムをgeneral response generation policy (ただ seq2seq で学ばせたもの?)で初期化することだ。

4.1 Supervised Learning

まずは Seq2Seq model with attention で80 million (source, target) pair をトレーニングする。対話データのすべてをそれぞれ target として、その前の2つをconcatしたものを source とした。

4.2 Mutual Information (相互情報量)

Li et al. (2016a) にあるように式3から direct decode するのは無理である。2項目が完全に生成された target string を必要とするからだ。我々は相互情報量が最大なresponseを生成する問題を、reinforcement learning 問題として考える。そこでは相互情報量 reward はmodelがsequenceの終端に到達したときに観察される。

Ranzato e al. (2015) と同様に最適化には policy gradient methods を利用している。我々は、policy model pRL を予めトレーニングされた pseq2seq(pi, qi) を利用して初期化する。Input source [pi, qi] が与えられたときに、候補リスト

を生成する。生成された各候補 a^ にたいして、事前トレーニング済みのp_seq2seq(a|pi, qi) と p_backward(qi|a)から相互情報量m(a^,[pi, qi]) を計算する。相互情報量スコアは reward として使われて、encode-decoder model に back-propage される。そうすることでそれが高い reward のものをせいせいするように。詳細は Zaremb and Sutskever (2015) and Wiliams (1992)を見て欲しい。 sequence に対する reward は以下の通り。

gradient は "the likelihood ratio trick" を利用して見積もりされる。

encoder-decoder の中のそれらのパラメータは stochastic gradient descent を使って更新される。Ranzato et al. (2015) と Bengio etal., 2009 にあるようにカリキュラム learning strategy を利用している。それは長ささが T の各シーケンスに対して最初の L 個のトークンに MLE loss を使用する。残りの T - L トークンには前述の reinforcement algorithmを使う。われわれはゆっくりと L をゼロに近づけて強化する。Learning の分散をちいさくするために baseline strategy を使う(?)。つまりもう一つの neural model (seq2seqのこと?)が生成された target と最初の source を input としてとり、baseline value を出力する。Zaremba and Sutskever (2015) と同様の strategy である。

最終的な gradient は

4.3 Dialogue Simulation between Two Agents

2つのagentのプロセスは以下のとおりだ。最初のステップでは training set からメッセージが1つ、1つめのagent に渡される。そのagentはそのメッセージをencodeしてvector表現にする。そしてdecodeプロセスを開始する。いま出力(decode)したものを会話ヒストリとくっつけて、それをsecond agent に渡す。second agent はそれを vector 表現に encode して decode する。これを first agent にわたしてそれを繰り返す。

最適化

前項で述べたように相互情報量モデルを使用して policy model pRL を初期化する。その後、予想されるもっと大きな reward を獲得するようなパラメータを見つけるために policy gradient methods を使う。 未来の reward を最大化するための objective function は

である。ここで R(ai, [pi, qi]) は ai から生じる reward を指す。gradient の更新には likelihood ratio tric を使う。(詳しくは論文読め)

上の式も詳細は論文読め。

4.4 Curriculum Learning

対話を2ターンでシミュレートするところから初めて、徐々にシミュレーションのターンを増やすことで curriculum learning strategy を採用している。我々は多くて5ターンまで生成する。それ以上は exponential に増えるので大変。

5.Experimental Results

5.1 Dataset

対話のシミュレーションでは agent に初期投入するデータは高品質であることが必要だ。例えば why? はふさわしくない、なぜならその後会話がどう進むべきなのか分からないからだ。OpenSubtitles dataset から一部の10 million を取り出して、そこから I don't know のような結果が出てくる可能性が低い 0.8 million の sequence を取り出した。

5.2 Automatic Evaluation

対話のシステムの評価は難しい。BLEU や perplexity が広く使われているが、我々は採用しなかった。long-term の reward を目標としているからだ。

Length of the dialogue

最初に提案するmetricはシミュレーションでの対話の長さである。テストセットは1000の入力メッセージ。circular 対話を防ぐためにシミュレーションの turn を 8 よりも小さくすることにした。Table 2にあるように相互情報量がある方が会話が持続する。

Diversity

我々は diversity の度合いを生成されたレスポンスに含まれるユニークな unigram と bigram の数をレポートしている。ただ長いだけの文が好まれるのを避けるためにそれらの値は # of generated tokens でスケールされている。standard な Seq2Seq と提案している RL model 両方共、beam search (beam_size=10) を使用している。mutual information model に関しては、まず最初に p_seq2seq(t|s) を利用して n-best lists を生成し、p_seq2seq(s|t) を利用してリニアにそのリストを rerank する。結果は Table 4 にあるように RL が一番 diverse な結果を generate する。

Human Evaluation

long term の会話に関して RL はスコア良かったよ。略。

Qualitative Analysis and Discussion

6. Conclusion

改善したぜ!

ゼロからDeepまで学ぶ強化学習からの引用

ゼロからDeepまで学ぶ強化学習 - Qiita 強化学習では、このように「連続した行動の結果」に対する報酬から、各行動の「評価」を自分自身で更新します。これにより、各行動に対する報酬を逐一設定しなくても、自らの評価を基に最終的に報酬が得られる連続した行動を学習してくれるというわけです。

強化学習が対象とする問題を、以下のようにモデル化します。

States: S
状況。ゲームでいえば、特定の局面を表す
Model: T(s, a, s') (=P(s'|s, a))
TはTransitionで、状況sの時に行動aをとると状況s'になる、ということ。ただし、aを選択しても発動しなかったり別のところに行ったり、といった状況を表現するため確率的な表現(P(s'|s, a))になる
Actions: A(s), A
行動。状況によって取れる行動が変わる場合は、A(s)といった関数になる
Reward: R(s), R(s, a), R(s, a , s')
状況、またその状況における行動から得られる報酬。この報酬は、最後の結果以外は自己評価になります(即時報酬)。
Policy: $\pi(s)$ -> a
戦略。状況sにおいてどういう行動aを取るべきか、を返す関数。

Policy Gradient 解説

方策勾配法 - Qiita 強化学習その3

コードの理解

メモ

https://twitter.com/HigeponJa/status/910469321523994625

Policy gradient 本格理解への道

解決済み loss が nan になる debug メモ

事実

  • loss = nan
  • hoge shape(1, 1000) の min = -inf max=inf になっている
  • logprob min=-inf max=0.0
  • hoge = logprobs * self.advantages
  • self.advantages は正常な値

方針1: logprob を見直す

  • A2=self.probs の値はどうか? max 1.0 min 0.0

Policy Gradient + seq2seq 理解への道

  • pre-trained な seq2seq は P(reply|tweet) tweet を入れたときの replyの確率分布。これは cost function が MLE で train されている。
  • さて agent で train するときは、agent の random な発話が良いかどうかわからない(train データない)のでとりあえず、もうひとりの agent に reply させる。reply を使って reward をゲットした後に。reward を考慮した cost function で再 training する。
  • tensorflow 的には cell たちを cost_origin と cost_ri が共有する感じかな。

seq2seq の logProb の求め方

  • 動機: p(reply|tweet) は RL で重要。なぜならば、それを利用してp(つまらないreply|tweet) などを求めて reward に使うから。
  • p(reply|tweet) は step の logits として返されている。each logit が各 token にマッチしていて logit は (vocab1_prob, vocab2_prob, ...) みたいな形になっている。つまり reply の先頭が You なのか I なのかその確率を知りたければ logits[0][You_id] と logits[1][I_id] を使えば良い。
  • つまり prediction のときは map(argmax(logit), logits) 的にすれば良い。
  • dull response 例えば thank you が出現する確率は logits[0][thank_id] * logits[1][you_id] となる logprob なら足し算。
  • logProb

logprob の計算を debug しながらやりたい

  • すぐに起動する軽量モデル
  • コマンドラインフラグ
  • できれば動くものを
  • 小さな学習セットで

logProb の次

  • これは rewards の期待値の最大化問題。かずかずの入力 tweets に対して 確率 p から replies を生成してそのときの reward を算出。その reward * reply の出る確率の総和が期待値なのでそれが最大化するようにネットワークを最大化する
  • つまりここで必要なのは
    • done: 小さなデータセットの実験
    • done: tweet に対して間違ってもいいから reply をかえすもの
    • reward を計算するもの
      • mutual information を計算するには reply|tweet を swap した確率も必要
      • (1) model を seq2seq MLE で最適化 -> (2) Mutual Information だけで最適化 -> (3) すべての reward で最適化
    • なので 簡単な reward で学習できる仕組みを作る -> 逆 seq2seq をサポート -> Mutual information で学習 -> Total rewards で学習 -> 結果を見る
    • reward * reply を入力するグラフとそれを最大化するもの
    • 学習

reward の仕組みが意図通り動いているかを簡単に確かめる方法

  • 前提となるデータフロー -- トレーニングデータ: tweet = "もう月曜だわー" reply="働きたくないでござる" -- rl_model: tweet にたいして rl_reply = "おはようー" -- seq2seq.reward_ease_of_answering(rl_reply="おはようー", dull_response=["おはよう", "笑"]) --- todo これあってる? => YES --- todo loss の部分あってる? --- rl_reply を seq2seq_model に入れると高い確率で dull_response が返るので reward は小さい -5 とか --- reward × loss で loss が調整される

A Diversity-Promoting Objective Function for Neural Conversation Models

abstract

seq2seq の response は I don't know のような安全で何にでも適用可能なものになりがちである。output likelyhood を objective function にするのはこういう用途には合わない。その代わりに Maximum Mutual Information を objective-function として使うことを提案する。これを使うと diverse で interesting で apropriate response になるよ。

Introduction

abstract と同じ内容。

2. Related work

3. Seq2Seq

4. MMI Models

4.1 Notaion

  • S (Source): 入力のメッセージ Sequence S = {s1, s2, ..., sNs}
  • Ns: S にある words の数
  • T (Target): レスポンス正ーケンス T= {t1, t2, ..., tNt, EOS}
  • Nt: レスポンスの長さ EOSは含まず
  • D: D次元の embeddings

4.2 MMI Criterion

Standard な seq2seq の objective function は S に対していくつもの T が考えられる中で argmax { log(p(T|S)) } となる。我々はこれが generic response を返す要因となっていると考える。なぜならば source から target を選んでいて、逆はしてないからだ。これを改善するために、MMIで置き換えることを提案する。MMIでは source S と target T のペアとしての mutual information を最大化するパラメータを選ぶ。 mutual information は log p(S, T) / p(S)p(T) と表せる。これにより response が高確率のものにいくのではなくて、source に bias するようなものが選ばれる。 MMI objective function は argmax { log(p(T|S) - log(p(T)) } ともかける。(注)これはつまり、source S によらず出現している T を差し引いていることに相当する。 われわれは -log(p(T)) のペナルティの割合をλというハイパーパラメータで制御する。training のたびにλを変えて色々試すのは大変だったので train 時は maximum likelihood で。test 時に NMI criterion を使った。

4.3 Practical Consideration

responses は式9(MMI-antiLM) と式10(NMI-bidi)どちらからでも出力できる。しかしながら文法がおかしいものがでたり(antiLM)、decoder が扱いづらくなる(bidi) 。残りのセクションではこれらについて議論する。

4.3.1 MMI-antiLM

log(p(T|S)) - λlog(p(T)) の第二項は高頻度で、generic な返事ばかりか、fluent な返事にすらペナルティを課してしまう。そのため返事が文法的におかしくなる。このためこれは anti-language model と呼ばれる。理論上はλが1より小さければこれは起きない。なぜならばそうすれば文法的におかしなものは第一項でつよいペナルティを受けるはずだから。ただ実際にやってみるとそれをかいくぐって文法的におかしいものが現れる。

Solution

まず p(T) を式9から式11に書き換える。その p(T) の代わりに式12 の U(T) を定義して第二項として使うとうまくいく。 うまくいく理由。 まず neural decoding は一つ前に作られたRNN state と一つ前に predict された word の両方を使って行われる。decode が進むにつれて、 decoding の最初の input(つまり source を encode した結果)の影響が小さくなる。言い換えるならば、最初に predict されたワードが response sentence がどうなるかに多大な影響を持ってしまう。最初に predict されたワードの影響にペナルティをもたせるとより良い結果が得られる。次に、decode の入力の影響が減るに連れて、language model の影響が支配的になる。われわれは文法間違いが文の後半によく現れることを見つけた。 g(k) は最も簡単な形で定義した。

4.3.2 MMI-bidi

例の式から decode するのは難しい。なぜならば第2項 log(p(S|T)) は T の生成が全て終わっていないといけない。全ての T を生成するのは現実的ではない。そのためまずは Seq2Seq の p(T|S) から best N result を生成してその後例の第二項で rerank する。seq2seq の best N result は文法的におかしくないことが多いので、その後のプロセスでも文法的に正しくなりがちである。この reranking は明らかな欠点がある。 global optimal solution ではない。しかも diverse N best results をとるためには長いリストになる。

とはいえ bidi も antiLM も良い結果を返す。

4.4 Training

最近の研究で single LSTM よりも deep LSTM のほうが良い結果を出すことが分かってきた。われわれは 4 layer encoder and 4 layer decoderを使っている。それぞれの layer が違うパラメータで成り立っている。LSTM layer は 1000 hidden units 。word embedding の dimension は 1000 である。

  • LSTM / embedding parameters は -0.08 〜 0.08 の uniform distribution
  • stochastic gradient decent is implemented using a fixed learning rate of 0.1
  • batch size 256
  • gradient clipping は norm が 1 を超えたら適用
  • Tesla K40 で 600-1200 tokens
  • P(S|T) は P(T|S) の T と S を交換したものとしてトレーニング

4.5 decodding

4.5.1 MMI-antiLM

4.3.1 で述べたように log(p(T|S)) - lambda * U(T)を使った decode は each time-step で生成される token を使って用意に実装できる。また decode 時に response の長さを考慮することも重要であるとうことに気づいた。loss function で長さのペナルティを追加した。

4.5.2 MMI-bidi

略」

5. Experiments

5.1 Datasets

結論は MMI-bidi が良いということ

Clone this wiki locally