RoPE Rotary Position Embedding Transformer LLM Pozisyon Kodlama Uzun Bağlam LLaMA

RoPE Nedir? Rotary Position Embedding Rehberi

Orta
person Yapay Zeka Uzmanı
list_altİçindekilerexpand_more
  1. 01Transformer’da pozisyon problemi
  2. 02RoPE nedir?
  3. 03Rotasyon matematiği: sezgisel bir bakış
  4. 04RoPE neden fark yaratıyor?
  5. 05Uzun bağlam için frekans ölçekleme: YaRN ve LongRoPE
  6. 06Hangi modeller RoPE kullanıyor?
  7. 07KV cache ve Flash Attention
  8. 08Ne zaman işe yarıyor, ne zaman yetersiz kalıyor?

Transformer ağında dönen vektör matrisleri ve açısal kodlama spiralleri

LLaMA 3’ü indirdiniz, Mistral’ı deniyorsunuz, DeepSeek-R1’in çıktısına bakıyorsunuz. Bu modellerin içinde, pek konuşulmayan ama kritik bir bileşen var: RoPE (Rotary Position Embedding). Bu yazıda RoPE’un ne işe yaradığını, neden günümüz LLM’lerinin neredeyse tamamının bunu tercih ettiğini ve milyonluk token bağlam pencerelerinin bu teknikle nasıl mümkün olduğunu ele alacağız.

Transformer’da pozisyon problemi

Bir Transformer’ın attention mekanizması, kelime sırası bilmez. Her token aynı anda diğer tüm tokenlara bakabilir; ama hangi tokenın önce, hangisinin sonra geldiğini öğrenmemiştir. Matris çarpımları sıra bilgisini taşımaz, bu yüzden pozisyonu ayrıca kodlamak gerekir.

“Kedi fareyi kovaladı” ile “Fare kediyi kovaladı” cümlelerine baksanız, token kümesi aynı. Attention mekanizması pozisyon bilgisi olmadan bu iki cümleyi birbirinden ayıramaz. İnsan okuyucu kelime sırasını anlık ve otomatik olarak kullanıyor; Transformer’ın bunu öğrenmesi için sıraya dair ayrı bir sinyal gerekiyor.

Orijinal “Attention is All You Need” makalesi bu sorunu sinüzoidal pozisyon embedding ile çözdü. Her pozisyona farklı frekanslarda sinüs/kosinüs değerlerinden oluşan sabit bir vektör eklendi. Basit ve çalışıyor, ama önemli bir kısıtı var: bu vektörler eğitim sırasında sabitlenir. Model 512 tokenla eğitilmişse, 2048 tokenlık bir girdiyle karşılaştığında pozisyon bilgisi bozulmaya başlar. 128K-1M token konuşulduğu bir dönemde bu kısıt oldukça dar kalıyor.

Bir diğer sorun, mutlak pozisyon kodlamanın göreceli mesafeyi doğrudan temsil edememesidir. “Birinci ve üçüncü token arasındaki mesafe” ile “yüzüncü ve yüz ikinci token arasındaki mesafe” aynıdır, ama mutlak PE bunları farklı pozisyonlar olarak kodlar. Bu tutarsızlık modelin genellemesini zorlaştırır.

Long context LLM yazısında bağlam pencerelerinin ne anlama geldiğini ayrıntılı işledik; pozisyon kodlamanın kalitesi o boyutlara ulaşmanın temel koşulu.

RoPE nedir?

RoPE, 2022’de Jianlin Su ve arkadaşları tarafından RoFormer makalesiyle önerildi. Temel fikir şu: pozisyon bilgisini vektöre toplamak yerine, vektörü döndür.

Sinüzoidal PE bir token embedding’ine sabit bir vektör ekler:

token_with_position = token_embedding + positional_vector

RoPE bu işlemi farklı yapar. Her token için query (Q) ve key (K) vektörlerini, o tokenın pozisyonuna karşılık gelen bir açı kadar döndürür:

Q' = R(pos_i) × Q
K' = R(pos_j) × K

Bu döndürme işleminin önemli bir özelliği var: Q ve K’nın iç çarpımı hesaplandığında, sonuç iki tokenın mutlak pozisyonlarına değil, aralarındaki mesafeye (i - j) bağlı çıkıyor. Model, “bu token 5. sırada” bilgisini değil, “bu iki token 3 adım uzakta” bilgisini öğreniyor. Bu fark uzun metinlere genellemede belirleyici oluyor.

Rotasyon matematiği: sezgisel bir bakış

2 boyutlu uzayda bir vektörü döndürmek standart bir matris işlemi:

R(θ) = [[cos θ, -sin θ],
         [sin θ,  cos θ]]

RoPE bunu d boyutlu uzaya taşır. d boyutlu vektörü d/2 çifte böler; her çift farklı bir frekansla döner:

θ_k = 1 / (10000^(2k/d))

k küçüldükçe frekans yükselir, büyüdükçe düşer. Düşük indisli boyutlar hızlı dönerek yakın tokenlardaki farkı, yüksek indisli boyutlar yavaş dönerek uzak tokenlardaki ilişkiyi kodlar. Bu frekans dağılımı modelin hem kısa hem uzun mesafeli bağımlılıkları öğrenmesine olanak tanır.

HuggingFace transformers’ın RoPE uygulaması temelde şöyle görünür:

import torch

def rotate_half(x):
    x1 = x[..., : x.shape[-1] // 2]
    x2 = x[..., x.shape[-1] // 2 :]
    return torch.cat((-x2, x1), dim=-1)

def apply_rotary_pos_emb(q, k, cos, sin, position_ids):
    cos = cos[position_ids].unsqueeze(1)
    sin = sin[position_ids].unsqueeze(1)
    q_embed = (q * cos) + (rotate_half(q) * sin)
    k_embed = (k * cos) + (rotate_half(k) * sin)
    return q_embed, k_embed

RoPE yalnızca Q ve K’ya uygulanır; Value (V) vektörü olduğu gibi kalır. Bu ayrım hem hesaplama maliyeti hem de KV cache verimliliği açısından önemli.

RoPE neden fark yaratıyor?

Göreceli mesafe kodlaması ilk bakışta ince bir detay gibi görünüyor. Pratikte ne fark yaratıyor?

Sinüzoidal PE eğitim sırasında sabit bir tablo oluşturur; model bu tablonun dışına çıkamaz. RoPE ise göreceli mesafeye dayalı öğrendiği için eğitim uzunluğunun ötesine kısmen taşınabiliyor. Model 4096 tokenla eğitilmişse bile 8192 tokenlık bir girdide pozisyon bilgisi sinüzoidal PE’ye kıyasla çok daha geç bozuluyor. Tam çalışmıyor, ama hâlâ çalışıyor; bu fark sonraki bölümdeki YaRN tekniklerinin temelini oluşturuyor.

Bunun yanı sıra RoPE embedding boyutuna ek yük getirmiyor. Sinüzoidal PE token embedding vektörüne sabit bir vektör ekler ve bu vektörün tüm model boyunca taşınması gerekir. RoPE ise sadece Q ve K üzerinde anlık bir dönüşüm yapıyor; modelin parametre sayısına yansıması yok. Bu, model boyutunu artırmadan pozisyon bilgisini öğrenmek anlamına geliyor.

Son olarak, RoPE eğitim sırasında gradyan akışına katılıyor. Model, hangi mesafelerin önemli olduğunu veriden öğreniyor; pozisyon temsili göreve göre adapte olabiliyor. Sinüzoidal PE veya ALiBi’de bu öğrenme gerçekleşmiyor.

Karşılaştırmalı tablo:

ÖzellikSinüsoidal PEALiBiRoPE
Göreceli konumHayırEvet (bias)Evet (rotation)
Uzun bağlam genellemesiZayıfOrtaGüçlü
Eğitime katılımHayırHayırEvet
Yaygın kullanımGPT-2, BERTFalcon (eski)LLaMA 3, Qwen 3, DeepSeek

Uzun bağlam için frekans ölçekleme: YaRN ve LongRoPE

Temel RoPE’un eğitim uzunluğunun çok ötesine geçmek için ek teknikler gerekiyor.

Position Interpolation (Meta, 2023) en basit yaklaşım: pozisyon indekslerini bir faktörle küçülterek görülmemiş uzunlukları bilinen aralığa sıkıştırıyorsunuz. İşe yarıyor, ama rotasyon açıları çok küçülünce düşük frekanslı boyutlar anlamlılığını yitiriyor.

YaRN (Yet Another RoPE ExtensioN, 2023) daha akıllıca bir çözüm. NTK teorisinden yola çıkarak farklı frekans grubuna farklı muamele yapıyor: düşük frekanslı boyutları saf interpolasyona, yüksek frekanslıları extrapolasyona bırakıyor. Bu ayrım performansı çok daha iyi koruyor. Mistral, Qwen ve DeepSeek teknik raporlarında YaRN veya türevini kullandıklarını açıkça belirtiyor.

LongRoPE (Microsoft, 2024) her katmandaki RoPE parametrelerini ayrı ayrı ayarlıyor ve kısa bağlamlarda performans kaybını önlemek için iki farklı pozisyon tablosu tutuyor. Bu yöntemle 2 milyon tokena kadar çıkılabiliyor.

DeepSeek-V2 ve V3, Multi-head Latent Attention (MLA) mimarisinde RoPE’u yalnızca küçük bir ayrılmış boyut kümesine uygular. KV cache boyutu bu şekilde dramatik ölçüde küçülüyor ama pozisyon bilgisi korunuyor.

Hangi modeller RoPE kullanıyor?

2024-2026 döneminde çıkan açık modellerin büyük çoğunluğu RoPE veya doğrudan bir türevi üzerine inşa edildi.

Meta’nın LLaMA 2’si standart RoPE’la başladı. LLaMA 3’te frekans parametreleri yeniden ayarlandı ve bağlam penceresi 8K’dan 128K’ya çıktı; bu geçiş büyük ölçüde o değişikliğin ürünü.

Mistral ve Mixtral, Sliding Window Attention ile RoPE’u birleştiriyor. Yerel pencere dışındaki bağlamı uzun menzilli RoPE boyutları taşıyor. YaRN tabanlı uzun bağlam eklentileri de mevcut.

Qwen 2.5 ve Qwen 3, varsayılan 32K’nın üstüne YaRN ile 128K pencere ekliyor.

DeepSeek-V2, V3 ve R1 serisi, MLA mimarisinde ayrılmış RoPE boyutları kullanıyor. Bu modellerin vLLM ile verimli çıkarımını ayrı bir yazıda ele aldık.

Google’ın Gemma 2 ve 3 modelleri de RoPE tabanlı; bu modeller üzerine yapılan ince ayar çalışmalarının tamamı için de aynı şey geçerli.

ALiBi (Attention with Linear Biases) kullanan eski modeller (Falcon, GPT-NeoX serisi) attention puanına pozisyona bağlı negatif bir offset ekliyordu. Eğitime katılmadığı için öğrenmesi hızlı. Ama uzun bağlamda RoPE kadar iyi genelleme yapamıyor ve yeni nesil modeller bu yüzden geçiş yaptı.

KV cache ve Flash Attention

RoPE yalnızca Q ve K’ya uygulandığı için Value vektörleri KV cache’de olduğu gibi depolanabiliyor. Eğer V’ye de uygulanmış olsaydı, her yeni token için geçmiş V değerlerinin tümü yeniden hesaplanması gerekirdi; bu boyutlarda bu pratik değil.

Sayısal olarak baksak: 128K tokenlık bir bağlamda, her katmanda 2048 boyutlu KV cache’i tutmak zaten ciddi miktarda GPU belleği istiyor. Bunu Q ve K’nın yanında V için de sıfırdan hesaplamak, her yeni token üretiminde maliyeti katlamak demek. RoPE’un V’yi atlama kararı bilinçli bir tasarım seçimi.

Flash Attention uyumluluğu da aynı şekilde çalışıyor. Flash Attention büyük attention matrislerini bellekte tutmak yerine blok blok hesaplıyor; RoPE’un fused kernel implementasyonu bu tiled düzene doğal uyum gösteriyor. Ayrı bir ön işlem adımı gerekmiyor.

Yerel çalıştırma için pratik çıkarım: vLLM veya llama.cpp kullanıyorsanız RoPE hesaplamaları GPU kernel’larına zaten gömülüdür. Elle yönetmenize gerek yok. Bağlam uzunluğunu varsayılan değerin ötesine uzatmak istiyorsanız, YaRN parametrelerini açıkça geçmeniz gerekiyor.

Ne zaman işe yarıyor, ne zaman yetersiz kalıyor?

Fine-tuning yapıp bağlam uzunluğunu değiştiriyorsanız, RoPE frekans parametrelerini de güncellemeniz gerekiyor. Bunu atladığınızda uzatılmış pozisyonlarda attention kalitesi düşüyor ve kayıp fonksiyonu dengesizleşiyor. Çoğu ince ayar kütüphanesi bunu otomatik yapmıyor; konfigürasyonda açıkça belirtmeniz gerekiyor. Örneğin Axolotl veya LLaMA-Factory ile ince ayar yapıyorsanız, rope_scaling parametresini ve hedef bağlam uzunluğunu açıkça tanımlamanız gerekiyor; aksi takdirde model eğitim bağlamının ötesinde tahmin üretirken pozisyon kodları anlamsız hale geliyor.

RAG ile long context arasında seçim yaparken, modelin bağlamı gerçekten okuyup okuyamadığı sorusu doğrudan RoPE’un genelleme kapasitesine bağlı. Hangi interpolasyon yöntemi kullanıldığı ve ne kadar ince ayar yapıldığı bu kapasiteyi belirliyor. Aynı temel modelin iki farklı ince ayar versiyonu, bağlam uzunluğu arttıkça ciddi biçimde ayrışabiliyor. Uzun bağlam gerektiren bir uygulama için model seçerken yalnızca desteklenen token sayısına değil, o modelin YaRN veya benzeri bir teknikle gerçekten ince ayar görüp görmediğine de bakmanız gerekiyor.

Akıl yürüten modeller uzun düşünce zincirleri üretiyor. DeepSeek-R1 bir problemi adım adım ele alırken çok büyük bağlamlara giriyor; bu uzunluklarda çalışabilmesi doğrudan RoPE’un genelleme kapasitesine dayanıyor.

RoPE’un sınırlarına gelmek gerekirse: eğitim dışı uzunluklarda performans hâlâ düşüyor, sadece daha yavaş düşüyor. YaRN ile 4K eğitimli bir modeli 128K’ya uzatmak mümkün ama 128K’lık bir model kadar kaliteli değil. Bu fark uygulama bazında önemli olabilir; özellikle uzun belge tutarlılığı gerektiren görevlerde test etmek gerekiyor.

MLA ile RoPE birbirinin yerine geçmiyor; DeepSeek bu ikisini birleştiriyor. Önümüzdeki dönemde değişim büyük olasılıkla RoPE’u tamamen yeni bir şeyle değiştirmekten değil, aynı prensibi daha az bellekte uygulayan yöntemlerden gelecek.


İlgili yazılar: Long Context LLM Nedir? · vLLM Nedir? · Akıl Yürüten AI Modelleri

auto_stories İlgili Makaleler