RoPE スケーリング(ロープスケーリング)
Rotary Position Embedding(RoPE)の周波数を調整し、事前学習時より長いコンテキストウィンドウを実現する手法の総称。線形スケーリング・NTK-awareスケーリング等の派生が存在する。
RoPE スケーリング — コンテキストウィンドウ拡張の基盤技術
RoPEスケーリングは、LLaMA・Mistral・Gemmaなど多くのオープンソースLLMが採用する**Rotary Position Embedding(RoPE)**の周波数特性を変更することで、事前学習時の最大系列長を超えた入力を処理できるようにする技術群の総称だ。
RoPEの基本原理
RoPEは、クエリ(Q)とキー(K)の内積に対して回転行列を適用し、相対位置情報をAttentionスコアに組み込む。各次元 d における回転角は:
θ_d = base^(-2d/D) (D: 埋め込み次元, base: 通常10000)
低次元(小d)ほど周波数が低く(長距離パターンを担う)、高次元ほど高周波(短距離パターン担当)。事前学習時の最大長を超えると、高周波成分が未学習領域に突入しパープレキシティが急上昇する(外挿崩壊)。
主要スケーリング手法の比較
1. 線形スケーリング(Linear Scaling)
最もシンプルな手法。全次元の周波数を係数 s で均一に圧縮する:
# theta_d を s 倍に分割(= 位置インデックスを 1/s 倍に正規化)
position_ids = position_ids / scale_factor
- 利点: 実装が1行、推論オーバーヘッドなし
- 欠点: 高周波成分(短距離依存性)まで圧縮されるため、近傍トークン間の関係表現が劣化
- 実績:
scale=8でLLaMA 2の4096->32768への拡張が確認されている
2. NTK-aware スケーリング
Neural Tangent Kernel(NTK)理論に基づき、低周波は変えず高周波のみを拡張する不均一スケーリング:
# base を拡張係数 alpha に応じてスケール
base = base * (alpha ** (dim / (dim - 2)))
- 利点: 近傍パターンを保ちながら長距離の外挿を改善
- 欠点: 最適な
alphaの探索が必要、完璧な外挿は保証されない - 実績: 継続訓練なしでLLaMA 2を8k~16kまで実用的に拡張可能
3. Dynamic NTK
実際の入力長に応じて alpha を動的に調整するNTKの改良版。短い入力では元のRoPEをほぼ維持し、長い入力にのみスケーリングを適用する。
限界と後続技術
RoPEスケーリングは簡便だが、事前学習済みの注意パターンを前提とするため大幅な長さ拡張(10倍以上)では品質が低下する。これを解決するためYaRN・LongRoPE・PoSEなどがより精密な手法を開発した。
実装例(Hugging Face Transformers)
from transformers import AutoConfig, AutoModelForCausalLM
config = AutoConfig.from_pretrained("meta-llama/Llama-2-7b-hf")
config.rope_scaling = {
"type": "linear", # または "dynamic"
"factor": 8.0
}
model = AutoModelForCausalLM.from_config(config)
Hugging Face Transformersは linear・dynamic・yarn・longrope の各タイプをネイティブサポートし、設定1行で切り替えられる。