Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3. 位置エンコーディングの仕組み

なぜ位置情報が必要なのか

RNN は単語を先頭から 1 つずつ順番に処理していたため、「何番目に読まれた単語か」という順序情報が自然にネットワークへ伝わっていました。 しかし、Transformer の Self-Attention は、文中のすべての単語を同時に並列計算します。

ここで大きな問題が生じます。 数学的に見ると、Self-Attention には「入力の順序を入れ替えても、同じ関係性のスコアが出力される」という順序不変性(Permutation Invariance)の性質があります。 語順の情報が一切与えられない場合、次の 2 つの文を Transformer は区別できません。

  • 「犬が 猫を 追いかけた」
  • 「猫が 犬を 追いかけた」

この 2 つの文は使われている単語が同一ですが、意味は正反対です。 並列計算の利点を保ちながら「どの単語が文頭にあり、どの単語が文末にあるのか」をモデルに教える仕組みとして導入されたのが、「位置エンコーディング(Positional Encoding)」です。

正弦波位置エンコーディングの数学的仕組み

原論文『Attention Is All You Need』では、三角関数(サイン関数とコサイン関数)を利用した「正弦波位置エンコーディング(Sinusoidal Positional Encoding)」が提案されました。 各単語の埋め込みベクトルと同じ次元を持つ「位置ベクトル」を計算し、単語の意味ベクトルに直接足し合わせます(加算)。

各位置 $pos$(0 番目、1 番目、2 番目…)およびベクトルの次元番号 $i$ に対して、次のような数式で値を算出します。

$$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) $$

$$ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) $$

ここで $d_{\text{model}}$ はベクトルの全次元数(例: 512 次元)を表します。

次元 0, 1   : 周期がとても短い波(すぐ隣の単語との違いを敏感に捉える)
次元 2, 3   : 少し周期が長い波
   ...
次元 510, 511: 周期が極めて長い波(文章全体の大きな位置関係を大まかに捉える)

▸ 三角関数が選ばれた理由

なぜただの数字の連番(1, 2, 3…)を足すのではなく、三角関数の波を使ったのでしょうか。 単なる連番を足すと、文が長くなったときに位置の値だけが極端に巨大化し、単語の意味ベクトルをかき消してしまいます。 三角関数を使えば、すべての値が必ず -1 から 1 の範囲に収まるため、単語の意味情報を壊しません。

さらに、三角関数の加法定理により、ある位置 $pos + k$ の位置ベクトルは、位置 $pos$ のベクトルの線形変換(回転のような計算)として表現できるという数学的な利点があります。 これにより、モデルは「絶対的な位置」だけでなく、「2 つの単語がどれくらい離れているか」という「相対的な距離」も容易に学習することができます。

▸ なぜ結合(Concat)ではなく足し算(加算)なのか

位置情報をベクトルに付け足す場合、後ろに新しい数値をくっつける「結合」のほうが直感的かもしれません。 しかし結合を行うと、ベクトルの次元数が増えて計算量が増加してしまいます。 高次元空間(たとえば 512 次元や 1024 次元)では、異なる情報同士が干渉せずに共存できる十分な広さがあるため、単純な足し算(重ね合わせ)であっても、ニューラルネットワークは単語の意味と位置の情報を正確に分離して認識できます。

学習可能位置埋め込み(Learned Positional Embedding)

正弦波のような固定の数式を使わず、位置情報そのものをニューラルネットワークの学習パラメータとして最適化する手法も広く使われました。 これを「学習可能位置埋め込み(Learned Positional Embedding)」と呼びます。

BERT や 初期の GPT(GPT-1、GPT-2)などでは、この学習可能な埋め込みが採用されました。 各位置(0番目用、1番目用…)に独立したベクトルを用意し、単語埋め込みと同様にバックプロパゲーションで最適な数値を学習させます。

この手法は実装がシンプルですが、「学習時に設定した最大長(例: 512 トークン)を超える長さの文章を処理できない」という致命的な欠点がありました。 学習していない 513 番目の位置ベクトルが存在しないためです。

現代の大規模言語モデルにおける位置表現の進化

現代の大規模言語モデル(LLM)では、数千から数十万トークンにおよぶ超長文を扱う必要があります。 そのため、より柔軟で拡張性に優れた位置表現手法が開発されてきました。

▸ 相対位置エンコーディング(Relative Positional Encoding)

単語の絶対的な場所(「文頭から何文字目か」)ではなく、単語同士の相対的な距離(「3 文字前にある」「5 文字後にある」)を直接 Attention のスコアに反映させる手法です(T5 などで採用)。

▸ 回転位置埋め込み(RoPE: Rotary Position Embedding)

LLaMA や Mistral、PaLM など、現代の最先端オープン LLM で業界標準となっているのが RoPE です。 2 次元の平面上でベクトルを角度 $\theta$ だけ回転させる操作を多次元に拡張し、Query と Key のベクトルをそれぞれの位置に応じて回転させます。 内積を計算したときに「位置の差(相対距離)」だけが数学的に綺麗に残る設計になっており、長文への汎化性能が非常に高いのが特徴です。

▸ ALiBi(Attention with Linear Biases)

位置埋め込みベクトルそのものを一切使わず、Query と Key の内積計算結果に対して、単語間の距離に比例したペナルティ(マイナスのバイアス)を直接引き算する手法です。 計算が極めてシンプルで、学習時よりもはるかに長い文章に対しても性能が劣化しにくいという強みを持っています。

このように、位置表現技術の進化によって、Transformer は語順を正確に把握するだけでなく、何万文字もの長文脈を自在に読み解けるようになりました。 次章では、これらを統合した Transformer の「エンコーダ」と「デコーダ」の全体アーキテクチャを解剖します。