Transformerアーキテクチャを初めて提唱した論文。飛躍的なLLMの精度向上に繋がった歴史的な論文。
1. 従来の主流モデルとその限界
自然言語処理、特に機械翻訳などのシーケンス変換タスクにおいて、Transformerが登場する前はAttentionを用いたRNNやLSTMなどが絶対的な主流だった。
RNNは、文章を単語ごとに前から順番に処理する。具体的には、時間ステップtにおける隠れ状態 $h_t$は、一つ前の状態 $h_{t-1}$と現在の入力から計算される。この逐次計算性により、GPUが得意とするデータの並列化が阻害されていた。また、シーケンスが長くなるにつれて、前の単語と後の単語の結びつきを学習するのが困難になった。この長文における単語の結びつきを学習するためにAttention機構が用いられていたが、それでも限界があった。
2. Transformerの提唱
本論文では、RNNやCNNといった従来のニューラルネットワークアーキテクチャを完全に取り除き、Attention機構のみに依存する新しいアーキテクチャ「Transformer」を提案した。
2.1 Transformerのモデル構造

出典: Attention Is All You Need (Vaswani et al., 2017)
エンコーダー・デコーダーモデルといわれ、入力された記号の系列 $(x_1, x_2, .., x_n)$を、連続的な表現のシーケンス $z=(z_1, z_2, …, z_n)$に変換する。
デコーダーは表現 $z$が与えられると、自己回帰的(以前に生成された記号を次の入力として消費しながら)に出力シーケンス $(y_1, y_2, …, y_m)$を1要素ずつ生成する。
左半分がエンコーダー、右半分がデコーダーとなっている。英語からスペイン語への翻訳タスクを例にすると、Inputsとは「I have cats」、Outputs(shifted right)とは「Yo tengo」であり、Output Probabilitiesは「gatos」が高確率であることが期待される。
Outputsにgatosを入れないのは、それ自体が予測対象だからである。それゆえにデコーダーに入れないように情報をマスクしている。これがすぐ上にあるMasked Multi-Head Attentionの由来である。
エンコーダー
エンコーダーについては、論文ではN=6で実装されている。
Multi-Head Attention層(下の方)とPosition-Wise全結合層(上の方)の2つのサブモジュールからなる。
デコーダー
デコーダーについては、論文ではN=6で実装されている。
構造としては、エンコーダーと同様の2つのサブモジュールの間に、新しくエンコーダーからの入力を受け取るMulti-Head Attention層を追加したものとなっている。
2.2 Attention
Attentionは、文中のある単語の意味を理解するときに、文中の単語のどれに注目すればいいかを表すスコアのこと。たとえば英語でitが出てきた時、そのitが指し示す単語の値が高く、他の単語の値が低いことが期待される。
AttentionはQueryベクトル $\boldsymbol{Q}$、Keyベクトル $\boldsymbol{K}$、Valueベクトル $\boldsymbol{V}$の3つのベクトルで計算される。各単語がそれぞれこれらのベクトルを持っていて、それらから各単語のAttentionが計算される。具体的には、Attentionは $\boldsymbol{V}$の重み付き和であり、その重みは $\boldsymbol{K}$と $\boldsymbol{Q}$によって計算される。
これらはすべてのAttention機構で共通の事柄である。その中でAttentionは、以下のように分かれる。
まず、クエリとキーからどのように重みを計算するかの方法により以下の2つがある。
- 内積Attention:クエリとキーの内積を計算し、softmaxに通すことで重みとする。
- 多くの場合、クエリおよびキーの次元数 $d_k$に対して、内積の値を $\sqrt{d_k}$で割った値をsoftmaxに通す。これを特に縮小付き内積Attentionという。
- 加法Attention:クエリとキーを入力とする一層の全結合層で計算することで重みとする
- 計算が遅いというデメリットがある
次に、認識できる情報の多様性によって以下の2つに分割される。
- Single-Head Attention:入力された単語のベクトルの全ての次元に対してAttentionを計算する。
- 1つの関係しか取り込めない
- Multi-Head Attention:入力された単語のベクトルの次元をいくつかに分割し、それぞれに対してAttentionを計算する。最後にそれらを結合し、重みづけする。分割時は重なりが許容されない。
- 複数の関係を取り込める。
そして、キー、バリューとクエリとそれぞれどこから生成するかで以下の2つに分割される。
- Self-Attention:キー、バリュー、クエリ全てを1つの入力から生成する。
- 自分自身に対する関係性を学習できる。なお、未来の情報を見ないようにしたものをMasked Self-Attentionという。
- Cross-Attention:キー、バリューの生成に用いる入力と、クエリに用いる入力を分割する。
- 異なるものに関する関係性を学習できる。一般に、キー、バリューの生成に使う入力が元のラベル、クエリの生成に用いる入力が目標ラベルであることが多い。「今作っている単語Qが、原文(K, V)のどこに対応すべきか」という因果関係
本論文で利用されているのは、縮小付き内積Multi-Head Attentionである。以下の式で表される。

出典: Attention Is All You Need (Vaswani et al., 2017)
この論文で利用されているAttentionは以下の3箇所
- エンコーダー・デコーダーAttention:Cross-Attention
- Query:デコーダ内前層の出力
- Key, Value:エンコーダーの最終出力
- エンコーダーAttention:Self-Attention
- Query, Key, Value:エンコーダー内の前層出力
- デコーダーAttention:Masked-Self-Attention
- Query, Key, Value:デコーダーの前層出力(マスク済み)
Attentionを計算した後は、行方向(index=0)が注目する主であり、列方向(index=1)が注目される対象である。softmaxは行方向(トークンごと)に実施される。これは各トークンそれぞれを主とした時に、他の単語の関連度を確率として算出するためである。
2.3 Position-wise順伝播ネットワーク(FFN)
Attention層で得た高度な情報を、高次元へと拡大したのち、非線形的処理を行い、元の形に戻す、という動作を実施する。
この処理は単純な全結合層によって実施される。2つの全結合層を配置し、その間にReLUが入る。
一度拡大してからReLUに通し、縮小することで、表現力を強化する層である。
2.4 スキップ結合およびレイヤー正規化(Add & Norm)
各モジュールの終わりに存在するAdd & Norm層は、スキップ結合を行うとともに、レイヤー正規化を実施する。
レイヤー正規化
レイヤー正規化は、入力されたトークン列長を $L$、特徴量次元数を $d_{model}$とすると、 $[L, d_{model}]$となっている計算途中の特徴量ベクトルに対して、各トークンごとに( $d_{model}$について)正規化を実施するものである。pandas的に言えばindex=1の方向に対する正規化である。
特徴量次元方向に通常通りの正規化を実施したのち、学習可能なパラメータによって、拡大(縮小)および並行移動を行う。拡大に用いるパラメータ、並行移動に用いるパラメータはトークンごとに共通で、特徴量次元ごとに調整される。つまりそれぞれは $d_{model}$次元のベクトルである。
レイヤー正規化は、バッチ数が変化する環境においても適応できるという点で、特に自然言語処理分野ではバッチ正規化に変わる正規化手法として採用される。
2.5 単語の分散表現(Embedding)とソフトマックス
入力の単語は事前学習済みの単語分散表現を用いてベクトル表現に変換する。
また、デコーダーの最終出力は、同じ単語分散表現を逆向きに使って変換される。
2.6 位置エンコード
単語の位置関係を捉えることのできる再帰や畳み込みを行っていないため、このままだと単語の順番を認識できない。そこで位置エンコーディングを用いる。
位置エンコーディングは、単語を分散表現にした後で、そのベクトルに特定のベクトルを加えることで実現する。この時、ベクトルに加える値を決定する関数は以下の要件を満たすことが期待される。
- 各位置を一意に識別可能な表現力を持つこと
- 相対的な位置関係を線形計算のみで認識できる。つまり位置がposの時の位置エンコーディングの値を知っていて、そのk個あとの位置エンコーディングの値を求めたいなら、線形な計算のみで実現できる。
これらを満たす位置エンコーディング手法として、以下の関数が用いられている。

出典: Attention Is All You Need (Vaswani et al., 2017)
三角関数の加法定理により、2つ目の制約が美しく満足されている。
他の位置エンコーディング手法
- 学習済み位置埋め込み
- 位置を表す調整可能ベクトルを追加で準備し、その値を調整することで、位置を学習によって把握していく。500単語を上限とするなら、500個の位置ベクトルを作成する必要がある。
- 位置ベクトルはEmbeddingされた単語ベクトルの次元数と等しくある必要がある
- 単語ベクトルに、該当する位置ベクトルを加える。これにより位置エンコーディングが完了となる。
- 学習時は、attention層などの学習に加えて、この位置ベクトルも最適化していく
- 注意点として、学習時に設定した上限より長い文章は認識できなくなる。
3. データの流れを追う
Baseモデルについて考える。
データがどのように変換されていくのかを追っていく。
ついでにパラメータ数がどうなっているのかも考える。わかりやすいようにパラメータ数は分けて書く。
ハイパーパラメータ
Baseモデルのハイパーパラメーターは以下の通りになっている。
- $d_{model}=512$:埋め込みや各層の次元数。1単語を表現するベクトルの次元数である。
- $d_{ff}=2048$:Feed-Forwardネットワークの内部次元数
- $h=8$:マルチヘッドアテンションのヘッド数
- $N=6$:エンコーダーおよびデコーダー数
- $d_k=64$:キーの次元数
- $d_v=64$:バリューの次元数
- $V=37376$:語彙数(推定値)
合計パラメータ数(文献値)
Baseモデルは、全部で65Mのパラメータ数が存在する
エンコーダー側
モデル外:エンコーダー入力文字列→エンコーダー入力トークンID列
エンコーダーに入力される文字列をトークンに分割し、それぞれのトークンに割り当てられたIDに変換する。これにより文字列をベクトルに変換する。以降はこの長さを $L$とする。
データは $[L]$である。
Embedding:エンコーダー入力トークンID列→エンコーダー入力embeddingベクトル
入力されたトークンIDベクトルは、embeddingによって特徴量ベクトルに変換される。
データは $[L] → [L, d_{model}]$に変化する。
この時のembeddingに用いられる重み行列は $[V, d_{model}]$であり、パラメータ数19136512である。
位置情報付加:エンコーダー入力embeddingベクトルに位置情報を付加
前述した方法で位置情報をベクトルの各要素に付加する。
データは $[L, d_{model}]$ のままである。
エンコーダー:Multi-Head Attentionブロック
ベクトル$[L, d_{model}]$を、エンコーダーのマルチヘッドAttentionブロックへ入力する。
ヘッド数 $h$だけキー行列、クエリ行列、バリュー行列が用意される。ヘッドごとに用意されたキー行列、クエリ行列、バリュー行列に対して計算を実施し、 $\boldsymbol{K, Q, V}$を計算する。
$\boldsymbol{K}$は $d_k$次元であるから、その形状は $[L, d_k]$である。
$\boldsymbol{Q}$は $d_{k}$次元である(内積を計算するため $\boldsymbol{K}$と同じでなければならない)から、その形状は $[L, d_k]$である。
$\boldsymbol{V}$は ${d_v}$次元であるから、その形状は $[L, d_v]$である。
それぞれの行列の大きさを考える。
キー行列、クエリ行列はいずれも $[d_{model}, d_k]$である。バイアス項は $[d_k]$である
バリュー行列は $[d_{model}, d_v]$である。バイアス項は $[d_v]$である。
パラメーター数は1ヘッド当たり98496となる。
これが8ヘッド存在するから、1層当たり787968となる。
各ヘッドごとにattentionを計算する。
まず $\boldsymbol{Q}\boldsymbol{K}^T$を計算する。 $[L, d_k] \times [d_k, L]$で、その形状は $[L, L]$である。
次に $\sqrt{d_k}$で各要素を割る。形状は変化しない。
次に要素全体をsoftmaxに通す。形状は変化せず、行方向(index=0)の和が1になる。
次に $\boldsymbol{V}$を後ろからかける。 $[L, L] \times [L, d_v]$で、その形状は $[L, d_v]$である。
以上を各ヘッドに対して実行することで、 $[L, d_v]$が $h$個計算される。これらを並べることによって $[L, d_v \times h]$の行列が作成される。
作成された行列に $W_o$を掛け合わせる。 $[L, d_v \times h] \times [d_v \times h, d_{model}]$で、その形状は $[L, d_{model}]$になる。
$W_o$の形状は $[d_v \times h, d_{model}]$であり、バイアス $[d_{model}]$が存在する。
パラメータ数は1層当たり262656となる。
全てをあわせて、Multi-Head Attentionブロック全体で1050624パラメータある。
以上により、attention計算が完了した。
最終的にデータは $[L, d_{model}]$となっている。
エンコーダー:Add & Norm(Multi-Head Attention)
Attention計算済みの $[L, d_{model}]$と計算前の $[L, d_{model}]$を足しわせる。
その後、レイヤー正規化を実施する。
この正規化において、各特徴量次元に対する拡大と並行移動を行うための学習可能なパラメーターがそれぞれ $d_{model}$個ずつ、合計で $2d_{model}$個存在する。パラメーター数は1層当たり1024
データは $[L, d_{model}]$のままである。
エンコーダー:FFN(Feed Forward)ブロック
この層は全結合層(拡大)→ReLU→全結合層(縮小)からなっている。
一つ目の全結合層は、各トークンの持つデータの次元を $d_{model}$から $d_{ff}$まで増加させる役割を果たす。つまり $[d_{model}, d_{ff}]$の行列をデータに後ろからかける。 $[L, d_{model}] \times [d_{model}, d_{ff}]$により、データの形状は $[L, d_{ff}]$になる。
拡大に用いる行列は $[d_{model}, d_{ff}]$である。パラメータ数は1048576である。
さらにバイアスベクトル $[d_{ff}]$が加わる。パラメータ数は2048である。
よって拡大に用いる全結合層では合計1050624パラメータが存在する。
その後、拡大されたデータをReLUに通す。データの形状は変化しない。
次に、2つ目の全結合層により、各トークンの持つデータの次元を元の $d_{model}$へと減少させる。つまり $[d_{ff}, d_{model}]$を後ろからかける。 $[L, d_{ff}] \times [d_{ff}, d_{model}]$により、データの形状は $[L, d_{model}]$と戻る。
縮小に用いる行列は $[d_{ff}, d_{model}]$である。パラメータ数は1048576である。
さらにバイアスベクトル $[d_{model}]$が加わる。パラメータ数は512である。
よって縮小に用いる全結合層では合計1049088パラメータが存在する。
以上をまとめて、FFNブロック合計で1層当たり2099712パラメータが存在する。
最終的にデータは $[L, d_{mdoel}]$となる。
エンコーダー:Add & Norm(FFN)
Add & Norm(Attention)と同様の処理が行われる。
パラメータ数も同じく1024個である。
エンコーダー:まとめ
データは $[L, d_{model}]$によって入力されてから、attentionブロック、FFNブロックを通りつつ、最終的に $[L, d_{model}]$の形状を維持してエンコーダーを抜ける。
エンコーダーに用いられているパラメータ数の分布は以下の通りとなる。
Multi-Head Attention:1050624(1層当たり)→6303744
Add & Norm(Multi-Head Attention):1024(1層当たり)→6144
FFN:2099712(1層当たり)→12598272
Add & Norm(FFN):1024(1層当たり)→6144
エンコーダー合計:18914304
デコーダー側
モデル外:デコーダー入力文字列→デコーダー入力トークンID列
エンコーダーと同様、デコーダーに入力される文字列をトークンに分割し、それぞれのトークンに割り当てられたIDに変換する。これにより文字列をベクトルに変換する。以降はこの長さを $M$とする。
データは $[M]$である。
Embedding:デコーダー入力トークンID列→デコーダー入力Embeddingベクトル
入力されたトークンIDベクトルは、embeddingによって特徴量ベクトルに変換される。
データは $[M] → [M, d_{model}]$に変化する。
この時のEmbeddingに用いられる重み行列は、エンコーダーによって用いられたそれと同じである。よってパラメータ数は増加しない。
位置情報付加:デコーダー入力embeddingベクトルに位置情報を付加
位置情報を付加する。
データは $[M, d_{model}]$のままである。
デコーダー:Masked Multi-Head Attentionブロック
ベクトル $[M, d_{model}]$を、Masked Multi-Head Attentionブロックへ入力する。
これはエンコーダーにおけるMulti-Head Attentionブロックとほぼ同様であるが、Maskをする点が異なる。
Mask処理は、自分の位置より右側(未来側)の単語に対して、十分絶対値の大きい負の値を加えることで実現する。これにより、自分より未来の位置にある単語について、重要度がないものとして扱うことができる。
それ以外は同様であり、データは最終的に $[M, d_{model}]$になる。
用いられるパラメータもエンコーダーにおけるMulti-Head Attentionブロックと等しく、1層当たり1050624である。
デコーダー:Add & Norm(Masked Multi-Head Attention)
今までのAdd & Norm層と同様。
データは $[M, d_{model}]$のまま。
パラメータ数も同じく1層当たり1024
デコーダー:Multi-Head Attentionブロック
今までのAttentionブロックと違い、これはエンコーダーの最終出力と、デコーダーのデータを組み合わせる。
クエリはデコーダーのデータ $[M, d_{model}]$が用いられ、キーとバリューにはエンコーダーの最終出力 $[L, d_{model}]$が用いられる。対象は異なるものの、それ以外は通常通り $\boldsymbol{Q, K, V}$を作成する。
$\boldsymbol{Q}$は $[M, d_{model}]$にクエリ行列 $[d_{model}, d_k]$を後ろからかけることで、 $[M, d_k]$となる。
$\boldsymbol{K}$は $[L, d_{model}]$にキー行列 $[d_{model}, d_k]$を後ろからかけることで、 $[L, d_k]$となる。
$\boldsymbol{V}$は $[L, d_{model}]$にバリュー行列 $[d_{model}, d_v]$を後ろからかけることで、 $[L, d_v]$となる。
Attention計算に入る。 $\boldsymbol{QK^T}$は $[M, d_k] \times [d_k, L]$により $[M, L]$になる。
結果を $\sqrt{d_k}$で割る。
softmaxに通す。行ごとの合計が1になる。
$\boldsymbol{V}$を後ろからかける。 $[M, L] \times [L, d_v]$により $[M, d_v]$になる。
これが $h$個生成される。全てを並べて $[M, d_v \times h]$になる。
後ろから $W_o$をかける。 $[M, d_v \times h] \times [d_v \times h, d_{model}]$により $[M, d_{model}]$になる。
以上でattention計算が終了する。最終的に $[M, d_{model}]$となる。
パラメーター数は同じく1050624である。
デコーダー:Add & Norm(Multi-Head Attention)
今までのAdd & Norm層と同様。
データは $[M, d_{model}]$のまま。
パラメータ数も同じく1層当たり1024
デコーダー:FFN(Feed Forward)ブロック
エンコーダーのFFNブロックと同様。
データは $[M, d_{model}]$のまま
パラメータ数も同じくブロック合計で1層当たり2099712
デコーダー:Add & Norm(FFN)
今までのAdd & Norm層と同様。
データは $[M, d_{model}]$のまま。
デコーダー:全結合層(Linear)
以上の処理で抽出されたデータ $[M, d_{model}]$の各列には、そのトークンの持つ豊かな情報が $d_{model}$次元のベクトルとして格納されている。これを語彙トークンに関する情報に変換する。
やることは単純で、Embeddingの逆である。Embeddingに用いた行列の転置行列 $[d_{model}, V]$を後ろからかけることで、 データは$[M, V]$となる。各列に注目すると、その値は該当するトークンが、すべての語彙に含まれるトークンとそれぞれどのような関係にあるかを示す特徴量を示す。
本論文において紹介されているモデルはEmbeddingの重み行列をエンコーダー・デコーダーで共有しているため、パラメータ数は変化しない
デコーダー:softmax層
$[M, V]$をsoftmaxに通すことで、特徴量を確率として解釈する。これは、デコーダーに入力された各入力トークンと、全語彙トークンとの関係を示す確率として解釈される。 m列v行に存在する値は、デコーダーへ入力されたトークン系列のmトークン目を踏まえて、次に続くm+1番目のトークンが、語彙全体におけるv番目のトークンである確率を示す。
デコーダー:まとめ
データは $[M, d_{model}]$によって入力されてから、attentionブロック、FFNブロックを通りつつ、最終的に $[M, V]$の形状を維持してエンコーダーを抜ける。これは、各入力トークンと、全語彙トークンとの関係を示す確率として解釈される。
デコーダーに用いられているパラメータ数の分布は以下の通りとなる。
Masked Multi-Head Attention:1050624(1層当たり)→6303744
Add & Norm(Masked Multi-Head Attention):1024(1層当たり)→6144
Multi-Head Attention:1050624(1層当たり)→6303744
Add & Norm(Multi-Head Attention):1024(1層当たり)→6144
FFN:2099712(1層当たり)→12598272
Add & Norm(FFN):1024(1層当たり)→6144
エンコーダー合計:25224192
パラメータ数(算出値)
まとめると、以下のような値になる。
Embedding:19136512
エンコーダー:18914304
デコーダー:25224192
合計:63275012(63M)
文献値に僅かに届かない。この原因は語彙数 $V$の違いだと思われる。
