본문 바로가기
AI2026년 8월 16일6분 읽기

RoPE(회전 위치 임베딩) — 컨텍스트 길이를 늘리는 위치 인코딩

YS
김영삼
조회 6
RoPE(회전 위치 임베딩) — 컨텍스트 길이를 늘리는 위치 인코딩

RoPE(Rotary Position Embedding, 회전 위치 임베딩)는 토큰의 위치 정보를 Query·Key 벡터를 각도만큼 "회전"시키는 방식으로 주입하는 위치 인코딩이다. 트랜스포머는 그 자체로는 단어 순서를 모른다. "개가 사람을 물었다"와 "사람이 개를 물었다"를 구분하려면 위치 정보를 넣어 줘야 한다. RoPE는 이 정보를 벡터에 더하는 게 아니라, 위치에 비례한 각도로 벡터를 돌려서 심는다. 그래서 두 토큰의 어텐션 점수가 자연스럽게 상대 거리에 반응하게 된다.

솔직히 처음엔 "위치를 왜 회전으로 넣지?"가 직관에 안 왔다. 그런데 컨텍스트 길이 확장 이야기를 파다 보면 결국 전부 RoPE로 수렴한다. 요즘 오픈 LLM 대부분이 이걸 쓰고, 긴 컨텍스트 트릭도 여기서 나온다.

절대 위치 임베딩의 한계

초기 트랜스포머는 위치마다 고정된 벡터를 만들어 토큰 임베딩에 더했다(절대 위치 임베딩). 이 방식엔 두 가지 답답함이 있었다. 학습 때 본 최대 길이를 넘어가면 위치 벡터가 없어서 곧장 무너진다. 그리고 모델이 배우는 건 "몇 번째 자리"라는 절대 좌표라, 정작 언어에서 중요한 "두 단어가 서로 얼마나 떨어져 있나"라는 상대 관계는 간접적으로만 얻는다.

RoPE는 이 지점을 정면으로 바꾼다. 위치 m의 토큰과 위치 n의 토큰을 각각 회전시켜 두면, 둘의 내적(어텐션 점수)이 m − n, 즉 상대 거리에만 의존하도록 수식이 짜여 있다. 절대 자리는 잊고 거리만 남는 셈이다.

어떻게 회전이 상대 위치가 되나

벡터를 2차원씩 짝지어 놓고, 각 짝을 위치에 비례한 각도로 돌린다. 낮은 차원은 빠르게, 높은 차원은 천천히 도는 여러 주파수를 섞어서 긴 거리와 짧은 거리를 모두 표현한다. 감을 위한 최소 코드다.

# 위치 pos에서 Q/K를 회전시키는 RoPE의 핵심
# dim: 헤드 차원, theta: 기저 주파수(보통 10000)
def rope(x, pos, dim, theta=10000.0):
    freqs = 1.0 / (theta ** (arange(0, dim, 2) / dim))
    ang = pos * freqs                 # 위치 × 주파수 = 회전각
    cos, sin = cos(ang), sin(ang)
    x1, x2 = x[..., 0::2], x[..., 1::2]   # 2개씩 짝지어
    # 각 짝을 (cos, sin)으로 회전
    return stack([x1*cos - x2*sin,
                  x1*sin + x2*cos], -1).flatten(-2)
q = rope(q, pos_q, dim)
k = rope(k, pos_k, dim)
# 이후 q·k 내적은 (pos_q - pos_k)에만 의존하게 된다

여기서 theta(기저 주파수, base)가 나중에 아주 중요해진다. 이 값이 회전 주파수의 스케일을 정하는데, 컨텍스트 확장 트릭들이 바로 이 손잡이를 건드린다.

컨텍스트 길이를 늘리는 트릭

RoPE가 사랑받는 진짜 이유는 학습보다 긴 길이로 확장이 비교적 쉽다는 점이다. 대표적인 방법 몇 가지.

방법아이디어
Position Interpolation위치 인덱스를 눌러 학습 범위 안으로 압축
NTK-aware / base 조정theta(base)를 키워 회전을 늦춤
YaRN 등주파수 대역별로 다르게 보정

공통 감각은 "회전각이 너무 커지지 않게 눌러서, 학습 때 본 각도 범위 안에 머물게 한다"는 것이다. 그래야 처음 보는 긴 위치에서도 모델이 덜 당황한다. 나는 로컬에서 base만 바꿔 컨텍스트를 늘렸다가, 짧은 프롬프트 성능이 살짝 깎이는 걸 보고 "확장엔 공짜가 없다"는 걸 실감했다.

RoPE는 위치를 더하는 대신 돌린다. 그 덕분에 상대 거리가 자연히 드러나고, 회전 속도만 조절하면 학습보다 긴 문맥으로도 비교적 우아하게 뻗어 나간다.

자주 묻는 질문

RoPE와 학습형 절대 위치 임베딩 중 뭐가 나은가요?

범용성 면에서 RoPE가 현재 사실상 표준에 가깝다. 상대 위치를 자연스럽게 표현하고, 컨텍스트 확장이 쉬우며, 임베딩 파라미터를 따로 학습해 저장할 필요도 없다. 다만 절대 위치가 유리한 특수 과제도 있으니 무조건은 아니다.

base(theta)만 키우면 컨텍스트가 공짜로 늘어나나요?

완전히 공짜는 아니다. base를 키우면 더 긴 위치를 표현할 수 있지만, 짧은 거리의 해상도가 다소 흐려져 원래 길이 구간의 성능이 조금 떨어질 수 있다. 그래서 확장 후에는 소량의 추가 학습으로 보정하거나, YaRN처럼 대역별로 다르게 조정하는 방법을 함께 쓴다.

RoPE를 쓰면 무한히 긴 입력도 처리되나요?

그렇지 않다. 위치 인코딩이 외삽에 강하다는 것과, 모델이 아주 먼 거리의 정보를 실제로 잘 활용한다는 것은 별개 문제다. 컨텍스트를 늘려도 중간 정보를 놓치는 현상은 여전히 있으니, 길이 확장과 실효 활용은 나눠서 봐야 한다.

RoPE는 어느 층에, 어디에 적용되나요?

보통 각 어텐션 층에서 Query와 Key에만 적용되고, Value에는 적용하지 않는다. 어텐션 점수(내적)에 상대 위치를 심는 것이 목적이기 때문이다. 매 층마다 다시 회전을 적용하는 것이 일반적인 구현이다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록