今やChat GPTについて知らない人はいないんじゃないか?って思えるぐらい有名になりました。しかし、何でこんな物が突然現れたのか不思議に思う方も多いのではないでしょうか?そこで、Chat GPTが登場するまでの様々な技術について、数式は使わずに平易に解説していくシリーズとして「Chat GPT はどうやって生まれてきたのか?」を連載しています。今回はその7回目となります。前回に予告したとおり、Transformer について解説します。
この連載の第5回,第6回で、Chat GPT の GPT は Generative Pre-trained Transformer の略であることと、Transformer は、自然言語処理で利用されるモデルの名前で、元々は機械翻訳のために作られたものであることをお伝えしました。ここでは、Transformer について説明していきます。
1. Transformer
1.1 Transformer の概要
Transformer は以下の論文で発表されました。
前回(第6回)にお伝えしたように Transformer 登場以前のニューラルネット機械翻訳では、seq2seq + attention モデルが主流でした。この seq2seq には Encoder-Decoderモデルが採用され、Encoder,Decoder それぞれは、LSTM や GRU などの RNN(回帰型ニューラルネット)が利用されることがほとんどでした。
RNN は第5回でも説明したように、元々は時系列処理のために考案されたものです。そのため、系列データを上手く扱える半面、前回の処理結果を利用した繰り返し計算が本質で、並列計算による高速化には向いていませんでした。
そこで、RNN を attention に置き換える発想により生まれたのが Transformer です。seq2seq + attention モデルの主要部品は、Encoder(RNN) , Decoder(RNN) , attention の3つなので、RNN を attention に置き換えると、論文のタイトルどおり、主要部品はすべてattentionになります(図1)。
そして、Transformer の attention は行列の並列計算による高速化を念頭に、RNN の代替と従来の attention (どの単語に注目すべきかを学習する)のどちらにも利用できるように一般化して設計されました。

なお、RNN を attention 化する代償とその対策は以下のとおりです。
入力できる単語数は固定される RNN を利用すれば、入力する単語数に制限はなかったのですが、行列演算にするためには固定にする必要があります。しかし、多めに準備しておけば特に問題ないです。 ※Transformer では、単語や単語を分解したトークンを使って処理しますが、ここでは、説明を分かり易くするために、トークンのことを単語と呼びます。
単語の位置情報が扱えない RNN では、その特性上、位置関係の情報が自然に織り込まれていました。行列で一度に処理すると、単語間の距離に関係なく演算が可能になりますが、逆に単語どおしの距離など位置に関する情報が扱えません。そこで、単語分散表現の中に位置情報を埋め込む Positional Encoding を実施します。
1.2 Transformer の構成
Transformer の構成図を図2に示します。大きく、左側(Encoder)と右側(Decoder)に分かれています。図1で示した Transformer の3つの主要部品(attention)は、図2中において、Multi-Head Attention または Masked Multi-Head Attention としてオレンジ色で示されています。つまり、seq2seq + attention の主要部品の Decoder と attention がまとめられて、Transformer の Decoder になったイメージです。

1.2.1 Encoder
繰り返しになりますが、図2の左側の部分が Encoder です。Multi-Head Attention を主要部品とするレイヤー(灰色)をN=6回分積層しています。この Multi-Head Attention は、seq2seq + attention の Encoder(RNN)と対応しています。
1.2.2 Decoder
同様に、図2の右側の部分が Decoder です。Masked Multi-Head Attention (下側)と、 Multi-Head Attention (上側)を主要部品とするレイヤー(灰色)をN=6回分積層しています。下側の Masked Multi-Head Attention は、 seq2seq + attention の Decoder(RNN)と対応しています。また、上側の Multi-Head Attention は、seq2seq + attention の attention に対応しています。
1.2.3 その他の構成要素
Encoder と Decoder の主要部品さえ分かれば十分なのですが、一応、その他の構成要素についても、簡単に説明をします。
Positional Encoding 1.1章でも書きましたが、単語分散表現の中に位置情報を埋め込みます。 詳しい解説は以下の記事を参照してください。 位置情報が言語理解の鍵を握る。Transformerモデルが自然言語処理に革命をもたらす理由とは?
Add & Norm 残差接続の加算処理と Layer Normalization を実施します。安定性のために各処理の後に挿入します。 ※残差接続については、第6回の記事を参照してください。
Feed Forward 活性化関数にReLUを用いた全結合層です。レイヤーを重ねる場合にディープラーニングとしての複雑さを確保するために、各レイヤーの最後に挿入します。
input (output) Embedding, Linear, Softmax これらは、従来のニューラルネット機械翻訳と同様な、単語を分散表現にしたり、分散表現を各単語の確率に変換するための構成要素です。
1.3 Transformer の Attention
Transformer において Attention は、Q(query),K(key),V(value)を入力し、Q に対して V を当てはめる処理と言えます。Q, K, V は、ベクトルが複数並んだ行列の形をしており、key と value はペアを構成しています。
図3に Multi-Head化前とMulti-Head化後の Transformer 用 Attention を示します。まず、Multi-Head化前、つまり、Transformer における Attention の基本を説明します。

図4は、Multi-Head化前の Attention の動作を例を使って説明した図です。この例では、Q および K と V のペアともに、3つのベクトルで構成された行列です。イメージし易いように、「みかん」などと単語で表記していますが、実際は512次元の単語分散表現ベクトルです。v1, v2, v3 も同様にベクトルです。
処理手順としては、まず、行列 Q と K の内積に基づいて得た値を softmax処理により合計が1になるように調整して、類似度を算出します。図では破線の内部で合計が1になっています。内積は行列の乗算を使って高速に演算できるのがポイントです。次に類似度で算出した割合に応じてv1, v2, v3 を混合して出力します。この部分も行列の乗算でできます。

次に、Multi-Head化後、つまり、Transformer の Multi-Head Attention について説明します。図3の右側にMulti-Head化後を示します。図中の h がヘッドの数で、ここでは h=8 とします。Multi-Head化前の場合、Q,K,V は512次元の単語分散表現ベクトルで構成されていました。Multi-Head化後は、この次元を 512 / 8 = 64 に下げて、8つのヘッドでAttention を並列実行します。このため、各ヘッドの Attention に入力する Q,K,V を64次元に下げる変換を追加します。また、各ヘッドの結果を結合して再度変換して出力します。これらの変換パラメータは学習により決定します。各ヘッドの次元が削減されるため、計算コストの合計は、Multi-Head化前の Attention と同程度になります。
Multi-Head Attention により、ヘッドごとに異なる位置や異なる部分空間を参照できるようになります。これにより、複数の観点を総合した処理を実現します。
2. おわりに
Transformer について、Transformer の概要,Transformer の構成,Transformer の Attention と説明しました。まだ説明の途中ですが、長くなってきましたので、残りは次回にすることにします。従いまして、次回は Transformer(後編)としてお届けする予定です。