今やChat GPTについて知らない人はいないんじゃないか?って思えるぐらい有名になりました。しかし、何でこんな物が突然現れたのか不思議に思う方も多いのではないでしょうか?そこで、Chat GPTが登場するまでの様々な技術について、数式は使わずに平易に解説していくシリーズとして「Chat GPT はどうやって生まれてきたのか?」を連載しています。今回はその6回目となります。前回に予告したとおり、「seq2seq + attention」と題してattentionの始まりについて解説します。
1. ニューラルネット機械翻訳の発展(Transformer登場以前)
前回にChat GPT の GPT は Generative Pre-trained Transformer の略であることと、Transformer は、自然言語処理で利用されるモデルの名前で、元々は機械翻訳のために作られたものであることをお伝えしました。そして、ニューラルネットを使って、初めて従来の統計的機械翻訳に追いついたという下記の論文を取り上げました。
前回は上記論文のモデルをseq2seqと呼びましたが、ここでは、本来の意味に戻って、Encoder-Decoderモデルのような「系列データを入力すると系列データが出力される」タイプのモデル全般をseq2seqと呼びます。
ニューラルネット機械翻訳はseq2seqを土台に、attention を付加した様々なモデル(seq2seq + attention)が提案される時期がありました。その後、土台としてのseq2seqを捨ててしまい attention だけにする Transformer が登場するほど、attention は重要になっていきます。
そこで、1.1章で attention の始まりとして、上記論文と同時期に発表されたRNNsearch について説明します。この論文では alignment としていますが、この alignment が attention機構を構築していると述べており、後にこのような機構全般は attention と呼ばれるようになりました。
次に、1.2章で seq2seq + attention タイプのニューラルネット機械翻訳として、GNMTを紹介します。
1.1 RNNsearch
RNNsearch は以下の論文で発表されました。
従来のEncoder-Decoderモデルの仕組みについて、前回(第5回)にも説明しましたが、もう一度振り返ります。なお、説明にあたって、翻訳する元の言語をソース言語、翻訳先の言語をターゲット言語と呼ぶことにします。
従来のEncoder-Decoderモデルの仕組みは以下のとおりです。
Encoder がソース言語の単語系列をベクトルに変換します。
Decoder が上記のベクトルをターゲット言語の単語系列に変換します。
このように、従来のEncoder-Decoderモデルにおいては、ソース言語の1文分の情報が Encoder と Decoder を仲介するベクトルに詰め込まれており、Decoder への(外部からの)入力はこのベクトルに限られていました。このため、長文になると情報がベクトルに入りきらずに、性能が低下することが分かってきました。
この問題に対処するため、RNNsearchでは大きく分けて以下の2つの改良を加えています。
Encoder の隠れ状態の扱い 従来のEncoder-Decoderモデルでは、ソース言語の1文分の情報が欲しいだけですので、必要なのはソース言語の単語を全て読み込んだ後の隠れ状態だけでした。それを後述する手順により、それぞれを重点を置いている単語の異なる(全文の)情報として扱います。その手順は、まず、Bi-RNNを使って順方向と逆方向の両方の隠れ状態を算出します。次に、入力単語ごとに順方向と逆方向それぞれの隠れ状態を結合し、これらをまとめて隠れ状態とします。
コンテキストベクトルの導入 Decoder への入力を増やすために、コンテキストベクトル ci を導入します。ci は各Encoder の隠れ状態を混合したもので、Decoder のステップ(i)ごとに再計算して求めます。混合する割合は、Encoder,Decoder と共に alignment として学習します。
Bi-RNN(bidirectional RNN) 双方向RNNとも呼ばれる、順方向のRNNと逆方向のRNNを組み合わせたRNNのこと。ここでは総称としてRNNと言っているので、RNNはLSTMやGRUでも良く、Bi-LSTM,Bi-GRUを含む。
このように、Decoder 処理時に Encoder の内容を参照できるので、RNNsearchという名前なのです。また、コンテキストベクトルci用の混合比率を学習することは、ソース言語の単語系列のどの単語に注目すべきかを学習することなので、この部分が attention機構を構築しています。
図2は、図3上側の英文を下側のフランス語の文に翻訳したときに、alignment が混合比率として学習した重みを可視化したものです(黒:0~白:1)。また、図3は、図2の内容を見易くした図です。重みが大きい入力単語は直線で、やや大きい単語は破線を使って出力単語と結んでいます。英語とフランス語は基本的に単語の並びが同じで、形容詞と名詞は順序が異なるのですが、図2および図3から正しく処理できているのが分かります。
RNNsearchのその他のスペックは以下のとおりです。
翻訳: 英語→フランス語
単語数: 英語,フランス語 共に3万語 それ以外の単語は「UNK」に統一
単語埋め込みの次元: 1000次元
単語埋め込み(embedding): 単語を分散表現にすること。分散表現については、本連載の第4回の記事を参照してください。
学習用データ: 348M word
構成: Encoder に Bi-GRUを使用(Bi-LSTMでも問題なく使用できる)
1.2 GNMT(Google’s Neural Machine Translation System)
GNMT については、前回(第5回)の最後で名前だけ紹介しました。
ここでは、GNMT の構成について紹介します。図4のように、attention を加えた Encoder-Decoderモデルになっており、Encoder と Decoder は、それぞれ8層の Stacked LSTM で、3層目~8層目は残差接続になっています。さらに、Encoder の1層目のみ Bi-LSTM になっています。attention は全結合で構成されています。
残差接続(Residual Connection) 直接的な出力を学習するのではなく、入力を参照した残差関数を学習する Residual learning(残差学習)用のスキップ接続を指します。学習部分が入力に対する差分のみを学習し、学習部分の出力と元の入力を加算します。恒等写像(入力値をそのまま出力する)の学習が効率化し、より深いネットワークでも安定に学習することができます。
なお、それまでの、未知語はすべて「UNK」に変換する手法に代えて、以下のモデルを導入しています。
Wordpiece Model
Mixed Word/Character Model
2. まとめ
「seq2seq + attention」ということで、RNNsearch と GNMT(Google’s Neural Machine Translation System)について紹介しました。次回は、Chat GPT の T である Transformer についてお届けする予定です。