2D 회전이 Transformer의 긴 문맥(Long-Context) 문제를 해결한 방법: RoPE에 대한 메커니즘 중심의 고찰
요약
Transformer 모델의 긴 문맥 처리 문제를 해결하는 RoPE(Rotary Position Embedding)의 수학적 메커니즘을 분석합니다. 기존 절대적 위치 인코딩의 한계를 극복하고, 2D 회전을 통해 상대적 위치 정보를 보존하며 특징을 유지하는 원리를 설명합니다.
핵심 포인트
- 기존 절대적 위치 인코딩은 학습 범위를 벗어난 시퀀스에서 생성 붕괴를 초래함
- RoPE는 Query와 Key 벡터를 2D 평면에서 회전시켜 상대적 거리 정보를 주입함
- 회전 행렬의 직교성을 이용해 벡터 노름을 보존하며 상대적 오프셋만 추출함
- 어텐션 행렬을 직접 수정하지 않아 메모리 오버헤드와 연산 효율성 문제를 해결함
왜 2D 회전이 Transformer의 긴 문맥(Long-Context) 문제를 해결했는가: RoPE에 대한 메커니즘 중심의 고찰
Attention은 위치 인코딩(Positional Encodings)에 대해 두 가지를 요구합니다:
- 상대적 거리 민감도 (Relative Distance Sensitivity): 토큰 $i$가 토큰 $j$를 어텐션할 때, 컨텍스트 윈도우(Context Window) 내의 전역적인 위치가 아니라 두 토큰이 얼마나 떨어져 있는지($i-j$)를 주로 고려해야 합니다.
- 특징 보존 (Feature Preservation): 위치 정보를 주입하는 과정이 모델이 학습한 의미론적 임베딩 특징(Semantic Embedding Features)을 파괴하거나 훼손해서는 안 됩니다.
기존의 절대적 위치 인코딩(Absolute Positional Encodings)은 입력 임베딩에 정적인 사인/코사인(Sine/Cosine) 파형을 직접 더했습니다:
$x_i = e_i + p_i$
이는 모델이 의미론적 의미($e_i$)와 위치 정보($p_i$)를 분리(Un-mixing)하는 데 파라미터 용량을 낭비하게 만들었습니다. 더 심각한 문제는, 만약 모델이 최대 $N=2048$의 시퀀스 길이로 학습되었다면, 위치 2049는 학습되지 않은 벡터 $p_{2049}$를 제시하게 되어 즉각적인 생성 붕괴(Generation Collapse)를 초래한다는 점이었습니다.
이후의 접근 방식들은 어텐션 행렬 $QK^T + B$에 상대적 편향 항(Relative Bias Terms) $b_{i,j}$를 직접 추가하려고 시도했습니다. 기능적으로는 효과적이었지만, $N imes N$ 행렬을 수정하는 것은 FlashAttention과 같은 커널 수준의 GPU 퓨전(GPU Fusions)을 깨뜨리고 거대한 메모리 오버헤드를 발생시켰습니다.
여기서 Rotary Position Embedding (RoPE) (Su et al., 2021)이 등장합니다. 위치 벡터를 더하거나 어텐션 행렬을 *패치(Patching)*하는 대신, RoPE는 어텐션을 계산하기 전에 Query와 Key 벡터를 2D 부분 평면(2D Sub-planes)에서 **회전(Rotate)**시킵니다.
기하학: 회전 하에서의 내적 (Inner Products Under Rotation)
어텐션을 상대적으로 만들기 위해, 우리는 위치 $m$에 있는 벡터 $x$에 적용되는 인코딩 함수 $R(x,m)$이 위치 $m$의 Query와 위치 $n$의 Key 사이의 내적(Dot Product)이 오직 상대적 오프셋($m-n$)에만 의존하도록 만들고자 합니다:
$\langle R(q,m), R(k,n) \rangle = g(q, k, m-n)$
각도 변화를 인코딩하면서 벡터 노름(Vector Norms)을 어떻게 보존할 수 있을까요? 정답은 **복소 공간 회전 (Complex Space Rotations)**입니다.
2D 평면에서 벡터 $x = [x_1, x_2]^T$를 각도 $m heta$만큼 회전시키는 것은 다음과 같은 직교 회전 행렬(Orthogonal Rotation Matrix)로 표현됩니다:
$R_{ heta,m} = \begin{pmatrix} \cos m\theta & -\sin m\theta \ \sin m\theta & \cos m\theta \end{pmatrix}$
위치 $m$에서 회전된 Query와 위치 $n$에서 회전된 Key 사이의 내적을 계산하면:
$(R_{\Theta,m/2}q)^T(R_{\Theta,n/2}k) = q^T(R_{\Theta,m/2})^T R_{\Theta,n/2}k = q^T R_{\Theta,(n-m)/2}k$
$R^T(m)R(n) = R(n-m)$ 이기 때문에, 절대적 위치 $m$과 $n$은 완전히 상쇄됩니다. 결과적으로 산출되는 어텐션 가중치 (attention weight)는 오직 거리 $(m-n)$의 함수가 됩니다.
$d$ 차원 벡터에 대해, RoPE는 채널을 $d/2$개의 2D 평면 쌍으로 분할하고, 각 쌍에 서로 다른 회전 주파수 $\theta_i$를 적용합니다:
$\Theta = \theta_i = 10000^{-2(i-1)/d}, i \in [1, 2, \dots, d/2]$
고성능 벡터화된 PyTorch 구현 (High-Performance Vectorized PyTorch Implementation)
실제 환경에서 모든 헤드(head)와 토큰(token)에 대해 전체 블록 대각 회전 행렬 (block-diagonal rotation matrices)을 명시적으로 생성하는 것은 속도가 느립니다. 우리는 복소수 표현법 (complex number representation) 또는 실수 값 슬라이스 트릭 (real-valued slice trick)을 사용하여 RoPE를 효율적으로 구현할 수 있습니다:
$R_{\Theta,m}x = x \odot \cos(m\Theta) + \tilde{x} \odot \sin(m\Theta)$
여기서 $\tilde{x} = [-x_2, x_1, -x_4, x_3, \dots]$ 입니다.
다음은 깔끔하고 프로덕션 환경에 바로 적용 가능한 PyTorch 구현 예시입니다:
python
import torch
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기