본문 바로가기
LLM/Architecture

위치 인코딩과 RoPE

by AtoN 2023. 11. 4.

위치 인코딩과 RoPE

Self-attention 자체에는 토큰이 몇 번째 위치에 있는지를 나타내는 정보가 없습니다. 위치 정보를 주지 않은 상태에서 입력 토큰의 순서를 함께 바꾸면 출력도 같은 순서로 따라 바뀌는 permutation equivariance를 가지므로, 언어처럼 토큰의 순서가 의미를 바꾸는 문제에서는 별도의 위치 정보가 필요합니다.

RoPE(Rotary Position Embedding)는 현대 decoder-only LLM에서 널리 사용되는 위치 표현 방식입니다. 각 위치에 따라 Q와 K 벡터의 일부 차원을 서로 다른 각도로 회전시키고, 두 벡터의 dot product를 계산하면 절대 위치로 적용한 회전의 차이가 두 토큰 사이의 상대 위치로 나타나도록 만듭니다.

그래서 위치 embedding을 토큰 표현에 단순히 더하는 방식과 달리, RoPE에서는 위치 정보가 attention score를 만드는 Q·K의 관계 안에 직접 들어갑니다. 모든 Transformer가 RoPE를 사용하는 것은 아니지만, 여러 decoder-only LLM이 이 방식을 채택했고 긴 context를 확장할 때도 RoPE의 회전 주파수를 어떻게 조정할지가 중요한 문제가 됩니다.

회전 행렬이 왜 상대 위치 차이를 남기는지부터 살펴보고, rope_theta와 주파수가 각 차원에 어떤 위치 주기를 만드는지 연결해서 봅니다. 마지막에는 학습 때보다 긴 context로 확장할 때 왜 단순히 position index만 늘려서는 충분하지 않은지, 그리고 RoPE scaling 계열 방법이 무엇을 조정하는지도 살펴봅니다.


1장. 순서를 모르는 어텐션

순열 등변성. 위치 정보가 없는 self-attention은 토큰 순서를 바꾸면 출력도 그 순서에 맞춰 함께 바뀝니다. 즉 순서를 완전히 무시해 하나의 동일 벡터를 내는 “불변(invariant)”이라기보다 등변(equivariant)입니다. 하지만 어느 토큰이 1번째인지 10번째인지 자체를 표현하지 못한다는 문제가 남습니다.

위치 인코딩의 도입. 각 토큰에 몇 번째인지를 심어 주는 장치가 위치 인코딩입니다.

RNN과의 대비. RNN은 순서대로 처리하니 순서가 구조에 내장돼 있지만 병렬화가 안 됩니다. 어텐션은 병렬화되는 대신 순서를 잃고, 그것을 위치 인코딩으로 되돌립니다. 병렬성을 얻은 대가로 생긴 문제입니다.


2장. 절대와 상대

절대 위치. 이 토큰은 3번째라는 정보를 임베딩에 더합니다.

원 트랜스포머의 sinusoidal 방식
   위치마다 다른 주기의 사인과 코사인 값을 더한다

학습된 위치 임베딩
   위치마다 벡터를 학습한다. BERT 계열

절대 방식의 한계. Learned absolute position embedding은 테이블에 없는 위치를 그대로 조회할 수 없으므로 최대 길이가 구조적으로 제한될 수 있습니다. Sinusoidal encoding처럼 수식으로 계산되는 absolute encoding은 범위 밖 위치도 정의되지만, 학습 길이 밖에서 성능이 유지된다는 보장은 별개입니다.

그리고 어텐션이 정말 필요한 것은 상대 거리입니다. 두 토큰이 몇 칸 떨어져 있는지가 각각 몇 번째인지보다 중요합니다.

상대 위치. 토큰 쌍의 거리나 위치 관계가 attention score에 직접 반영되도록 설계합니다. 구현에 따라 bias를 더하거나 Q/K를 변환하는 등 방식이 다양하므로 “상대 위치는 항상 느리다”라고 일반화할 수는 없습니다.

절대와 상대를 합친 RoPE. RoFormer 초록의 핵심 문장을 의미를 살려 옮기면 다음과 같습니다.

제안하는 RoPE는 회전 행렬로 절대 위치를 인코딩하면서 동시에 셀프 어텐션 수식에 명시적 상대 위치 의존성을 담는다.

넣을 때   각 토큰에 자기 위치만큼 회전을 건다   (절대)
계산될 때  두 벡터의 내적에 회전 차이만 남는다   (상대)

이 성질은 RoPE가 현대 Transformer에서 널리 채택된 중요한 이유 중 하나입니다.


3장. 회전이라는 발상

직관. 벡터를 위치만큼 돌립니다. 3번째 토큰이면 3단위만큼, 7번째 토큰이면 7단위만큼입니다.

내적에 차이만 남는 이유. 두 벡터의 내적은 사이각에 의존하고, 둘 다 같은 각도만큼 더 돌리면 사이각은 변하지 않습니다.

3 번째와 7 번째를 비교하면
   회전 차이가 4 다

103 번째와 107 번째를 비교해도
   회전 차이가 4 다

절대 위치를 넣었는데 결과는 상대 거리에만 의존합니다. 시계 두 개가 3시와 7시를 가리킬 때 사이각이 4시간분이고, 둘 다 100시간을 더 돌려도 사이각이 그대로인 것과 같습니다.

차원 쌍마다 다른 주기. 벡터 차원을 두 개씩 짝지어 회전시키는데 짝마다 회전 속도가 다릅니다. 빠르게 도는 짝은 가까운 거리를 세밀하게 구분하고, 느리게 도는 짝은 먼 거리를 대략 구분합니다. sinusoidal 인코딩이 여러 주기를 쓴 것과 같은 발상입니다.


4장. 논문이 밝힌 세 성질

아래도 RoFormer 초록의 주장을 의미를 살려 옮긴 것입니다.

RoPE는 시퀀스 길이의 유연성, 상대 거리가 늘수록 감소하는 토큰 간 의존성, 선형 셀프 어텐션에 상대 위치 인코딩을 장착할 수 있는 능력을 포함한 값진 성질을 가능하게 한다.

시퀀스 길이 유연성. 위치마다 벡터를 학습하지 않고 회전 각도를 계산할 뿐입니다. 그래서 학습 때 안 본 위치에도 값이 정의되고 외삽의 여지가 생깁니다. 다만 무한정 되는 것은 아니고, 6장에서 다룹니다.

거리에 따른 감쇠. RoFormer 논문은 상대 거리가 증가할수록 inter-token dependency가 감쇠하는 이론적 성질을 RoPE의 장점으로 제시합니다. 이를 “모든 토큰 쌍의 attention score가 거리와 함께 단조 감소한다”는 규칙으로 읽으면 과합니다. 실제 attention은 content vector, head, 주파수 성분의 상호작용까지 함께 결정합니다.

선형 어텐션에도 적용 가능한 형태. RoPE는 Q와 K 자체에 위치 변환을 적용하므로 명시적인 N×N 상대 위치 bias 행렬을 만들지 않고도 사용할 수 있는 장점이 있습니다. 그렇다고 모든 linear attention이 RoPE를 쓰는 것은 아닙니다.

실제 최신 hybrid 모델을 보면 더 복잡합니다. Qwen3.8의 Hugging Face 구현은 full-attention layer에서 RoPE를 적용하고 Gated DeltaNet linear-attention layer에는 같은 RoPE 경로를 전달하지 않습니다. Ling-3.0-tiny도 KDA와 MLA를 3:1로 섞으며, qk_rope_head_dim은 MLA의 Q/K 일부에 적용되는 설정입니다. 즉 RoPE와 linear attention의 결합 가능성은 원 논문의 성질이고, 실제 모델이 어느 layer에 적용하는지는 구현을 확인해야 합니다.


5장. rope_theta

정의. 회전 주기를 정하는 기저값이고 원 논문 기본값은 10000입니다.

키웠을 때의 변화. rope_theta를 키우면 RoPE의 주파수 스펙트럼이 낮아져 많은 차원에서 위치에 따른 회전이 더 느려집니다. 이것이 긴 위치 범위를 다루는 설정에서 자주 쓰이는 이유지만, 가까운 거리 성능이 정확히 얼마나 변하는지는 학습된 frequency usage와 scaling recipe에 따라 달라집니다. 단순히 “theta가 클수록 항상 long context가 좋아진다”는 규칙은 아닙니다.

실제 모델들이 쓰는 값입니다.

모델 rope_theta
원 논문 10,000
Ling-3.0-tiny 6,000,000
Qwen3.8 10,000,000

긴 컨텍스트 모델에서 큰 rope_theta가 자주 보이지만 값 하나만으로 모델의 실제 usable context를 판정할 수는 없습니다. 학습 길이, scaling recipe, attention 구조, post-training과 long-context evaluation을 함께 봐야 합니다.

그냥 키우면 안 되는 이유. 사전학습 때의 theta로 학습된 모델에 추론에서 다른 theta를 쓰면 분포가 어긋납니다. 그래서 컨텍스트 확장에는 별도 기법이 필요합니다.


6장. 컨텍스트 확장

Position Interpolation. Extending Context Window of LLMs via Positional Interpolation(2023-06)이 낸 발상은 외삽 대신 내삽을 하는 것입니다. 4096까지 학습된 모델을 8192로 쓰려면 위치 인덱스를 절반으로 눌러 학습 때 본 범위 안으로 밀어 넣습니다. 대가로 가까운 토큰의 위치 해상도가 떨어집니다.

YaRN. YaRN은 모든 RoPE 차원을 동일한 비율로 누르는 단순 Position Interpolation보다 주파수 구간에 따라 다른 interpolation/extrapolation 비율을 적용하고 attention scaling까지 함께 조정하는 방식입니다. 핵심은 RoPE의 여러 회전 주파수를 같은 방식으로 취급하지 않는다는 점입니다. 그래서 “고주파는 전혀 안 건드리고 저주파만 늘린다”처럼 이분법으로 외우기보다 frequency-aware scaling recipe로 이해하는 편이 정확합니다.

실제 설정. Ling-3.0-tiny의 base config.json은 max_position_embeddings=131072, rope_theta=6000000, rope_scaling=null입니다. 즉 체크포인트 자체의 기본 설정은 131K입니다. 다만 공식 모델 카드는 SGLang으로 262,144 context를 서비스할 때 아래와 같은 YaRN override를 권장합니다.

rope_scaling
   rope_type: yarn
   factor: 2.0
   rope_theta: 6000000
   partial_rotary_factor: 0.5
   original_max_position_embeddings: 131072

여기서 factor=2.0은 131,072 기준의 position scaling을 두 배 길이로 적용하는 serving recipe입니다. Base config와 long-context serving override를 같은 설정으로 착각하면 안 됩니다.


7장. 일부 차원에만 적용

partial RoPE. Qwen3.8의 현재 config에는 head_dim=256, partial_rotary_factor=0.25가 들어 있습니다.

head_dim: 256
partial_rotary_factor: 0.25
rope_theta: 10000000

따라서 full-attention Q/K head의 256차원 중 25%인 64차원에 rotary embedding이 적용되는 구조로 해석할 수 있습니다. rotary_dim: 64가 config의 독립 필드로 저장돼 있는 것은 아니고 head_dim × partial_rotary_factor에서 결정됩니다.

일부 차원만 회전하는 설계. Partial RoPE는 Q/K head dimension의 일부에만 회전을 적용하고 나머지 차원은 회전하지 않습니다. 이것을 단순히 “남은 차원은 내용만 담당한다”는 엄격한 기능 분리로 해석하기보다는, 위치 변환의 강도와 표현 용량을 조절하는 architecture choice로 보는 편이 안전합니다.

MLA와의 연결. Ling-3.0-tiny의 config입니다.

qk_nope_head_dim: 128    RoPE 안 거는 부분
qk_rope_head_dim:  64    RoPE 거는 부분

MLA 계열에서는 RoPE가 적용되는 key component를 latent compression 경로와 분리하는 decoupled RoPE 설계를 사용합니다. Ling-3.0-tiny 설정도 qk_nope_head_dim=128, qk_rope_head_dim=64로 나뉩니다. 이렇게 분리하면 위치 의존 부분을 따로 처리하면서 나머지 KV 표현을 압축하기 쉬워집니다. “partial RoPE가 없으면 어떤 MLA도 성립하지 않는다”기보다, 현재 MLA 구현에서 KV compression과 RoPE를 함께 쓰기 위한 핵심 설계 선택이라고 이해하는 편이 정확합니다.


8장. 실무

config에서는 이 값들을 봅니다.

필드 의미
rope_theta RoPE base frequency를 정하는 값. 큰 값이 긴 컨텍스트 설정에 자주 쓰이지만 단독으로 usable length를 결정하지 않음
rope_scaling 확장 설정. yarn 등
partial_rotary_factor 전체 중 몇 퍼센트에 거는가
rotary_dim RoPE 거는 차원 수
max_position_embeddings 학습된 최대 길이

컨텍스트를 늘릴 때. 모델 카드가 명시한 확장 설정을 그대로 씁니다. 임의로 theta만 바꾸면 품질이 무너집니다. 그리고 늘린 길이에서 실제로 성능이 유지되는지 재봅니다. 지원한다는 것과 잘 된다는 것은 다릅니다.

RoPE 밖의 롱컨텍스트 문제. 위치 인코딩이 늘어난 길이를 표현할 수 있어도 어텐션이 가운데를 흘리는 문제, KV 캐시가 부푸는 문제, 컨텍스트가 길수록 성능이 불안정해지는 문제가 전부 따로 있습니다. RoPE 확장은 필요조건이지 충분조건이 아닙니다.

확장 설정만 바꾸는 것의 한계. RoPE scaling을 추론 시점에 적용해 길이를 늘리는 recipe도 있지만, Position Interpolation과 YaRN 계열 연구는 확장된 위치 분포에 맞춘 추가 학습이나 fine-tuning을 함께 사용하거나 그 효과를 보고했습니다. 실제 모델에서는 제작자가 검증한 rope_scaling 설정과 추가 학습 여부를 모델 카드 기준으로 따라야 합니다.


9장. 정리

위치 정보가 없는 self-attention은 순서를 직접 표현하지 못합니다. RoPE는 Q/K를 절대 위치에 따라 회전시키고 두 벡터의 dot product에 상대 위치 차이가 나타나게 합니다. rope_theta와 scaling은 중요한 손잡이지만, 실제 context extension은 학습 길이와 PI/YaRN 같은 scaling recipe, 모델 구조를 함께 봐야 합니다.

rope_theta를 임의로 바꾸는 것만으로 안정적인 long context가 생기지 않습니다. RoPE scaling은 위치 표현의 한 부분이고 long-range retrieval, attention budget, KV/state memory, 학습 데이터 문제는 별도입니다. 또한 hybrid 모델에서는 RoPE가 full/MLA layer에만 적용되고 linear recurrent layer에는 적용되지 않는 경우도 있으므로 config 숫자만 보고 전체 layer 동작을 추정하면 안 됩니다.


용어 정리

용어 한 줄 뜻
위치 인코딩 어텐션에 토큰 순서 정보를 넣어 주는 장치
순열 등변 위치 정보 없는 self-attention에서 입력 순서를 바꾸면 출력도 같은 순열로 바뀌는 성질
절대 위치 각 토큰이 몇 번째인지를 직접 넣는 방식
상대 위치 두 토큰이 몇 칸 떨어졌는지로 다루는 방식
sinusoidal 여러 주기의 사인 코사인으로 위치를 표현한 원 트랜스포머 방식
RoPE 회전 행렬로 절대 위치를 넣되 내적에 상대 거리가 남는 인코딩
rope_theta 회전 주파수의 base를 정하는 값. 모델이 학습한 설정과 scaling recipe를 함께 봐야 함
외삽 / 내삽 학습 범위 밖으로 늘리기 / 범위 안으로 눌러 넣기
Position Interpolation (PI) 위치 인덱스를 눌러 학습 범위 안에 맞추는 확장 기법
YaRN 차원의 주파수별로 다르게 확장하는 기법
partial_rotary_factor 전체 차원 중 RoPE를 적용할 비율
rotary_dim RoPE를 거는 차원 수
유도 편향 모델 구조가 자연히 갖는 학습 성향

참고자료

'LLM > Architecture' 카테고리의 다른 글

Agent Observability (Langfuse, LangSmith)  (0) 2026.04.15
MoE (Mixture of Experts)  (0) 2025.09.20
GQA와 MQA  (0) 2024.10.07
LLM-as-a-Judge  (0) 2024.02.29
토큰과 토큰화 (Tokenization)  (0) 2022.10.06

댓글