AI・機械学習
上級

YaRN(Yet another RoPE extensioN)(ヤーン)

RoPEの周波数帯域を低・中・高に分類し、帯域ごとに異なるスケーリング係数を適用することで、訓練コンテキスト長の32倍以上の外挿を実現する拡張手法。NTK-aware Scalingを発展させ、CodeLlamaやLLaMA 3.1の長文対応に貢献した。

0 回閲覧
0 いいね

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 < 波長/訓練長 < sNTK-aware(漸次的)圧縮と保存のバランスを取る
高周波波長 < 訓練長スケーリングなし既に訓練長内で1周期以上回転しており、外挿でも安定

ここで s はスケーリングファクタ(例: 4倍外挿なら s=4)。

性能比較

LLaMA 2-7B(訓練長4096トークン)を16Kトークンに外挿した実験:

手法Perplexity(16K)必要な追加学習備考
素のRoPE発散(>100)なし訓練長外で崩壊
Position Interpolation8.21000ステップ高周波の圧縮で短距離性能が微低下
NTK-aware Scaling7.8なし追加学習なしで使用可
YaRN7.1なし最良の外挿性能
YaRN + 微調整6.8400ステップ微調整でさらに改善

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 &lt; high_freq_wavelen
    mid_mask = ~low_mask &amp; ~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-awareYaRN
スケーリング対象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でサポート済み、ローカル推論でも利用可能