今回は、Transformer[1]を利用した対話システムにおいて応答を制御する情報の与え方について調査と実験を行ったので、結果を紹介します。
はじめに
自然言語処理には、「人の言葉を生成する」ことを目的とした様々なタスク(言語生成タスク)があります。例えば機械翻訳、文書要約、イメージキャプショニング、対話システムなどです。最近では、これらの言語生成タスクは、ニューラルネットワークを利用して取り組まれることが多くなっています。しかし、現状ニューラルネットワークを利用した言語生成は不安定で、実用にあたって課題が残ります。学習に使ったコーパス内の単語出現頻度を元に単語選択や文生成をしているので、生成文に意味的/言葉遣い的な一貫性が無かったり、何を言い出すか分からない怖さがあったりします。これに対する解決策の一つとして、例えば、学習に使用するコーパス自体に制限をかける(ある傾向に沿うようにコーパスを作成する)ことが考えられますが、データ作成コストやデータ量不足の問題が発生します。別の解決策として、モデルへの入力データとして制御情報を渡すことで、出力を制御する方法があります。モデルが制御情報を参考に文章を生成することで、口調や言葉遣い、内容などを分岐できると考えられます。更に、この方法であれば、規模の大きなデータセットでも制御情報をアノテーションするだけで、全てのデータをモデル学習に利用できます。データセットを初めから新しく作るようなコストも減らせます。一方で、この方法では「制御情報をモデルのどの段階で参照するのが効果的なのか」という問題が残ります。そこで、本記事では、この点について比較実験を行いました。本記事では、Transformerモデルを利用した対話システムでの制御情報の付与について紹介します。より具体的には、対話システムへのパーソナリティ付与を例にとって、モデルのどの段階で制御情報を与えるべきか実験を行い比較しました。データセットにはConvAI2[2] コンペティションの PersonaChat[3]データセットを利用しました。なお、対話システムへのパーソナリティ付与研究やタスクについての詳細は弊社ブログの”チャットボットは個性を獲得できるのか?“をご覧ください。
対話応答生成について
まず、一般的な対話応答生成について紹介します。対話応答生成について大雑把な見方をすると、ある文章(発話X)に対する応答Yとして適切そうな文章を返すタスクと考えられます。
- 発話X:
家にいる時は何をしていますか。 - 応答Y:
よく音楽を聴きます。
- 発話X(トークン):
家 に いる 時 は 何 を し て い ます か 。 - 応答Y(トークン):
よく 音楽 を 聴き ます 。
- 形態素分割例(MeCab IPADIC):
家 に いる 時 は 何 を し て い ます か 。 - sentencepiece例(1):
家に いる 時は 何を して います か 。 - sentencepiece例(2):
家にいる 時は 何を して いますか 。
P(Y \mid X) = \prod_{t=1}^T P(y_t \mid x_1, x_2, …, x_n, y_1, y_2, …, y_{t-1})
具体的な対話の例で考えると、「家に→いる→時は→何を→して→います→か→。→(話者交代)→よく→?」
という流れにおいて、「?」の部分に「音楽」というトークンが出力されるような条件付きの確率分布を求めることになります(そうなるように学習コーパスを元にモデルを最適化します)。Seq2Seqな学習には時系列情報を扱えるRNN等が採用されることも多いですが、最近ではAttentionという仕組みを利用したTransformerモデルがよく利用されています。次節でTransformerについて簡単に紹介します。
Transformer について
Transformer[1]は機械翻訳で提案されたモデルで、Seq2Seqな学習を効率良く高精度で行えるため、現在自然言語処理の分野で幅広く利用されています。有名なBERTやALBERT、GPT-3といったモデルの基本構造は全てTransformerモデルが元になっています。Transformerでは、入力発話Xをエンコーダによって特徴量化し、それを元にデコーダで応答Yの単語確率分布を予測します。図1はTransformerのモデル図で、左側のスタックがエンコーダ、右側のスタックがデコーダになります。

- 発話X(トークン):
家に いる 時は 何を して います か 。 - 辞書:
{ “家に”: [0.1, 0.2, 0.3],
“いる”: [0.3, -0.2, 0.1],
…,
“。”: [1.0, 1.0, 1.0],
“よく”: [0.1, 0.1, 0.1],
… } - 発話X(3次元):
[[0.1, 0.2, 0.3], [0.3, -0.2, 0.1], …, [1.0, 1.0, 1.0]]
PE(pos, 2i) = sin(pos/10000^{2i/d_{model}})
PE(pos, 2i+1) = cos(pos/10000^{2i/d_{model}})
上記の式で表されるPosition-Encodingを可視化すると図2のようになります。
Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V
Q、K、VはそれぞれQuery、Key、Valueを表しています。これはAttentionをMap構造(Pythonでは辞書型のデータ構造)に見立てた表現となります。あるトークンに対応するAttentionの出力特徴量を知りたい場合、そのトークンのAttention前の特徴量をQueryとします。Attentionは、Queryをある系列に含まれるトークン特徴量の重み付き和として説明しなおす処理です(具体的なイメージは以降の図3、4に示します)。Attention出力を説明するトークンの重みは、「ベクトルの内積をもとにした類似度」と定義しています。この重みの算出過程で、Queryとの間の類似度計算に利用される系列の特徴量がKeyです。つまり、 Queryが与えられた際に「系列中のどのトークンをどの位の重要度で取得するか」の情報を担うのがKeyです。そして、算出した重みを利用して、説明に用いるトークン特徴量(Value)の重み付き和を算出しています。
TransformerモデルのAttentionは、データの渡し方によって2種類の使われ方があります。それぞれSelf-AttentionとSource-Target-Attentionと言います。
Self-Attentionは、エンコーダやデコーダの層内で、系列中のトークンの意味をその文脈に即して解釈する役割を担っています。Self-AttentionのQ、K、Vには、エンコーダであれば発話Xの特徴量のみ、デコーダであれば応答Yの特徴量のみ、というように全て同じものを入力します。つまり、ある系列のあるトークンの特徴量を、その系列に含まれる全てのトークン特徴量の重み付き和で表すわけです(図3)。


head_n = Attention(Q_{n}W^Q_{n}, K_{n}W^K_{n}, V_{n}W^V_{n})
MultiheadAttention(Q, K, V) = concat(head_1, …, head_n, …, head_N)W
エンコーダとデコーダの構造の違いは主にSource-Target-Attentionを含むか否かになります。エンコーダはSelf-Attentionと、一般的なFeedForward層の2種類の層からなるスタックです。
一方、デコーダはSelf-Attention、Source-Target-Attention、FeedForward層の3種類の層からなるスタックです。デコーダのSelf-Attentionでは、応答Yの特徴量全てを使って和を求める性質上、説明されるトークンの時点では知り得ない未来のトークン情報も考慮してしまいます。そこで、学習時は説明されるトークンより未来のトークン特徴量をマスクによって無視し、推論時は自己回帰的に推論することで解決しています。なお、Source-Target-Attentionは説明に用いるのが発話Xなので、未来の情報についてのマスキングは行いません。
デコーダでは最終スタックの出力を辞書の語彙数次元に線形変換してから softmax 関数によって予測語彙の確率分布を出力します。
対話文脈への適用
これまでの例では、1ターンの対話を扱ってきました。一方で、対話は複数ターン連続するものです。対話システムの対話文脈対応はそれだけで研究テーマとなっている分野ですが、Transformerモデルを利用した対話システムでは、大まかに2種類のモデルで対応されることが多いようです。 一つは、単純にこれまでの対話履歴全てを結合してエンコーダに渡す手法です。今回の実験では、ターンや話者の違いを示すために2つのことを行います。まずは、発話と発話の間に、ターンの区切り目を表す<SEP>という特殊なトークンを挟みます。次に、その発話が何ターン目の発話かを表すEmbeddingを、各トークン特徴量に加えます。この手法はこれ以降単純にTrmとします(図5)。

Embed_{sentence} = \frac{\sum_{n=1}^{N} w_n}{\sqrt{N}}
対話応答生成モデルの制御方法
対話応答生成モデルを制御するタスクや手法はいくつか考えられます。タスクについては、今回はパーソナリティ付与タスクを扱います。手法については、モデルへの入力として制御用の特徴量を付与することで、その特徴量によって応答を変化させる、という手法に絞っています。制御用の特徴量は、他モデルを利用して学習を行った場合でも取得しやすいように、ベクトルを想定します。さらに、特徴量による条件分岐では、どの段階で特徴量を付与するのかという問題が考えられます。
一つは、Transformerのエンコーダ側で制御を行う方法(以降、「エンコーダ制御」)です。エンコーダ制御では、これまでの発話履歴、あるいは直前の発話に対して制御用の特徴量を結合する方法です(図7)。今回の実験モデルでは、Trmモデルは文頭に制御用ベクトルを結合すること、HTrmモデルはContext Encoderの前で対話履歴の文章特徴量と制御用ベクトルを結合することとします。
この手法は、RNN系のモデルでは、翻訳タスクにおける多言語翻訳システム[5]や、対話応答生成タスクにおけるPersonaChat[3]のSeq2seq+Attentionで用いられています。Transformerモデルでも、例えば、知識利用対話システムのWizard of Wikipedia[6]などで用いられています。
以上のように、利用されることの多いエンコーダ制御ですが、「デコーダ層内のSource-Target-Attentionで制御情報を利用した計算が行われているとは言え、本当に推論の上で効率的なのだろうか」という疑問があります。

