Attention Seq2Seqで対話モデルを実装してみた



MLPシリーズの「深層学習による自然言語処理」を読みました。

最近は、深層学習の技術の発展によって、自然言語処理界隈でも深層学習を利用する例で賑わってきている印象です。

今回は上記書籍にも紹介されている、Attention Model + Sequence to Sequence Modelを使った対話モデルをChainerで実装してみました。

系列変換モデル(Sequence to Sequence Model)

自然言語処理の典型的の応用タスクとしては、機械翻訳、文章要約、対話、質問応答、文章分類などがあります。

これらのうち、文章から文章への変換とみなせるタスクを考えてみると、

  • 機械翻訳 = 「翻訳元の言語の文章」から「翻訳先の言語の文章」への変換
  • 対話 = 「相手の発言の文章」から「自分の発言の文章」への変換
  • 質問応答 = 「質問の文章」から「応答の文章」への変換

とみなすことができます。

以上から、これらのタスクは系列から系列への変換を行うモデルを考えれば、対応できそうなことがわかります。

これについて、Sequence to Sequence Learning with Neural Networksで提案された、系列を受け取り別の系列に変換する確率をモデル化したものが、系列変換モデル(Sequence to Sequence Model)です。

系列変換モデルはエンコーダー(符号化器)とデコーダー(復号化器)の2つの要素から構成され、エンコーダーでは, 入力文の単語のone-hotベクトル列を受け取り、RNNによって隠れベクトルを保存して、デコーダーでは、エンコーダーが作成した隠れ層のベクトル表現を用いて、出力文を生成します。

系列変換モデルが盛んに研究されるようになってから、文献ごとに

  • Sequence-to-sequence
  • 符号化復号化モデル(Encoder Decoder Model)
  • End-to-end学習

といった新しい用語が使われるようになったみたいですが、概念的にはいずれも同じものと考えていいみたいです。

注意機構(Attention)

複数のベクトルがあった時に、どのベクトルを重要視するかも含めて学習させる仕組みのことを注意機構(Attention mechanism)といいます。

特に, 複数ベクトルの重み付き平均を使う方法をソフト注意機構(soft attention mechanism)といいます。

通常のSequence to Sequence Modelでは、エンコーダーで入力文章を通した最後の隠れ層ベクトルを使う仕組み上、入力文章前半の情報が反映されづらくなってしまいます。

これに対して、英語では文章を逆順にしたり、日本語・中国語はそのままの順序で読み込ませるなどをすることで、精度を上げることはできることが報告されていますが、本質的な解決にはなりません。

そこで、入力文章の各単語のベクトルをエンコードした時の隠れ層ベクトルをそれぞれ保存しておき、デコード時に、どの隠れ層ベクトルをどのくらいの重みで見るべきかまでを学習させるものが、ソフト注意機構になります。

これに対して、見るべき隠れ層ベクトルを一つに決めてしまう方法を、ハード注意機構(hard attention mecanism)といいます。

詳しくは文献や、上記の書籍などが参考になります。

Neural Machine Translation by Jointly Learning to Align and Translate

今回はソフト注意機構の方法で実装を行いました。

対話モデルの実装

実装に関しては、下記が大変参考になりました。

今更ながらchainerでSeq2Seq(2)〜Attention Model編〜

実は、ChainerやTensorFlowでも、公式チュートリアルでSeq2Seqモデルの実装例は公開されています。

Chainer: https://github.com/chainer/chainer/blob/459a74a747730e3a1303ae7b2528745d5ec5a794/examples/seq2seq/seq2seq.py

TensorFlor: https://www.tensorflow.org/tutorials/seq2seq

Chainerのチュートリアルコードでは、精度評価の指標としてBLEUを利用しています。

BLEU(BiLingual Evaluation Understudy)は、機械翻訳の分野において、一般的に用いられる自動評価基準で、N-gramマッチ率に基づく手法を用いているようです。

今回は特に評価基準などは使わず、実際に学習させた対話を出力して対話文を生成させて、その様子を確認することにします。

モデルはAttentionに加えて、エンコーダーのLSTMでは双方向で隠れ層を計算する構成にしています。

今回実装したコードが下記になります。

GitHub: https://github.com/Gin04gh/nlp/blob/master/AttentionSeq2Seq.ipynb

移設しました。(コードも更新)

GitHub: https://github.com/Gin04gh/datascience/blob/master/samples_deeplearning_python/attention_seq2seq.ipynb

今回は学習などの動きを確認したいだけでしたので、対話データはネット上から適当にいくつか拝借しました。

教師データを使った予測になりますが、対話文を生成させてみます。

応答文を学習できていることが確認できました。

まとめ

以上、ChainerでAttention Sequence to Sequence Modelの実装を行ってみました。

今回は少量のデータで行いましたが、自然な対話をしてくれるチャットボットなどのレベルにまで学習させたいとなると、莫大な量の対話文が必要になりそうなことは、理論や実装を見ると分かると思います。

Sequence to Sequence Modelは系列から系列を学習させる仕組みの深層学習ですので、今回は文章から文章でしたが、例えば、音声データから文章を出力したりとか、時系列データから文章を出力するなど、マルチモーダルな実装も一応作ることはできそうです。

追記(2018-09-10)

Attentionを加えない、ただのSeq2Seqのコードも下記にまとめました。

まずはこっちで系列変換モデルについて理解してからAttentionにも移ると良いかと思います。

GitHub: https://github.com/Gin04gh/datascience/blob/master/samples_deeplearning_python/seq2seq.ipynb



“Attention Seq2Seqで対話モデルを実装してみた” への 0 件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です