Transformerを利用した対話システムの応答制御について

こんにちは。先進技術部でアルバイトをしている上垣です。
今回は、Transformer[1]を利用した対話システムにおいて応答を制御する情報の与え方について調査と実験を行ったので、結果を紹介します。

はじめに

自然言語処理には、「人の言葉を生成する」ことを目的とした様々なタスク(言語生成タスク)があります。例えば機械翻訳、文書要約、イメージキャプショニング、対話システムなどです。最近では、これらの言語生成タスクは、ニューラルネットワークを利用して取り組まれることが多くなっています。しかし、現状ニューラルネットワークを利用した言語生成は不安定で、実用にあたって課題が残ります。学習に使ったコーパス内の単語出現頻度を元に単語選択や文生成をしているので、生成文に意味的/言葉遣い的な一貫性が無かったり、何を言い出すか分からない怖さがあったりします。これに対する解決策の一つとして、例えば、学習に使用するコーパス自体に制限をかける(ある傾向に沿うようにコーパスを作成する)ことが考えられますが、データ作成コストやデータ量不足の問題が発生します。別の解決策として、モデルへの入力データとして制御情報を渡すことで、出力を制御する方法があります。モデルが制御情報を参考に文章を生成することで、口調や言葉遣い、内容などを分岐できると考えられます。更に、この方法であれば、規模の大きなデータセットでも制御情報をアノテーションするだけで、全てのデータをモデル学習に利用できます。データセットを初めから新しく作るようなコストも減らせます。一方で、この方法では「制御情報をモデルのどの段階で参照するのが効果的なのか」という問題が残ります。そこで、本記事では、この点について比較実験を行いました。

本記事では、Transformerモデルを利用した対話システムでの制御情報の付与について紹介します。より具体的には、対話システムへのパーソナリティ付与を例にとって、モデルのどの段階で制御情報を与えるべきか実験を行い比較しました。データセットにはConvAI2[2] コンペティションの PersonaChat[3]データセットを利用しました。なお、対話システムへのパーソナリティ付与研究やタスクについての詳細は弊社ブログの”チャットボットは個性を獲得できるのか?“をご覧ください。

対話応答生成について

まず、一般的な対話応答生成について紹介します。
対話応答生成について大雑把な見方をすると、ある文章(発話X)に対する応答Yとして適切そうな文章を返すタスクと考えられます。
  • 発話X:
     家にいる時は何をしていますか。
  • 応答Y:
     よく音楽を聴きます。
このように、発話Xに対して、すでに存在している応答を選択する場合であれば、クラス分類タスクとして学習データセットに合うように条件付き確率 P(Y \mid X) を最適化します。しかし、この場合は事前に応答を作成しておかなければならず、あまり自由な応答はできません。そこで、文章をより細かなパーツに区切り、その組み合わせとして表現することで、事前に作成した応答よりも自由な応答生成を行うことができます。この際、様々な文章で共通して見られる細かなパーツをトークンと言います。発話Xや応答Yはいくつかのトークンからなるトークン列として捉えられるので、対話応答生成タスクはトークン列からトークン列を予測するタスクとなります。
  • 発話X(トークン):
     家 に いる 時 は 何 を し て い ます か 。
  • 応答Y(トークン):
     よく 音楽 を 聴き ます 。
なお、トークンの分け方には色々な種類があります。例えば、英語であればスペースで区切ったり、日本語であれば形態素で区切ったりすることが一般的です。その他に、言語をニューラルネットワークで扱う場合には、コーパスから事前にトークン分割方法を学習してしまうこともあります。今回は、後者のトークン分割方法を学習するsentencepiece[4]という手法で分割をしています。
  • 形態素分割例(MeCab IPADIC):
     家 に いる 時 は 何 を し て い ます か 。
  • sentencepiece例(1):
     家に いる 時は 何を して います か 。
  • sentencepiece例(2):
     家にいる 時は 何を して いますか 。
ニューラルネットワークでトークン列からトークン列を予測するためには、Seq2Seq (Sequence-to-Sequence) という構造を利用します。先行する発話をX、発話トークン列のi番目にあるトークンをx_i、応答をY、応答トークン列のi番目にあるトークンをy_iとして表すと、Seq2seqは以下のように表せます。

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のモデル図で、左側のスタックがエンコーダ、右側のスタックがデコーダになります。

図1: Transformerのモデル図(論文[1]からの引用)
エンコーダとデコーダともに、トークンをベクトルに変換したもの(Embedding)を入力として受け取ります。
  • 発話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]]
TransformerはRNN等の時系列モデルと違い、モデル自体では文章内での位置情報を表現できないため、以下の式で表されるPosition-EncodingをEmbeddingに加算します。次の式のposはトークンの文章における位置であり、iはベクトルの次元になります。

PE(pos, 2i) = sin(pos/10000^{2i/d_{model}})

PE(pos, 2i+1) = cos(pos/10000^{2i/d_{model}})

上記の式で表されるPosition-Encodingを可視化すると図2のようになります。

図2: Position Encoding(最大文章長30, 次元数256の場合)
Transformerでは、このようにして取得した発話文/応答文の各トークン特徴量を、Attention層やFeedForward層に通して変換していきます。Attentionは以下の式で表すことができます。

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)。

図3: Self-Attentionの処理
Source-Target-Attentionは、デコーダ層内で発話Xと応答Yそれぞれに含まれるトークンの関係性を考慮する役割を担っています。入力としては、Qに応答Yの特徴量、KとVに発話Xの特徴量をそれぞれ入力します。つまり、応答文に含まれる特徴量を、発話文に含まれる全てのトークンの重み付き和で表すわけです(図4)。

図4: Source-Target-Attentionの処理
また、TransformerではMultihead-Attentionという種類のAttentionを使用しており、入力を特徴量の次元に対してN個に分割、線形変換をした後、並列にAttentionを行います(並列して行われるAttentionをheadと呼びます)。式のnは分割された入力の何番目かを表し、W^Q、W^K、W^V、Wはそれぞれ線形変換のパラメータになります。

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)。

図5: Trmモデル
もう一つは、階層型Transformerと呼ばれる手法です。階層型Transformerではまず、対話履歴を発話ごとにエンコードして文章特徴量を算出します。次に、算出した文章特徴量にターンを表すPositional Encodingを加え、別の文脈用エンコーダ(Context Encoder)に通します。この手法はこれ以降HTrmとします(図6)。

図6: HTrmモデル
また、HTrmにおける文章特徴量は以下の式に従って算出することとします。Nは1文に含まれるトークン数、w_nはn番目のトークン特徴量です。

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で制御情報を利用した計算が行われているとは言え、本当に推論の上で効率的なのだろうか」という疑問があります。

図7: エンコーダ制御のモデル
そこで、もう一つの方法として考えられるのが、Transformerのデコーダ側で制御を行う方法(以降「デコーダ制御」)です。デコーダ制御は、応答トークンそれぞれの特徴量に対して、制御用の特徴量を各デコーダ層への入力前に加算する方法です(図8)。対話システムへのパーソナリティ付与を行った論文[7]においてLSTMのSeq2seqモデルで行われていた処理をTransformer用に変更したものになります。直感的には、こちらの方が「話者によって単語に対して持っている意味的なイメージが変化する」という状況を想定できそうです。

図8: デコーダ制御のモデル
次ページでは実際にこれらのモデルを実装・評価した結果を紹介します。