A-5:位置エンコーディングの進化
A-4では、テキストをトークン列へ変換し、Transformerの入力を作る過程を見ました。しかし、トークンを同時に処理するTransformerは、IDの並びだけから順序を自動的に知るわけではありません。「犬が人を追う」と「人が犬を追う」は同じ語を含んでいても、語順によって意味が変わります。順序の情報を明示的に渡す必要があります。
その役割を担うのが位置エンコーディングです。位置情報は単に「何番目のトークンか」を足すだけの部品ではありません。トークン同士の距離をどう扱うか、訓練時より長い文脈へどこまで対応できるか、長文の推論コストをどう考えるかに関わります。
今回は、絶対位置エンコーディングから相対位置表現、RoPE、ALiBiまでを整理します。目標は、方式の名前を覚えることではなく、「モデルにはどの位置関係を学ばせたいのか?」という設計上の問いに答えられるようになることです。
1. なぜTransformerには位置情報が必要なのか?
Self-Attentionは、入力トークンを集合のように扱う計算です。位置情報を加えなければ、同じトークンと同じ特徴を持つ入力を並べ替えても、Attentionの計算だけでは順序を区別できません。自然言語、コード、時系列では、これは致命的な制約になります。

位置情報によって、モデルは少なくとも次の二つを扱えるようになります。
| 種類 | 例 | 重要になる理由 |
|---|---|---|
| 絶対位置 | 文頭から何番目か | 文頭・文末、段落の先頭などを区別する |
| 相対位置 | 二つのトークンが何個離れているか | 近接、修飾、長距離参照などを表す |
位置情報があるから、モデルが文法や因果関係を必ず正しく理解するわけではありません。位置エンコーディングは順序を利用できるようにする入力であり、その関係を学習できるかはデータ、モデル容量、学習方法にも左右されます。
課題:位置情報がなければ、Self-Attentionは入力トークンを単なる「集合(Bag of Words)」として処理する。 自然言語やコードの因果関係を解釈するには、順序を幾何学的に定義する仕組みが不可である。
2. 絶対位置エンコーディングはどのように使うのか?
初期のTransformerでは、各位置に対応するベクトルをトークンのEmbeddingへ加算します。原論文では、異なる周波数の正弦波と余弦波からなる固定の位置ベクトルが使われました。
$$ \operatorname{PE}(p, 2i) = \sin\left(\frac{p}{10000^{2i/d}}\right), \qquad \operatorname{PE}(p, 2i+1) = \cos\left(\frac{p}{10000^{2i/d}}\right) $$
ここで $p$ は位置、$i$ は次元の組、$d$ は埋め込み次元です。周波数の異なる波を組み合わせることで、各位置を異なるベクトルとして表します。位置ベクトルを学習可能なパラメータにする方法もあり、BERT系などで使われています。

| 方式 | 利点 | 注意点 |
|---|---|---|
| 固定の正弦波・余弦波 | 追加の学習パラメータが不要 | 長い位置への一般化は学習条件に依存する |
| 学習可能な絶対位置Embedding | データに合わせた表現を学べる | 学習時に見ない位置への外挿が難しい場合がある |
正弦波は訓練時の最大長を超える位置でも計算できます。ただし、計算できることと、その位置でモデルが高い性能を出せることは別です。訓練で十分に扱っていない距離や長さに対して、性能が保たれる保証はありません。
3. 相対位置表現は何を変えるのか?
相対位置表現では、「位置10にある」という絶対的な番号よりも、「QueryとKeyが3トークン離れている」という関係をAttentionの計算へ入れます。語順の中でも、近接した修飾や離れた参照を扱う場合に自然な表現です。
代表的な方法の一つは、Attentionスコアへ相対距離に応じたバイアスを足す方法です。

$b(i-j)$ は、Queryの位置 $i$ とKeyの位置 $j$ の距離に基づく値です。T5では、距離を複数のバケットに分け、それぞれに学習可能なバイアスを持たせる方式が採られています。距離をそのまま一つずつ持つより、遠い距離を粗くまとめられるため、必要なパラメータを抑えやすくなります。
相対位置を使っても、長文への外挿が自動的に解決するわけではありません。距離をバケットに丸める設計や、訓練で見た長さ、評価方法によって挙動は変わります。
距離をバケットにまとめることで、遠距離のパラメータ数を抑えつつ、トークン間の相対的な関係性を直接Attentionスコアへ加算する。
4. RoPEは回転で位置をどのように表すのか?
RoPE(Rotary Position Embedding)は、QueryとKeyの次元を二つずつ組にして、位置に応じた角度だけ回転させる方法です。ValueではなくQとKへ適用することで、Attentionスコアに相対距離の情報を反映しやすくします。
2次元のベクトル $(x_1, x_2)$ を角度 $\theta$ だけ回すと、次のようになります。


絶対的な位置番号を加算するのではなく、QとKのベクトル自体を位置に応じて回転させる。Decoder-only LLMにおける現在のデファクトスタンダード。
RoPEでは位置 $p$ と次元ごとの周波数 $\omega_i$ を使い、角度を $p\omega_i$ とします。Qを位置 $m$、Kを位置 $n$ で回転して内積を取ると、回転の差、すなわち $m-n$ に依存する成分が現れます。この性質により、位置番号をEmbeddingへ直接足さずに、Attentionの照合へ相対位置を組み込めます。

RoPEは位置を「回転角」で表すため、二つのトークンの距離がAttentionの相性に反映されます。ただし、RoPEがすべての相対位置を完全に表現する、あるいは長文で必ず優れるという意味ではありません。周波数の設定、学習長、スケーリング方法が性能に影響します。
「絶対的な回転」を利用して「相対的な距離」をAttentionの照合へ組み 組み込むエレガントな幾何学的アプローチ
5. ALiBiは位置をどのように扱うのか?
ALiBi(Attention with Linear Biases)は、Attentionスコアへ相対距離に応じた線形のペナルティを加える方法です。Causal Self-Attentionでは、一般に遠い過去ほど小さくなるバイアスをヘッドごとに異なる傾きで与えます。
$$ \operatorname{score}(i,j) = \frac{q_i k_j^\mathsf{T}}{\sqrt{d_k}} – s_h(i-j) \quad (j \leq i) $$
ここで $s_h$ はヘッド $h$ ごとの正の傾きです。ヘッドごとに異なる距離への偏りを持たせることで、近い文脈を重視する視点と、比較的遠い文脈も参照する視点を作れます。追加の位置Embeddingを学習しない点が特徴です。
ALiBiは長さの異なる系列にも適用しやすい設計ですが、実際の長文性能はモデルと訓練設定に依存します。「訓練長を超えても使える可能性がある」という性質と、「任意の長さで精度が保たれる」という主張は分けて考えるべきです。
位置Embeddingの学習を完全に放棄。遠い過去のトークンになるほど、Attentionスコアに対して数学的に厳格な線形ペナルティ(マイナス値)を課す。
6. RoPE・ALiBi・相対位置バイアスはどのように選ぶのか?
位置表現は、モデルの用途や既存実装との整合で選びます。単純な性能順位ではなく、どこへ位置情報を入れるか、外挿をどのように評価するかが違います。
| 方式 | 位置情報を入れる場所 | 追加パラメータ | 特徴 |
|---|---|---|---|
| 絶対位置Embedding | 入力Embedding | 必要 | 実装が分かりやすいが、学習長外への対応は課題になりやすい |
| 相対位置バイアス | Attentionスコア | 方式による | 距離の関係を直接扱える |
| RoPE | Q・Kの回転 | 原則不要 | 相対距離を内積へ反映し、Decoder-only LLMで広く使われる |
| ALiBi | Attentionスコア | 原則不要 | 距離による線形バイアスを与える |
既存モデルを継続学習・微調整する場合は、位置表現を途中で変えないのが基本です。位置表現を変えると、Q・Kの分布やAttentionパターンが変わり、学習済み重みとの整合が崩れる可能性があります。新規に学習する場合も、まず再現性のある基準構成を置き、コンテキスト長の評価を含めて比較しましょう。
7. 長いコンテキストで、なぜ追加の工夫が必要になるのか?
RoPEやALiBiを採用しても、長文の扱いには二つの独立した問題があります。一つは位置表現の一般化です。訓練で見た長さを超える位置や距離に対して、Attentionがどのように働くかを検証する必要があります。もう一つは計算資源です。A-2で見た通り、標準的なAttentionのトークン対は系列長の二乗で増えます。
RoPEをより長いコンテキストで使うために、位置のスケーリングや周波数の調整を行う手法が提案されています。線形補間、NTK-aware scaling、YaRNなどが知られていますが、どの手法も既存モデルへ無条件に適用できるものではありません。目的の長さ、追加学習の有無、短い文脈の性能低下、評価データを含めて検証が必要です。
位置表現を変えれば計算量の問題が消えるわけでもありません。長文対応では、位置情報の設計とFlashAttention、KVキャッシュ、疎なAttentionなどの実装上の工夫を分けて考えることが重要です。
8. 最小コードでRoPEの回転を確認する
以下は、最後の次元を二つずつ組にしてRoPEを適用する最小例です。周波数の事前計算やKVキャッシュの扱いは省き、位置に応じてQまたはKの値が回転する骨格だけを示しています。
import torch
def apply_rope(x: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor) -> torch.Tensor:
"""x: (batch, heads, sequence, head_dim), head_dimは偶数"""
x_even = x[..., 0::2]
x_odd = x[..., 1::2]
# cos, sin: (sequence, head_dim // 2)
cos = cos.unsqueeze(0).unsqueeze(0)
sin = sin.unsqueeze(0).unsqueeze(0)
rotated_even = x_even * cos - x_odd * sin
rotated_odd = x_even * sin + x_odd * cos
return torch.stack((rotated_even, rotated_odd), dim=-1).flatten(-2)
x = torch.randn(2, 4, 8, 64)
positions = torch.arange(8, dtype=torch.float32)
freqs = 1.0 / (10000 ** (torch.arange(0, 64, 2) / 64))
angles = torch.outer(positions, freqs)
x_with_position = apply_rope(x, angles.cos(), angles.sin())
print(x_with_position.shape) # torch.Size([2, 4, 8, 64])
実装では、QとKのどちらにも同じ位置と周波数の定義で適用すること、KVキャッシュ使用時に位置オフセットを正しく進めることが重要です。ここを誤ると、形状は合っていても生成品質が崩れる可能性があります。
9. よくある誤解と確認ポイント
9.1 位置情報を加えれば長文性能が保証される
位置表現は長文対応の一部です。訓練データの長さ、長文タスクの学習、Attention実装、評価方法が不足していれば、位置情報だけを変更しても必要な情報を取り出せるとは限りません。
9.2 RoPEは入力Embeddingへ足す位置ベクトルである
RoPEは、一般にQとKへ回転を適用する方法です。Embeddingへ加算する絶対位置Embeddingとは、位置情報を注入する場所が異なります。実装を読むときは、位置情報がinput_embedsに足されているのか、Q・Kに適用されているのかを確認しましょう。
9.3 コンテキスト長を増やせば、すぐに使える情報も増える
最大長を増やしても、モデルが文脈の中央や遠い位置の情報を正しく利用できるとは限りません。必要な長さのデータで評価し、入力位置ごとの性能や、実際の推論メモリも確認する必要があります。
10. まとめ

今回の要点を整理します。
- Transformerは順序を自動的に扱わないため、位置情報を明示的に与える必要がある
- 絶対位置は「何番目か」を、相対位置は「どれだけ離れているか」を扱う
- RoPEはQ・Kを位置に応じて回転させ、Attentionの内積へ相対距離を反映する
- ALiBiはAttentionスコアへ距離に応じた線形バイアスを加える
- 訓練長を超える長文では、位置表現の一般化とAttentionの計算資源を別々に検討する
- 既存モデルの位置表現を途中で変える場合は、追加学習と評価を前提にする
位置エンコーディングは、トークン列へ順序を付けるための補助情報ではありません。Attentionがどの距離の関係を学び、どの範囲の文脈を利用できるかに関わる、Transformerの重要な設計要素です。
11. 今回のブログの考察:A-6への橋渡し
A-5では、トークン列に順序と距離を与える方法を見ました。ここまでで、入力を作るトークン化、文脈を集めるSelf-Attention、表現を変換するFFN、学習を支える正規化、順序を伝える位置表現という主要部品を個別に確認してきました。
次に必要なのは、これらを一つのTransformerブロックとしてどの順序で組み合わせ、どの規模で積み重ねるかを考えることです。Pre-NormかPost-Normか? FFNの中間次元をどの程度にするか? ヘッド数や層数は何とトレードオフになるのか?といった設計判断が、モデルの性能・安定性・計算コストを結び付けます。
次回A-6では、構成要素の統合と設計を扱います。部品を個別に知る段階から、目的に応じて一つのTransformerを設計する段階へ進みましょう。
参考文献
- Vaswani, A., Shazeer, N., Parmar, N., et al. (2017). “Attention Is All You Need.” NeurIPS 2017. https://arxiv.org/abs/1706.03762
- Shaw, P., Uszkoreit, J., & Vaswani, A. (2018). “Self-Attention with Relative Position Representations.” https://arxiv.org/abs/1803.02155
- Raffel, C., Shazeer, N., Roberts, A., et al. (2020). “Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer.” JMLR. https://arxiv.org/abs/1910.10683
- Su, J., Lu, Y., Pan, S., et al. (2021). “RoFormer: Enhanced Transformer with Rotary Position Embedding.” https://arxiv.org/abs/2104.09864
- Press, O., Smith, N. A., & Lewis, M. (2022). “Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation.” https://arxiv.org/abs/2108.12409
- Peng, B., Quesnelle, J., Fan, H., & Shippole, E. (2023). “YaRN: Efficient Context Window Extension of Large Language Models.” https://arxiv.org/abs/2309.00071
このシリーズの案内
ブログA「Transformer構成」(全7回)では、現代のLLMを支えるTransformerの構成要素を、全体像から実装への接続まで段階的に扱います。
| # | テーマ | 内容 |
|---|---|---|
| A-1 | Transformer構成の基本概念と重要性 | 全体像、部品の役割、データフロー |
| A-2 | Self-Attentionの詳細 | Q・K・V、Causal Mask、マルチヘッド、計算量 |
| A-3 | 正規化と活性化関数 | LayerNorm、RMSNorm、GELU、SwiGLU |
| A-4 | トークン化と語彙構築 | BPE、SentencePiece、語彙サイズの設計 |
| A-5 | 位置エンコーディングの進化 | 絶対位置、相対位置、RoPE、ALiBi(今回) |
| A-6 | 構成要素の統合と設計 | Pre-Norm、層構成、スケーリングとの関係 |
| A-7 | 理論の総まとめ | 概念の統合と実装編への橋渡し |
1. 前の記事
2. 次に読む
- A-6:構成要素の統合と設計

コメント