Rotary Position Embedding (RoPE)
회전 위치 임베딩(RoPE)은 토큰 위치에 따라 쿼리 및 키 벡터를 회전시켜 어텐션 점수가 상대적 거리에 따라 달라지게 합니다. 대부분의 오픈 LLM에서 사용됩니다.
회전 위치 임베딩(RoPE)은 각 쿼리 벡터와 키 벡터를 토큰 위치에 비례하는 각도만큼 회전시켜 트랜스포머에 토큰 순서 정보를 제공합니다. 셀프 어텐션만으로는 단어 순서를 구별할 수 없으므로 모델에 위치 정보를 주입해야 합니다. RoPE를 사용하면 위치 m의 쿼리와 위치 n의 키 사이 어텐션 점수는 오프셋 m − n에만 좌우됩니다. 2021년 RoFormer 모델과 함께 도입되고 EleutherAI의 GPT-J 및 GPT-NeoX를 통해 널리 알려진 RoPE는 이제 Llama, Mistral, Qwen, Gemma, DeepSeek를 비롯한 오픈 대규모 언어 모델(LLM)의 표준 위치 인코딩입니다.
RoPE 작동 방식#
RoPE는 차원이 d인 각 쿼리 및 키 벡터를 d/2개의 특징 쌍으로 나누고, 각 쌍을 평면상의 점으로 취급합니다. 위치 m에서 i번째 쌍은 각도 m·θᵢ만큼 회전하며, θᵢ = base^(−2i/d)이고 원 논문에서 base는 10,000입니다. 앞쪽 쌍은 빠르게 회전해 가까운 토큰의 순서를 세밀하게 구분하고, 뒤쪽 쌍은 천천히 회전하면서 수천 위치 떨어진 토큰도 구별합니다. 쿼리를 mθ만큼, 키를 nθ만큼 회전하면 두 벡터의 내적은 차이인 (m − n)θ에만 좌우되며, 회전해도 벡터의 길이는 바뀌지 않습니다. 회전은 쿼리 및 키 프로젝션 뒤에 각 어텐션 계층 내부에서 적용됩니다. 값 벡터는 회전하지 않으며 입력 단계의 토큰 임베딩에는 아무것도 더해지지 않습니다:
아래 코드는 Meta의 Llama 참조 코드와 같이 복소수를 사용해 회전을 구현하고 상대 위치 속성을 확인합니다:
import torch
torch.manual_seed(0)
dim = 64
freqs = 10000 ** (-torch.arange(0, dim, 2) / dim) # one rotation frequency per pair of features
def rope(x, pos):
"""Rotate each consecutive feature pair of x by the angle pos * frequency."""
pairs = torch.view_as_complex(x.reshape(-1, 2))
return torch.view_as_real(pairs * torch.polar(torch.ones_like(freqs), pos * freqs)).flatten()
q, k = torch.randn(2, dim)
# The same query and key, three tokens apart, at two different places in the sequence
print(f"positions 5 and 2: {rope(q, 5) @ rope(k, 2):.4f}")
print(f"positions 105 and 102: {rope(q, 105) @ rope(k, 102):.4f}")
print(f"positions 5 and 4: {rope(q, 5) @ rope(k, 4):.4f}") # one token apart
print(f"Vector length kept: {rope(q, 5).norm():.4f} vs {q.norm():.4f}")위치가 5와 2든 105와 102든 세 토큰 떨어진 두 쌍에 대해 모두 -8.2811을 출력하고, 같은 벡터가 한 토큰 떨어진 경우에는 -11.4563을 출력합니다. 회전한 쿼리의 길이는 8.3705로 유지됩니다.
RoPE와 다른 위치 인코딩 비교#
- 사인파 절대 위치 인코딩: 최초 트랜스포머는 첫 번째 계층 이전에 고정된 사인 및 코사인 벡터를 입력 임베딩에 한 번 더합니다. 혼합된 신호에서 상대 거리를 추론해야 합니다.
- 학습된 절대 임베딩: BERT와 GPT-2는 위치마다 벡터 하나를 학습하며, 각각 최대 512개와 1,024개 위치를 지원합니다. 이 제한을 넘는 위치에는 임베딩이 없습니다.
- 상대 위치 편향: T5와 ALiBi는 거리 기반의 학습형 또는 고정 편향을 어텐션 점수에 더합니다. RoPE는 회전 자체로 상대 거리를 인코딩하며 매개변수를 추가하지 않습니다.
컨텍스트 윈도우 확장#
길이 L의 시퀀스로 RoPE를 학습한 모델은 L을 초과하는 위치의 회전 각도를 접해 본 적이 없으므로 그러한 위치가 입력되면 어텐션 성능이 저하됩니다. 컨텍스트 확장 방법은 처음부터 다시 학습하는 대신 각도를 재조정합니다. 위치 보간은 새로운 위치를 학습된 범위에 맞춰 압축하며, 1,000회의 파인튜닝 단계만으로 Llama 모델의 컨텍스트 윈도우를 32,768토큰까지 확장했습니다. NTK 인식 스케일링과 YaRN은 느린 저주파 쌍을 빠른 쌍보다 더 많이 늘립니다. YaRN은 이전 방법보다 학습 토큰을 10배 적게 사용해 Llama 2를 128K 토큰까지 확장했습니다. Llama 3는 사전 학습 중 기준값을 10,000에서 500,000으로 높였으므로, 가장 느린 쌍은 토큰당 회전량이 줄어들고 멀리 떨어진 위치도 구별할 수 있습니다.
비전 모델에서의 RoPE#
이미지에는 두 개의 좌표가 필요하므로 비전 트랜스포머는 2D 또는 축형 RoPE를 사용합니다. 각 헤드의 특징 쌍 절반은 패치의 열을 기준으로, 나머지 절반은 행을 기준으로 회전합니다. Qwen2-VL은 멀티모달 M-RoPE에서 비디오를 위한 세 번째 시간 축을 추가합니다. Ultralytics 패키지에서 실행되는 Meta의 SAM 2는 메모리 어텐션의 네 계층에 축형 RoPE를 적용합니다. 이 어텐션에서는 현재 비디오 프레임의 특징이 이전 프레임의 저장된 특징을 참조합니다. 저장된 각 프레임의 키에는 현재 프레임의 쿼리와 동일한 그리드 각도가 적용되므로, 두 프레임 사이의 어텐션은 패치 간 공간 오프셋에 따라 달라집니다.










