AI・機械学習
中級

Rotary Position Embedding(RoPE)(ロータリーポジションエンベディング)

アテンション計算でQueryとKeyベクトルを回転行列で変換することで相対位置情報を直接エンコードする位置エンベディング手法。絶対位置埋め込みより長距離依存を捉えやすく、学習時より長いコンテキストへの外挿性が高い。

0 回閲覧
0 いいね
2026/6/7 更新
関連タグ
RoPE
位置エンベディング
相対位置エンコーディング
長文脈外挿
Llama

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系モデルを扱うエンジニアにとって必須の知識です。

この記事について
カテゴリーAI・機械学習
難易度中級
作成日2026/6/7