2017年のオリジナルTransformer論文で提案された位置エンコーディング手法。正弦(sin)と余弦(cos)関数を異なる周波数で組み合わせ、各位置に一意のベクトルを割り当てる。学習パラメータ不要で決定論的に生成される。
Sinusoidal Position Encoding は、Vaswani et al.が2017年の「Attention Is All You Need」論文でオリジナルTransformerとともに提案した位置エンコーディング手法である。sin関数とcos関数を異なる周波数で組み合わせ、各トークン位置に一意の固定ベクトルを割り当てる。
Transformerのself-attention機構は入力の順序に不変(permutation invariant)であるため、「私は猫が好き」と「猫は私が好き」を区別できない。この問題を解決するため、各位置に固定の位置ベクトルを加算する。
Sinusoidal PEの数式:
ここで pos はトークンの位置、i は次元インデックス、d はモデルの埋め込み次元数である。
Vaswaniらがsin/cosを選んだ理由は3つある:
| 性質 | 説明 | 実用上の意味 |
|---|---|---|
| 決定論的 | 学習不要、入力に依らず固定 | 推論時に事前計算可能 |
| 有界 | 値は [-1, 1] の範囲 | 数値的に安定 |
| 周期的 | 各次元が異なる周期を持つ | 位置の一意性を保証(十分な次元数で) |
| 線形変換可能 | PE(pos+k) = T_k × PE(pos) | 相対位置の学習が容易 |
import torch
import math
def sinusoidal_position_encoding(max_len, d_model):
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(1).float()
div_term = torch.exp(
torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model)
)
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
return pe
d_model=512 の場合、10000^(2i/d) は:
| モデル/システム | 年 | 位置エンコーディング | 最大長 |
|---|---|---|---|
| Transformer(原論文) | 2017 | Sinusoidal | 制限なし(理論上) |
| BERT | 2018 | Learned(学習型) | 512 |
| GPT-2 | 2019 | Learned(学習型) | 1024 |
| GPT-3 | 2020 | Learned(学習型) | 2048 |
| LLaMA | 2023 | RoPE | 2048-4096 |
| LLaMA 3 | 2024 | RoPE | 8192-128K |
Sinusoidal PEはオリジナルTransformer(機械翻訳)で使われたが、BERT以降のLLMでは学習型の位置埋め込みに置き換えられ、さらにRoPEへと進化した。ただし、Sinusoidal PEの数学的原理はRoPEの設計にも影響を与えている。
Sinusoidal PEの主な限界:
これらの限界を克服するために開発されたのが:
Q1: Sinusoidal PEは今でも使われている? A: 2026年時点の主要LLMでは使われていない。ただし、機械翻訳モデル、音声認識の一部、Vision Transformerの初期実装などでは依然として採用例がある。教育・研究目的では最も理解しやすい位置エンコーディングとして重要。
Q2: 学習型の位置埋め込みとの違いは? A: Sinusoidal PEは固定値で学習パラメータがゼロ。学習型はランダム初期化された埋め込みテーブルをデータから最適化する。BERTの実験では両者の性能差はほぼなかったが、学習型は最大長を事前に決める必要がある(BERTは512、GPT-2は1024)。
Q3: なぜ10000がbase値として選ばれた? A: Vaswaniらの論文では明確な理論的根拠は示されていない。経験的に10000が良い結果を出したとされる。この値は後のRoPEにも引き継がれ、d=128の場合に2πから約63,000までの広い周期範囲をカバーする。