← 문제 목록/Rotary Positional Embedding (RoPE)
문제 해설

Rotary Positional Embedding (RoPE)

어텐션 · easy

preview

Rotary Positional Embedding (RoPE)

94번 Sinusoidal PE임베딩에 더하는 위치 신호. RoPE (Su et al. 2021, LLaMA/GPT-NeoX 표준) 는 query/key 를 위치에 따라 회전 시킵니다 — 내적이 자연스럽게 상대 위치 에 의존하게 됩니다.

수식

입력 xRL×dx \in \mathbb R^{L \times d} (dd 짝수). 차원을 으로 묶어 각 pair (x2i,x2i+1)(x_{2i}, x_{2i+1}) 를 위치 mm 에서 각도 θm,i\theta_{m,i} 만큼 회전:

θm,i=m100002i/d\theta_{m,i} = \frac{m}{10000^{2i/d}} (x2ix2i+1)=(cosθsinθsinθcosθ)(x2ix2i+1)\begin{pmatrix} x'_{2i} \\ x'_{2i+1} \end{pmatrix} = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x_{2i} \\ x_{2i+1} \end{pmatrix}

왜 좋은가

  • 상대 위치 를 attention 내적에 암묵적으로 부여: Rmq,Rnk\langle R_m q, R_n k \ranglemnm - n 에만 의존.
  • extrapolation 이 잘 됨: 학습 때 보지 못한 긴 시퀀스에서도 합리적으로 동작.
  • LLaMA, GPT-J, PaLM, Mistral 등 현대 LLM 기본.

과제

함수 rope(x) 를 완성하세요.

  • x shape (L, d), dd 짝수.
  • 반환: 같은 shape, 위치별 회전이 적용된 벡터.
  • 힌트:
    L, d = x.shape
    i = np.arange(d // 2)
    freq = 1.0 / 10000 ** (2 * i / d)                    # (d/2,)
    ang = np.arange(L)[:, None] * freq[None, :]          # (L, d/2)
    cos, sin = np.cos(ang), np.sin(ang)
    x_even = x[:, 0::2]; x_odd = x[:, 1::2]
    out_even = x_even * cos - x_odd * sin
    out_odd  = x_even * sin + x_odd * cos
    out = np.empty_like(x)
    out[:, 0::2] = out_even; out[:, 1::2] = out_odd
    return out
    

테스트 케이스

#이름검증
1shape (L, d)
2pos=0 → 입력 그대로회전각 0
3norm 보존회전은 길이 유지
4첫 쌍 손계산m=1, i=0: 각도 1 rad
5위치가 달라지면 결과 달라짐
코드 작성
Loading...
실행 결과

코드를 작성하고 Run 을 눌러보세요.