C.W.K.
Stream
Lesson 07 of 12 · published

RoPE — Rotary Position Embedding (모던 표준)

~18 min · rope, rotation, modern

Level 0Token
0 XP0/94 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Rotary Position Embedding (RoPE), Su et al. (2021)이 도입, 모던 decoder-only LLM의 사실상 표준 위치 인코딩이야. Llama 1/2/3/4, Mistral, Mixtral, Qwen, Phi, Falcon이 RoPE 또는 가까운 변종 사용. 거의 모든 긴 컨텍스트 논문이 그 위에 얹혀 있어서 제대로 이해할 가치 있어.

핵심 아이디어

입력 embedding에 위치 벡터를 더하는 대신, RoPE는 모든 위치에서 Q와 K 벡터를 위치 의존 각도로 회전시켜. 회전은 attention 안, Q/K projection 다음에 적용. 핵심 성질: 위치 m의 회전된 Q와 위치 n의 회전된 K의 dot product가 절대 위치가 아니라 상대 거리 m − n에만 의존.

θ_i = base^(−2i / d_head), 여기서 base = 10,000
(rotated_Q · rotated_K) at (m, n) ≡ f(content, m − n)

RoPE가 경쟁자를 제친 이유

  • 상대 위치가 공짜로 떨어져 — 전용 상대 위치 파라미터 없이.
  • 위치에 대한 학습 파라미터 0 — 결정적 기하 변환.
  • learned PE보다 외삽이 훨씬 잘됨. YaRN 스타일 스케일링 트릭(다음다음 lesson)으로 8K 학습 모델을 128K까지 적당한 fine-tuning으로 확장.
  • 구현 쉬움. 원소별 복소수 곱 — 추가 layer 없음.

Llama 4는 iRoPE(interleaved RoPE) 사용 — RoPE 있는 layer와 없는 layer를 번갈아, 더 좋은 긴 컨텍스트 동작 위해. 기본 아키텍처는 그대로, 위치 주입 노브만 튜닝.

Code

RoPE — minimal but real·python
import torch

def rope(x, base=10000.0):
    # x: (batch, seq_len, n_heads, d_head) — d_head must be even
    seq_len = x.shape[1]
    d_head = x.shape[-1]
    half = d_head // 2

    # Frequency per dimension (paired)
    inv_freq = 1.0 / (base ** (torch.arange(0, d_head, 2).float() / d_head))
    # Position-frequency outer product
    t = torch.arange(seq_len, dtype=inv_freq.dtype)
    freqs = torch.outer(t, inv_freq)            # (seq_len, half)
    cos, sin = freqs.cos(), freqs.sin()

    # Split last dim into pairs (even, odd) and rotate each pair
    x_even = x[..., 0::2]
    x_odd  = x[..., 1::2]
    rot_even = x_even * cos - x_odd * sin
    rot_odd  = x_even * sin + x_odd * cos

    out = torch.empty_like(x)
    out[..., 0::2] = rot_even
    out[..., 1::2] = rot_odd
    return out

# Inside attention:
# Q = rope(W_q(x))
# K = rope(W_k(x))
# V = W_v(x)   # V is NOT rotated

External links

Exercise

공식대로 PyTorch에 RoPE 구현. 위치 (0, 5)랑 (100, 105)에서 랜덤 Q/K 페어 두 개에 적용. 상대 거리가 같으니까 dot product가 같은지 검증. 그 다음 두 번째 페어를 (100, 115)로 바꿔 — dot product가 달라져야 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.