YaRN(Yet another RoPE extensioN)(ヤーン)
RoPEの周波数帯域を低・中・高に分類し、帯域ごとに異なるスケーリング係数を適用することで、訓練コンテキスト長の32倍以上の外挿を実現する拡張手法。NTK-aware Scalingを発展させ、CodeLlamaやLLaMA 3.1の長文対応に貢献した。
YaRN(Yet another RoPE extensioN)とは
YaRN(Yet another RoPE extensioN)は、Peng et al.が2023年に提案したRoPEの外挿拡張手法である。RoPEの各周波数成分を低周波・中周波・高周波の3帯域に分類し、帯域ごとに最適なスケーリング戦略を適用する。これにより、素のRoPEやPosition Interpolation(PI)、NTK-aware Scalingを超える外挿性能を実現した。
概要
RoPEは周波数 θ_i = base^(-2i/d) で定義される d/2 個の回転成分を持つ。各成分の波長は異なり、低インデックスの成分は長い波長(低周波)、高インデックスの成分は短い波長(高周波)を持つ。
素のPosition Interpolation(PI)はすべての成分を一律にスケーリングするが、これは高周波成分の情報を過度に圧縮してしまう。NTK-aware Scalingはbase値を拡大することで低周波成分を優先的にスケーリングするが、中間帯域の最適化が不十分だった。
YaRNは以下の3つの帯域にRoPE成分を分類する:
| 帯域 | 波長条件 | スケーリング戦略 | 理由 |
|---|---|---|---|
| 低周波 | 波長 > s × 訓練長 | Linear Interpolation | 訓練長外の位置をカバーするため圧縮が必要 |
| 中周波 | 1 < 波長/訓練長 < s | NTK-aware(漸次的) | 圧縮と保存のバランスを取る |
| 高周波 | 波長 < 訓練長 | スケーリングなし | 既に訓練長内で1周期以上回転しており、外挿でも安定 |
ここで s はスケーリングファクタ(例: 4倍外挿なら s=4)。
性能比較
LLaMA 2-7B(訓練長4096トークン)を16Kトークンに外挿した実験:
| 手法 | Perplexity(16K) | 必要な追加学習 | 備考 |
|---|---|---|---|
| 素のRoPE | 発散(>100) | なし | 訓練長外で崩壊 |
| Position Interpolation | 8.2 | 1000ステップ | 高周波の圧縮で短距離性能が微低下 |
| NTK-aware Scaling | 7.8 | なし | 追加学習なしで使用可 |
| YaRN | 7.1 | なし | 最良の外挿性能 |
| YaRN + 微調整 | 6.8 | 400ステップ | 微調整でさらに改善 |
128Kトークンへの外挿(32倍):
| 手法 | 成功/失敗 | 備考 |
|---|---|---|
| PI | 失敗(perplexity >50) | 32倍の圧縮は高周波を破壊 |
| NTK-aware | 中程度(perplexity ~15) | 中間帯域が不安定 |
| YaRN | 成功(perplexity ~8) | 帯域別スケーリングが有効 |
実装の核心
def yarn_find_correction_range(low_rot, high_rot, dim, base, max_pos_embed):
low_freq_wavelen = max_pos_embed / low_rot
high_freq_wavelen = max_pos_embed / high_rot
freqs = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim))
wavelens = 2 * math.pi / freqs
# 各周波数の波長に基づいて帯域を分類
low_mask = wavelens > low_freq_wavelen
high_mask = wavelens < high_freq_wavelen
mid_mask = ~low_mask & ~high_mask
return low_mask, mid_mask, high_mask
YaRNのハイパーパラメータ:
alpha(低周波しきい値): デフォルト1(波長 > 訓練長×scale)beta(高周波しきい値): デフォルト32(波長 < 訓練長/32)scale: 目標外挿倍率
採用実績
- CodeLlama-34B-100K: Metaが100Kトークン対応にYaRNベースの拡張を採用
- LLaMA 3.1-128K: 段階的なコンテキスト拡張でYaRNの原理を応用
- Qwen2.5-72B-128K: YaRN互換の周波数帯域別スケーリングを実装
- llama.cpp:
--rope-scaling yarnオプションで対応。ローカル推論で128Kコンテキストを実現 - vLLM 0.4+: YaRN scalingをネイティブサポート。サーバーサイドで長文推論が可能
NTK-aware Scalingとの比較
| 観点 | NTK-aware | YaRN |
|---|---|---|
| スケーリング対象 | base値(全成分に影響) | 帯域ごとに個別最適化 |
| 外挿倍率 | 4-8倍程度が限界 | 32倍以上可能 |
| 追加学習 | 不要 | 不要(微調整で改善可能) |
| 実装難度 | 低(base値変更のみ) | 中(帯域分類ロジック必要) |
| 短距離性能 | 高周波が微損傷 | 高周波を保存、性能維持 |
よくある質問(FAQ)
Q1: YaRNはどのモデルで使うべき?
A: RoPEベースのモデル(LLaMA系、Mistral、Qwen)で訓練コンテキスト長を超える推論が必要な場合に使う。llama.cppでは --rope-scaling yarn --rope-scale 4 のようにコマンドラインで指定可能。ただし2026年の最新モデル(LLaMA 3.1-128K等)は出荷時にYaRN相当の拡張が適用済みのため、追加設定は不要。
Q2: YaRNの「微調整400ステップ」は何をしている? A: 帯域別スケーリング後の重み分布を安定させるための短期追加学習。全パラメータではなくAttention層のみを対象とし、A100 1枚で数時間程度。微調整なしでもperplexityは十分低いため、推論のみのユースケースでは不要。
Q3: Dynamic NTKとYaRNの関係は? A: Dynamic NTKは推論時のシーケンス長に応じてbase値を動的に変更する手法。YaRNの帯域分類とは相補的な関係にある。llama.cppでは両方を組み合わせた実装も存在し、可変長シーケンスでの安定性が向上する。
まとめ
- YaRNはRoPEの周波数帯域を3分類し、帯域ごとに最適なスケーリングを適用
- 素のRoPEの32倍以上の外挿を追加学習なしで実現
- LLaMA 3.1-128K、Qwen2.5-128K、CodeLlama-100Kの長文対応の基盤技術
- llama.cpp、vLLMでサポート済み、ローカル推論でも利用可能