🐵

AI界を席巻する「Transformer」をゆっくり解説(3日目) ~Model Architecture編 1~

2021/05/05に公開

AI界を席巻する「Transformer」を解説するシリーズ3日目です。

Attention Is All You Needの論文PDFはこちら

  • 1日目: Abstract
  • 2日目: Introduction / Background
  • 3日目: Model Architecture 1
  • 4日目: Model Architecture 2
  • 5日目: Model Architecture 3
  • 6日目: Why Self-Attention
  • 7日目: Training
  • 8日目: Results / Conclusion
  • 9日目: Source Code

シリーズ過去記事は一番下にリンク貼ってます。
早速みていきましょう。
本論文の中核となる章なので、3回にわけて行います。

Model Architecture

Most competitive neural sequence transduction models have an encoder-decoder structure [5, 2, 35].

ほとんどのAI翻訳モデルは、エンコーダー・デコーダーを使った構造である。

Here, the encoder maps an input sequence of symbol representations (x1, ..., xn) to a sequence of continuous representations z = (z1, ..., zn).

通常、エンコーダーは入力の (x_1, ..., x_n) という配列で表現された値を、(z_1, ..., z_n) という配列に変換する。

この配列 x は、今回で言うと英語の文章のことで、1つ1つの x に英語の文章の1単語が入ります。symbol representationというのが調べても何にも出てこないですが、直訳すると記号表現で、変数で表した配列のことを指してます。symbolが x_i のことを指してます。

z は元の英語でも、翻訳後のドイツ語でもない、中間データのようなものです。

Given z, the decoder then generates an output sequence (y1, ..., ym) of symbols one element at a time.

この z を使って、デコーダーは (y_1, ..., y_n) という配列の各要素を1つ1つ作成します。

ここでいう配列 y が翻訳後の文章、今回で言うとドイツ語やフランス語の文章であり、その各要素が1つ1つの単語に該当します。

At each step the model is auto-regressive [10], consuming the previously generated symbols as additional input when generating the next.

上記の1つ1つの翻訳結果を得る計算ステップごとで、再帰的なループがかかることによって前のステップで生成された値と、今のステップで与えられた入力値をデコーダーは食べます。

つまり、通常はエンコーダーとデコーダーは、すべての配列の要素同士がつながっているわけではなく、前の計算結果を記憶として持つものの、あくまで1ステップずつ、1単語ずつ、計算して翻訳していくわけです。だから記憶力が弱いんですね。1個前のことしか覚えてないようなイメージです。

The Transformer follows this overall architecture using stacked self-attention and point-wise, fully connected layers for both the encoder and decoder, shown in the left and right halves of Figure 1, respectively.

この点、Transformerは、この全体感としてのエンコーダー・デコーダーを使ったアーキテクチャーは踏襲しつつも、それをSelf-AttentionとPoint-Wiseという仕組みを使うことで、エンコーダー・デコーダー双方の配列を要素ごとにではなく、完全につなげることを実現している。それが下の図です。

つまり、1個前の記憶しかないのではなく、前の単語の記憶も覚えてる仕組みだということです。

この絵を見てもぱっと分からない方も多いと思うので解説します。
左側がエンコーダー、右側がデコーダーです。詳しくは下記で述べていきます。

Encoder and Decoder Stacks

Encoder:

The encoder is composed of a stack of N = 6 identical layers.

Encoderは図の左側ですが、グレーで囲われた枠があり、その左に N_x とあります。このグレーの部分が1つのレイヤーになっていて、このレイヤーと全く同じレイヤーが6回積み重なった構造をしています。

つまり図は省略されている、ということです。

Each layer has two sub-layers. The first is a multi head self-attention mechanism, and the second is a simple, positionwise fully connected feed-forward network.

それぞれのレイヤーの中には、2つのサブレイヤーがあります。

1つ目のサブレイヤー「Multi-Head Self-Attention」で、2つ目のサブレイヤーは配列の1要素の位置ごとに連結された「Feed-Forward Network(FFNと呼ぶ)」です。

positionwiseの意味は「位置ごとに」で、clockwiseだと「時計回りに」とかに近い使われ方です。つまり配列の1要素ごとにという意味なので、今回は1単語ごとに、という意味です。

少し前に出てくるpoint-wiseもposition-wiseと同じ意味だと思われます。

We employ a residual connection [11] around each of the two sub-layers, followed by layer normalization [1].

それぞれのサブレイヤーの後に、Add & Normというサブレイヤーを採用してます。これはAdd & Normalizationの略で、Add & Normの前のサブレイヤーの入力を加算(Add)し、Add & Normの前のサブレイヤーの出力を正規化(Normalization)するレイヤーです。こういった接続方法を残差接続(residual connection)というようです。

この残差接続や正規化を活用することで、ネットワークの深さを抑えつつも、学習効率は維持できるという別の研究結果を利用しています。こちらも面白そうなテクニックなので、要望があればご紹介したいです。

That is, the output of each sub-layer is LayerNorm(x + Sublayer(x)), where Sublayer(x) is the function implemented by the sub-layer itself.

したがって、再度この図を見直すと、2つあるサブレイヤーそれぞれのアウトプットは、LayerNorm(x + Sublayer(x))と表現することができます。sublayer(x)は、サブレイヤー自体のアウトプットです。

To facilitate these residual connections, all sub layers in the model, as well as the embedding layers, produce outputs of dimension dmodel = 512.

このようなアーキテクチャー、残差接続や、すべてのサブレイヤー、またEmbedding Layersも含めて、うまく機能するように、このモデルのアウトプットの次元は512としています。

Embedding Layerとは入力である文章、今回で言うと英語の文章を、1つ1つの単語をAIが読めるように、つまり計算できるように、数字に変換するレイヤーです。具体的には、ただのスカラーな数字ではなく、ベクトルで表現されます。

こちらも参考にしました
https://ishitonton.hatenablog.com/entry/2018/11/25/200332

また、次元とは、あるベクトル空間に含まれる1次独立なベクトルの数のことを指しています、例えば、通常の地図は平面で表しますので、横軸と縦軸、つまり x 軸と y 軸の2つの軸、ベクトルで構成されてますので、次元数は2です。x 軸と y 軸はお互いにお互いを表現しあうことができない、つまり独立しているからです。

立体的な空間で考えれば、これに高さの z 軸が加わるので、3次元です。これに時間軸が加わると4次元ですね。

現実世界で直感的にわかるのはこのくらいの次元数までですが、理論的に、数学的には、何次元でもとることができます。今回はそれが512ということです。

次元はこちらを参考にしました。大学で学ぶ線形代数から来ています。

https://oguemon.com/study/linear-algebra/basis-dimension/#toc-5

Decoder:

The decoder is also composed of a stack of N = 6 identical layers.

DecoderもEncoderと同じく、6層のレイヤーで構成しています。

In addition to the two sub-layers in each encoder layer, the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack.

DecoderはEncoderにある2つのサブレイヤーに加えて、3つ目のサブレイヤーを真ん中に加えています。これは6つに積み重なったEncoderからのアウトプットを入力として受けるMuti-Head Attentionを入れています。

Similar to the encoder, we employ residual connections around each of the sub-layers, followed by layer normalization.

Encoderと同じように、Decoderのそれぞれのサブレイヤーにも残差接続を活用しています。

We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions.

また、DecoderのSelf-Attentionサブレイヤーは改良していて、配列のある要素がそれより後続の要素に影響しないようにしています。

つまり、Encoderには英語の文章がベクトルに変換された配列のすべての要素が一気に入力されてくるが、Decoderには、今翻訳しようとしてる要素の単語とその前の単語までは参考にさせるが、今翻訳しようとしてる要素の単語の後続の単語は参考にさせないようにしている、ということです。

あくまで翻訳といっても、すべての原文が与えられる前に、同時通訳的に翻訳することを前提としてると考えるとわかりやすいです。ただ、Google翻訳やDeepL翻訳においても、入力文章は書いてる途中でもう翻訳を始めてくれるので、通常のWEB翻訳においても適用される話だと思います。でないと、入力が終わったよ!翻訳ボタンポチッ!を待つか、x秒後に翻訳、というロジックを入れないといけないですからね。

This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

これをマスキングと定義していて、このマスキングと、出力の翻訳後の文章の配列が、各単語の予測ごとに毎回オフセットされることを組み合わせることで、入力された配列の i 番目の要素を翻訳するためには、出力の翻訳された文章の配列の i-1 番目までの情報しか使えないことを担保している。

この図の右下にあるOutputs (shifted right) と書かれた部分がまさに、今 i 番目の単語を訳そうとしてるときに、1 番目~ i-1 番目までの出力=翻訳後の文章も参考にするためにDecoderにインプットしてる箇所ですね。それが1単語ずつ翻訳するごとに参考にできる前の文章の単語も1単語ずつ増えるという意味で、shifted rightと書かれてます。

ここまでがEncorder、Decoderでした。

おわり

AI界を席巻する「Transformer」を解説するシリーズ3日目は以上です。次回は本論文の本丸Attentionからです。

感想や要望・指摘等は、本記事へのコメントか、TwitterのリプライやDMでもお待ちしております!

https://twitter.com/hnishio0105/status/1389957032212455427?s=20

また、結構な時間を費やして書いていますので、投げ銭・サポートの程、よろしくお願いいたします!

シリーズ関連記事はこちら
https://zenn.dev/attentionplease/articles/2d4b2b55ba396e
https://zenn.dev/attentionplease/articles/c2dba490ccba3f
https://zenn.dev/attentionplease/articles/5b4133a4956578
https://zenn.dev/attentionplease/articles/5510331c45e16a
https://zenn.dev/attentionplease/articles/1a01887b783494
https://zenn.dev/attentionplease/articles/4e09c41d7a85db
https://zenn.dev/attentionplease/articles/d0d7f4e406b4ed
https://zenn.dev/attentionplease/articles/75316e7ad65cfc

Slack版ChatGPT「Q」というサービスを開発・運営しています。
こちらもぜひお試しください。
https://q-bot.suchica.com/

Discussion