見出し画像

トランスフォーマーの自己アテンションの理解⑤エンコーダ・デコーダ

この記事では、トランスフォーマーで翻訳をする際の枠組みであるエンコーダ・デコーダを解説します。翻訳モデルであるトランスフォーマーの全体像を掴むことで後々に解説するアテンションの詳細を理解する手助けになります。木を見るよりまず森を見ることで、全体の見通しをよくするのが目的です。

では、さっそく始めましょう。


トランスフォーマーの全体図

以下は、トランスフォーマーの論文「Attention Is All You Need」の一番最初の図です。これはエンコーダ・デコーダの構造を示しています。

論文「Attention Is All You Need」の図1

Google Brainの研究者であるAshish Vaswaniらによって発表された論文ですが、彼らは冒頭でこう述べています。

We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely.

私たちは、アテンションメカニズムのみに基づいて、再帰や畳み込みを完全に不要にする、新しいシンプルなネットワークアーキテクチャであるトランスフォーマーを提案します。

論文「Attention Is All You Need」

一見すると、とても複雑な構造を持つトランスフォーマーのことを「シンプルな」と言っていますが、これは「再帰や畳み込みを完全に不要にする」ことを指しています。

しかし、何の背景知識を持たずに、上図を見て「シンプルな」と思う人は少ないでしょう。

なので、この記事では上記の図がある程度シンプルに見えてくることを目指して、トランスフォーマーのエンコーダ・デコーダの大枠を解説します。

RNNのもたらす複雑さとは

さて、RNNベースのエンコーダ・デコーダの何が複雑なのでしょうか。まずは、これを紐解いていきます。

第二弾でRNNを使ったエンコーダ・デコーダが登場しました。エンコーダとデコーダの中はそれぞれ再帰の構造(LSTMなど)になっていて文脈を伝播するのに役立ちました。

RNNエンコーダ・デコーダ翻訳モデル

この再帰の構造では双方向からの文脈を抽出することもできます。

双方向RNN

また、複数のRNNを重ねて、多階層のRNNを使うこともできます。

多階層のRNN

もちろん、各層で双方向のRNNを使うことも可能です。

これらの構造では、いたるところでデータを順番に処理する必要があります。よって、データの処理を並列に行うことを難しくしています。また、第二弾で触れた再帰の構造により生じる勾配消失入力重みの衝突が生じるので、さらに複雑なLSTMを使う必要がありました。これらがRNNのもたらす複雑さです。

それに反して、トランスフォーマーではデータを並列処理できるようになっています。トランスフォーマーにおけるアテンションの仕組みは双方向ではなく、全方向、つまり全てのトークンから全てのトークンへと同時に計算を行うのでGPUなどの利用が効率的に行えます。よって、多階層によるデータの処理もRNNよりも速くなります。

ここからは、アテンションの仕組みの細部には触れずに、トランスフォーマーが翻訳をする際のデータの流れを追いながら全体像や構造を解説します。

まずは、トランスフォーマーの多階層構造を見ていきましょう。

トランスフォーマーの多階層構造

まずは、トランスフォーマーを鳥瞰してみます。

トランスフォーマーの鳥瞰図

ここでは、英語の文章「Hello world!」がフランス語の「Bonjour le monde!」と翻訳されています。このトランスフォーマーの箱の中にエンコーダとデコーダがあります。

トランスフォーマーのエンコーダ・デコーダ

エンコーダは入力文章(ここでは英語)からの情報を各トークンの特徴量として抽出します。これが入力文章の文脈を含んでいます。デコーダは入力文章の文脈を利用して出力文章(ここではフランス語)を生成します。

エンコーダとデコーダの中には多階層の構造があります。6つのエンコーダ・ブロック(Encoder Block)と6つのデコーダ・ブロック(Decoder Block)があります。長くなるので図の中では「・ブロック」を省略しています。

エンコーダとデコーダは多階層

もちろん、6つ以上の階層を使うこともできますが、ここではトランスフォーマーの論文で解説されているベースの設定に従っています。ちなみに、トランスフォーマーを利用したBERTのベースモデルはの12階層のエンコーダを使っていまし、GPTは12階層のデコーダを使っています。

さて、エンコーダ・デコーダの図を縦に描き直してみます。

エンコーダ・デコーダの縦書き

エンコーダからの文脈は各デコーダ・ブロックに渡されます。これを描くと以下のようになります。

エンコーダからデコーダへの文脈の流れ

多階層の構造を$${N\times}$$と表してまとめます。「Nかける」と書いて「N個積み重ねる」の意味です。$${N}$$はブロックの数で、ここでは6です。

多階層をNxとしてまとめる

これをトランスフォーマーの図と比べると、大枠だけですが近づいてきました。

論文「Attention Is All You Need」の図1

では、次に左下にあるエンコーダへの入力部分を見ていきます。

埋め込みと位置エンコーディング

ここでは、第四弾で解説した位置エンコーディングが登場します。入力文章はトークン化され、埋め込みテーブルから分散表現ベクトルが取り出され、位置エンコーディングが追加されます。

埋め込みと位置エンコーディング

位置エンコーディングは三角関数を使うので○の中に波が描かれた記号で表現されています。また、位置エンコーディングは埋め込みに要素ごとに追加することを$${\oplus}$$で表現しています。

つまり、この部分は、各トークンのベクトルの各要素に位置エンコーディングの値が足し算されたことを表しています。それがエンコーダへの入力となっています。位置エンコーディングの詳細は第四弾を参照してください。

次は、デコーダの出力にフォーカスを当てます。

デコーダによる自己回帰

トランスフォーマーは入力文章を翻訳して出力します。ここで入力文章のトークン数と出力文章のトークン数は必ずしも一致しません。英語の文章によってはフランス語の翻訳が長い場合も短い場合もあります。そのような入力文章によって異なるトークン数の出力をどのように実現しているのでしょうか。

入力と出力ではトークン数は異なる

実は、デコーダは翻訳されたトークンを一つずつ積み上げるように出力します。

デコーダへの最初の入力は、文章の始まりを意味する<SOS>(Start Of Sentence)です。同時に、エンコーダからの文脈も入力として与えます。これらをもとにデコーダは最初のトークンを予測します。

デコーダへの最初の入力は文脈と<SOS>

なお、<SOS>を<BOS>(Beginning Of Sentence)と表記する場合もあります。

<SOS>もトークンであり、埋め込みベクトルです。デコーダへ入力の最初のトークンとして使われる以外、特別な扱いはありません。<SOS>の埋め込みベクトルの要素の値も訓練によって学習されたものです。

また、<SOS>も他の埋め込み同様に位置エンコーディングを受けます。後で見るようにデコーダへ入力されるトークンの数は徐々増えていきますが、位置エンコーディングがあることで<SOS>が最初の位置にあることが認識されます。

まとめると、デコーダは<SOS>を翻訳を始めるきっかけとして理解します。

<SOS>で始まる出力文章の埋め込みと位置エンコーディング

エンコーダからの文脈は「Hello world!」に関するさまざまな特徴量を含んでいます。デコーダはこの情報を参考にして、<SOS>の次、つまり翻訳された文章の初めにくるフランス語のトークンを予測するのに役立つ文脈を抽出します。

その意味ではデコーダとエンコーダが似た構造を持つことは頷けます。エンコーダは多階層を通して入力文書の文脈を抽出しますが、デコーダも多階層を通して出力文章を予測するのに必要な文脈を抽出していると言えます。違いはデコーダはエンコーダからの文脈を利用して入力文章全体からの情報を参考にできることです。

デコーダからの文脈情報が線型層(Linear Layer)とソフトマックスを通ることでフランス語の各トークンに対しての確率を出力されます。

デコーダからの情報で出力トークンの確率予測

ここでは「Bonjour」(フランス語で「Hello」に対応する)が最初のトークンとしてもっとも確率が高いと予測されたとします。

ここでは明示はしていないですが、フランス語のトークンが仮に10万個あるとするとその全てのトークンに対しての可能性を計算しています。その中からもっとも可能性の高いのが「Bonjour」だったわけです。また、トークンの数は埋め込みテーブルを初期化する際に上限が定められています。

このようにして得た出力トークンをデコーダへの入力に追加します。その際、最初のトークンは常に<SOS>です。

<SOS>と前回の出力をデコーダに入力

デコーダは<SOS>とそれに続く「Bonjour」の埋め込み(位置エンコーディングを含む)を受け取ります。そして、エンコーダからの文脈、つまりは入力文章全体の文脈を参考に、次に出力すべきフランス語のトークンの確率を予測します。

次にトークンとして確率がもっとも高いのが「le」だったとすると、それがデコーダへの次の入力に追加されます。

再び前回の出力を入力に追加して次のトークンを予測

同様な処理が繰り返されます。ここでは常にもっとも確率の高いトークンをデコーダへの入力に回しています。この手法をグリーディ法(Greedy Method、貪欲法)と呼びます。他にもビームサーチ(beam search)という手法もあり精度が上がる可能性もあるのですがやや複雑なのでここでは触れません。

このように、翻訳タスクではデコーダは自分が出力したものを入力として取り入れていく自己回帰(auto-regressive)の構造を使います。

よって、翻訳タスクにおいては、トランスフォーマーを使っているとは言え、再帰的な構造があります。ただし、RNNエンコーダ・デコーダの場合のように文脈抽出する部分での再帰構造とは異なります。

また、翻訳以外のタスクにトランスフォーマーを使う場合は、自己回帰がないこともあります。例えば、BERTのようにエンコーダだけを使うケースです。よって、このような自己回帰はトランスフォーマーの本質ではありません。

翻訳の処理は、デコーダが<EOS>(End Of Sentence)のトークンをもっとも確率の高いトークンだと予測した時点で終了します。

もっとも確率の高いトークンが<EOS>だと翻訳は終了

このようにしてデコーダでは、入力文章からの文脈を参考に、出力文章を積み上げていくことで翻訳を行なっています。また、自己回帰の構造により、入力文章のトークンの数と異なる出力文章を生成することが可能となっています。

まとめ

これまでの話を図にまとめると以下になります。

だいぶトランスフォーマーの図らしくなってきた

(右にシフト)と注釈があるのは<SOS>が最初にあるので出力文章が右にシフト(移動)しているからです。

再びトランスフォーマーの全体図と比べます。

論文「Attention Is All You Need」の図1

あとは、エンコーダ・ブロックとデコーダ・ブロックの中身の部分の処理の流れがわかるとトランスフォームーの構造をほぼ理解したも同然です。

ただし、オレンジ色の箱にあるマルチヘッド・アテンション(Multi-head Attention)を理解するには、クエリー・キー・バリューによるアテンションに触れる必要があります。

これは次回に解説します。

(続く)


いいなと思ったら応援しよう!