AI・機械学習
中級

Sinusoidal Position Encoding(正弦波位置エンコーディング)(セイゲンハイチエンコーディング)

Transformer論文(Vaswani et al., 2017)で提案された位置エンコーディングの元祖。sin関数とcos関数を異なる周波数で組み合わせることで、各位置に一意のベクトルを割り当てる。学習パラメータが不要で、理論上は任意の長さの系列に対応可能。

0 回閲覧
0 いいね

Sinusoidal Position Encoding(正弦波位置エンコーディング)とは

Sinusoidal Position Encoding は、「Attention Is All You Need」(Vaswani et al., 2017)で Transformer と共に提案された最初の位置エンコーディング手法である。sin 関数と cos 関数を用いて各トークン位置に一意のベクトルを生成し、トークン埋め込みに加算することでTransformerに順序情報を与える。

正弦波エンコーディングの計算式

位置 pos、次元 i に対する位置エンコーディングは以下の式で定義される:

次元計算式
偶数次元 (2i)PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
奇数次元 (2i+1)PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))

ここで d_model はモデルの埋め込み次元数(元祖Transformerでは512)である。

周波数の意味

各次元ペア (2i, 2i+1) は異なる周波数の正弦波を持つ。

次元ペア波長捉える位置関係
i=02π ≈ 6.28極めて局所的
i=中間中程度中距離の位置関係
i=d/2-12π × 10000 ≈ 62,832大域的な位置関係

低次元は高周波で局所的な位置差を、高次元は低周波で大域的な位置関係を表現する。この多スケール構造により、モデルは近接関係と遠距離関係の両方を捉えることができる。

正弦波エンコーディングの数学的性質

性質1: 相対位置の線形変換

任意の固定オフセット k に対して、PE(pos+k) は PE(pos) の線形変換として表現できる。具体的には、2×2の回転行列 M_k が存在し、各次元ペアについて以下が成り立つ:

[PE(pos+k, 2i), PE(pos+k, 2i+1)] = M_k × [PE(pos, 2i), PE(pos, 2i+1)]

この性質により、モデルは相対位置を学習しやすくなる。

性質2: 位置ベクトルの一意性

異なる位置 pos_1 ≠ pos_2 に対して、PE(pos_1) ≠ PE(pos_2) が保証される。各次元ペアの位相が異なるため、全ての位置が一意に識別可能である。

性質3: 有界性

全ての要素が [-1, 1] の範囲に収まるため、トークン埋め込みとのスケールの不整合が起きにくい。

後継手法との比較

特性SinusoidalLearnedRoPEALiBi
提案年2017201820212022
学習パラメータなし位置数×d_modelなしなし
位置情報の注入加算加算乗算(回転)バイアス加算
相対位置の表現間接的なし直接的直接的
外挿性能低い不可中〜高(拡張込み)高い
現在の使用状況非LLM分野で現役BERT系で現役LLM標準一部LLM

現在の位置づけ

大規模言語モデルではRoPEやALiBiに主役の座を譲ったが、正弦波エンコーディングの設計思想は後継手法に深く影響を与えている。RoPEの周波数スケジュール θ_i = 10000^(-2i/d) は、正弦波エンコーディングと同一の設計を踏襲している。

また、Vision Transformer(ViT)の位置エンコーディングや、音声処理、時系列解析など非言語タスクでは依然として広く使われている。

FAQ

Q1: なぜ10000という定数が使われるのか?

10000は周波数範囲を制御するハイパーパラメータで、Vaswani et al.が実験的に選択した値。この値により、最低周波数の波長が約62,832となり、数万トークンの系列でも位置を区別できる。

Q2: 正弦波エンコーディングはなぜLLMで使われなくなったのか?

主に2つの理由がある。第一に、位置情報がトークン埋め込みに加算されるため、Attention計算で相対位置が直接表現されない。第二に、訓練時のコンテキスト長を超えた外挿性能が低い。RoPEはこれらの課題を回転行列で解決した。

Q3: Learned Positional Encodingとの違いは?

Sinusoidalは関数で位置ベクトルを生成するため追加パラメータが不要だが、Learnedは位置ごとにベクトルを学習する。BERT等の実験では両者の性能差は小さかったが、Learnedは訓練データに見ない位置への汎化が本質的に不可能である。