Rotary Position Embedding(RoPE)(ロータリーポジションエンベディング)
アテンション計算でQueryとKeyベクトルを回転行列で変換することで相対位置情報を直接エンコードする位置エンベディング手法。絶対位置埋め込みより長距離依存を捉えやすく、学習時より長いコンテキストへの外挿性が高い。
Rotary Position Embedding(RoPE)とは
Rotary Position Embedding(RoPE)は、2021年にZhuang Su et al.(EleutherAI/Zhuiyi Technology)が提案した位置エンコーディング手法です。2023年以降、Llama・Mistral・Qwen・Gemmaなど主要なオープンソースLLMで採用され、事実上のデファクトスタンダードとなっています。
従来手法の問題
絶対位置エンコーディング(APE)は学習時に見た最大長でしか動作せず、長さに固定されたルックアップテーブルのため学習外の長さへの外挿が困難です。相対位置エンコーディング(RPE、ALiBiなど)はQueryのアテンション行列にバイアスを加算する設計で実装が複雑、FlashAttentionとの統合が難しいという欠点があります。
RoPEの仕組み
数学的定義
RoPEはQueryとKeyベクトルに回転変換を適用します。位置 m のQueryベクトル q に対して:
RoPE(q, m) = R_m × q
# R_m は2D回転ブロックの対角行列
# θ_d = base^(-2d/D)(デフォルト: base = 10000)
相対位置の自動計算
RoPEの最大の特徴:回転変換後のQ・K内積が自動的に相対距離 (m-n) の関数になります:
RoPE(q, m) · RoPE(k, n) = f(q, k, m-n) # 相対位置 m-n のみに依存
PyTorchでのRoPE実装
import torch
import torch.nn as nn
class RotaryEmbedding(nn.Module):
def __init__(self, dim, base=10000):
super().__init__()
inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim))
self.register_buffer("inv_freq", inv_freq)
def forward(self, x, seq_len):
t = torch.arange(seq_len, device=x.device)
freqs = torch.einsum("i,j->ij", t, self.inv_freq)
emb = torch.cat((freqs, freqs), dim=-1)
return emb.cos(), emb.sin()
def apply_rotary_embedding(q, k, cos, sin):
def rotate_half(x):
x1, x2 = x.chunk(2, dim=-1)
return torch.cat((-x2, x1), dim=-1)
q_rotated = q * cos + rotate_half(q) * sin
k_rotated = k * cos + rotate_half(k) * sin
return q_rotated, k_rotated
RoPEのbase変更とコンテキスト延長
base(θの底)を大きくするとより長い位置まで区別できます:
Llama 2(base=10,000 / 4Kコンテキスト)、Llama 3 8B(base=500,000 / 8K、NTKで128K)、Mistral 7B v0.3(base=1,000,000 / 32K)、Qwen2 72B(base=1,000,000 / 128K)。
長文脈外挿手法
YaRN(Yet another RoPE extensioN)
model = AutoModelForCausalLM.from_pretrained(
"NousResearch/Yarn-Llama-2-13b-128k", # YaRN適用済み
torch_dtype=torch.float16
)
# 通常のLlama 2 13B(4K)がYaRNで128Kに延長
NTK-aware Interpolation(推論時オンライン延長)
config = LlamaConfig.from_pretrained("meta-llama/Llama-2-7b-hf")
config.rope_scaling = {
"type": "ntk",
"factor": 8.0 # 4K → 32K(8倍延長)
}
# ファインチューニング不要でコンテキスト延長
RoPEはその数学的エレガンスと実用的性能から、現代LLMの標準的な位置エンコーディングとなっています。FlashAttentionとの親和性が高く、YaRN・NTKなどの外挿手法により学習時の限界を超えたコンテキスト延長も可能です。Llama・Mistral・Qwen系モデルを扱うエンジニアにとって必須の知識です。