機械翻訳が変わった!?Seq2Seqモデルの基礎と特徴を解説
こんにちは。ふらうです。
今回は、Seq2Seqについて解説したいと思います。
自然言語処理の世界の中で、一時代を担った重要なモデルで、どのようなモデルなのかを説明します。
また、本記事は論文「Sequence to Sequence Learning with Neural Networks」を参考に執筆しています。
Seq2Seqモデルとは
Seq2Seqは、Googleの"Ilya Sutskever", "Oriol Vinyals", "Quoc V.Le"の御三方が出した「Sequence to Sequence Learning with Neural Networks」論文で発表されたもので、自然言語処理界に大きな革新を起こしたモデルの1つです。
2016年頃からGoogle翻訳にも使用されており、ある程度の成功を収めています。
モデルの形としては、文字列などの列情報を入力すると、列情報が返ってくるといったことが得意なモデルです。なので、機械翻訳タスクや質疑応答AIなど、文字列に対して文字列を返すようなタスクに向いているといえます。
Seq2Seqの仕組み
Seq2SeqはEncoder-Decoderモデルと言われており、EncoderとDecoderの2つの構造があります。
まず、Encoderは、入力された列情報をベクトル情報に変換します。そして、Decoderで、ベクトル情報から文字列などの人間が認識できる情報に変換します。
この2つの機構を備えたモデルが、Encoder-Decoderモデルです。
これをLSTMという手法を用いて、翻訳タスクの精度向上を達成したものがSeq2Seqです。
LSTM(Long Short-Term Memory)
まずLSTMというものが、このSeq2Seqで重要になってきますので、LSTMとは何かをざっくりと説明します。
簡単に言ってしまえば、記憶力の強いRNN(リカレントニューラルネットワーク)です。
当時、時系列データを処理する際には一般的なRNNが使われていましたが、このRNNには欠点がありました。それは「学習するにつれて過去のデータを忘れていってしまう」ことです。
例えば、「たかし君は、親戚のおじさんからお年玉を10000円もらいました。そのあと家に帰った彼は、お年玉でほしいものを買うために買い物に出かけました。」という文があったとします。
その時に、「"彼"とは誰のことでしょう?」という問いがかけられると、時系列でいう最初のほうに入力される「たかし君」という名前のデータが薄まっているので答えることが難しく、場合によっては後に出てきている「おじさん」という単語が解となって出てくるかもしれません。
これは、1グループのパラメータを時系列順で更新していくために発生してしまいます。
上の例文でいうと、1回目のパラメータ更新では「たかし君」を学習し、2回目は「は」、3回目は「、」4回目は「親戚」...という風にパラメータが更新されます。
2回目の更新までは、「"たかし君"+"は"」で、「たかし君」の記憶は50%ほどです。それが、「「"たかし君"+"は"」+"、"」...「「「"たかし君"+"は"」+"、"」+"親戚"」という風に初期に入力されたデータが薄まっていきます。
これを解決しようと登場したものがLSTMです。
仕組みは簡単で、RNNに新たに記憶領域と忘却領域を追加してあげたものです。
この記憶領域には、過去のデータが含まれていて、忘却領域では忘れるデータを指定する力があります。
これらをパラメータ更新する際に活用してあげると、最初の方に入力されたデータもうまくパラメータ更新に放り込めるわけです。
Seq2Seq
LSTMについて解説したところでSeq2Seqの仕組みに入ります。
Seq2SeqではLSTMの層を重ねて構成されたものです。
Decoderの仕組み
まず、内部ではLSTMを用いて時系列データを、ある次元数のベクトルに変換します。この次元数は固定次元で、256と決まっているなら、どんな入力が来ても256次元となります。
さきほど説明した通り、LSTMは時系列データを処理できる手法ですので、うまく文章全体を表すベクトル情報が出力されることが期待できます。それを固定次元数の文脈ベクトルとします。
ここで、論文内でも重要と言っている、文章を反転させた場合に精度が向上するということに注目しましょう。たとえば、「A,B,C」という文字列が来た場合に、LSTMの入力には「C,B,A」と逆に対応付けします。すると精度が大幅に向上したということがありますので、この方法もSeq2Seqで使用しています。
Encoderの仕組み
そして、その固定次元の文脈ベクトルから出力となる時系列データを出力します。
全体を学習した固定次元のベクトルを使って、一文字ずつ時系列データを出力していきます。
ここで面白いのが、入力データの単語数と出力データの単語数が違っていても可能という点です。
例えば、「"これら", "は", "猫", "です"」と入力が4単語なのに対して「"There", "are", "cats"」と3単語のみの出力を得ることができます。
Seq2Seqの学習方法
調べた結果、IBMのgithubやGoogleのgithubで公開されているコードがありました。また、"bentrevett"という方がipynb形式で詳細にSeq2Seqのチュートリアルを解説してくれております。
以下にリンクを貼っておきますので、興味がある方はぜひ。
・bentrevett様のgithubでのSeq2Seq解説
上記のgithubで公開されているものは、日本語の翻訳タスクではないので、コーパスを日英翻訳コーパスに切り替えるといいでしょう。
また、分かち書きの際も日本語に対応していない可能性があるので、mecabなどを使って日本語の分かち書きを行うことをお勧めします。
まとめ
今回は、Seq2Seqについて解説しました。この技術は、後のtransformerなどの翻訳タスクにも繋がる大きい技術ですので、復習もかねて勉強し直しました。時間があれば、事前学習を実際にやってみることもしてみたいですね。
今後もAIに関する記事を書いていきたいと思いますので、よろしくお願いします。