← 학습 경로

공통 · 2026-09-10

RoPE: 토큰 위치를 Attention에 반영하기

Q와 K의 성분을 토큰 위치에 따라 회전하는 방법과, 상대 위치가 Attention 점수에 반영되는 과정을 살펴봅니다.

지난 글에서는 Core Attention에서 Q와 K로 토큰 사이의 점수를 계산하고, 그 점수로 얻은 가중치에 따라 V를 모으는 과정을 살펴봤습니다. 이번 글에서는 이 계산에 토큰의 위치를 반영하는 RoPE(Rotary Position Embedding)를 살펴보겠습니다. Q와 K의 성분을 위치에 따라 회전하고, 두 벡터를 비교할 때 위치 차이가 함께 반영되는 과정입니다.

지금까지의 계산에서 위치는 어떻게 반영될까요?

지금까지 살펴본 디코더 블록에서 RMSNorm, MLP, Residual 덧셈은 각 토큰에 독립적으로 적용됩니다. Attention 안에서도 Q·K·V projection과 출력 projection은 같은 토큰의 성분을 변환합니다. 다른 토큰의 벡터를 비교하고 정보를 모으는 계산은 Core Attention에서 이루어집니다. 그 안에서 QKᵀ는 토큰 사이의 점수를 계산하고, PV는 여러 토큰의 Value를 가중합합니다.

디코더 블록에서 Attention, Core Attention으로 범위를 좁힙니다. QK 전치는 점수 계산, Causal mask는 참조 범위 제한, PV는 Value 가중합을 담당합니다. 토큰 3에서 토큰 1과 2까지의 위치 차이는 각각 두 칸과 한 칸입니다.

Q와 K의 내적은 두 벡터의 같은 성분끼리 곱한 뒤 더하는 계산입니다. 이 내적 계산 자체에는 두 토큰이 몇 번째 위치에 있는지, 서로 몇 칸 떨어져 있는지를 직접 넣는 항이 없습니다. 같은 Q와 K를 그대로 사용하면 어느 위치에 놓더라도 내적은 같습니다.

Causal mask는 순서에 따라 참조 범위를 정합니다. 그림 1에서 토큰 3은 토큰 1과 2를 모두 참조할 수 있지만, 토큰 1은 두 칸 전이고 토큰 2는 한 칸 전입니다. 마스크는 두 위치를 모두 허용하며, 위치 차이를 점수에 직접 반영하는 연산은 아닙니다. RoPE는 이 위치 차이를 Q와 K의 비교에 반영하는 방법입니다.

RoPE는 Q와 K에 적용합니다

RoPE는 projection으로 만든 Q와 K가 곱해지기 전에 적용합니다. 지난 글처럼 토큰 수 T = 3, 모델 차원 d = 8, head 수 h = 2인 MHA 구성을 사용하겠습니다. Head 하나의 차원 dh는 4이고, 각 head의 Q·K·V는 3 × 4 형태입니다. 그림 2에서는 Head 1을 확대했습니다.

Head 1의 Q와 K에 토큰 위치 0, 1, 2에 따른 RoPE를 적용합니다. Q와 K는 3 × 4 형태를 유지하고, V는 그대로 Core Attention에 전달됩니다. 이후 각 head의 결과를 이어 붙여 출력 projection으로 전달합니다.

세 토큰의 위치를 0부터 세어 토큰 1은 위치 0, 토큰 2는 위치 1, 토큰 3은 위치 2로 두겠습니다. 각 토큰의 Q와 K를 자신의 위치에 따라 변환한 결과를 Q′와 K′라고 하겠습니다. RoPE를 거쳐도 벡터의 차원은 dh로 유지되며, V에는 RoPE를 적용하지 않습니다. 이후 Core Attention은 Q′와 K′로 점수를 계산하고, 그 점수에서 얻은 가중치로 V를 모읍니다.

RoPE 자체는 다른 토큰의 벡터를 가져오지 않습니다. 각 토큰의 Q 또는 K와 해당 위치만으로 계산하며, 다른 head에도 같은 방식으로 적용됩니다. 위치에 따른 변환은 토큰별로 독립적으로 수행하고, 변환한 벡터들의 비교는 Q′K′ᵀ에서 수행합니다.

두 성분을 묶어 회전하기

벡터를 회전한다는 것은 무엇일까요? RoPE에서는 head 하나의 벡터를 두 성분씩 묶고, 각 쌍을 평면 위 벡터의 좌표로 봅니다. dh = 4인 예시에서는 네 성분을 두 쌍으로 나눌 수 있습니다. 그림 3에서는 그중 한 쌍 [a, b] = [1, 1]을 확대했습니다.

두 성분 [1, 1]을 평면 위 벡터로 보고 30도 회전합니다. 회전 후 성분은 약 [0.366, 1.366]이며, 벡터의 길이는 유지됩니다. 두 출력 성분을 cos와 sin으로 계산하는 식을 함께 표시합니다.

이 벡터를 30° 회전하면 두 성분은 약 [0.366, 1.366]으로 바뀝니다. 회전은 두 성분의 값을 바꾸지만 벡터의 길이는 유지합니다. 계산할 때는 회전각의 cos와 sin을 원래 두 성분에 곱해 조합합니다. 그림 3의 식처럼 첫 출력은 a cos α − b sin α, 두 번째 출력은 a sin α + b cos α입니다. 그림의 30°는 변화를 쉽게 볼 수 있도록 정한 설명용 각도입니다.

토큰 위치와 성분 쌍에 따라 회전각 정하기

RoPE의 회전각은 토큰 위치와 성분 쌍별 회전 속도로 정합니다. 같은 성분 쌍은 위치가 한 칸 이동할 때마다 정해진 각도만큼 더 회전합니다. 하나의 벡터 안에서도 성분 쌍마다 회전 속도가 다릅니다. 그림 4에서는 이를 구분해 보기 위해 첫 번째 쌍은 한 칸당 30°, 두 번째 쌍은 한 칸당 10°로 두었습니다.

같은 입력 [1, 1, 1, −1]을 위치 0, 1, 2에서 회전합니다. 첫 번째 성분 쌍은 0도, 30도, 60도로 회전하고 두 번째 쌍은 0도, 10도, 20도로 회전합니다. 두 쌍을 합친 결과는 네 성분을 유지합니다.

토큰 1의 위치는 0이므로 두 쌍 모두 회전각이 0°입니다. 토큰 2는 위치 1이므로 각각 30°와 10°, 토큰 3은 위치 2이므로 각각 60°와 20°를 적용합니다. 그림의 파란색과 초록색은 서로 다른 head가 아니라 같은 head 안의 두 성분 쌍을 구분합니다. 이 그림은 같은 입력에서 위치에 따른 변화만 비교한 예시입니다.

실제 기본 RoPE에서는 성분 쌍별 회전 속도를 다음 식으로 정합니다. dh는 회전할 head 벡터의 차원이고, 성분 쌍 번호 i는 0부터 dh/2 − 1까지입니다. B는 회전 속도의 분포를 정하는 기준값이며, RoPE 원 논문에서는 10,000을 사용합니다.

θi=B2idh

θᵢ는 위치가 한 칸 증가할 때 성분 쌍 i에 더 적용하는 회전각이며, 단위는 라디안입니다. 예를 들어 dh = 4, B = 10,000이면 첫 번째 쌍의 θ₀는 1, 두 번째 쌍의 θ₁은 0.01입니다. 그림의 30°·10°는 이 설정을 그대로 사용한 값이 아닌 설명용 값입니다. 위치가 p인 토큰에 적용할 회전각은 다음과 같습니다.

αp,i=pθi

Q 또는 K의 성분 쌍 i를 [a, b]라고 하면, 이 회전각을 그림 3의 회전식에 넣습니다. 이를 행렬 곱으로 쓰면 다음과 같습니다. 토큰 위치 p는 얼마나 회전할지 정하고, 성분 쌍 번호 i는 어떤 회전 속도를 사용할지 정합니다.

[a′b′]=[cos(pθi)sin(pθi)sin(pθi)cos(pθi)][ab]

절대 위치로 회전하고, 상대 위치로 비교하기

각 벡터는 자신의 위치로 회전했는데, 어떻게 두 토큰의 위치 차이가 반영될까요? 그림 5에서는 회전 전 Q와 K가 같은 두 경우를 비교하겠습니다. 한 성분 쌍에 대해 Q는 [1, 0], K는 [1, 1]이고, 회전 속도는 한 칸당 30°입니다. 여기서는 마스크를 적용하기 전, 위치에 따른 회전과 내적만 살펴봅니다.

왼쪽은 Q 위치 0과 K 위치 1, 오른쪽은 Q 위치 1과 K 위치 2입니다. 두 경우 모두 K 위치에서 Q 위치를 뺀 값이 1입니다. Q와 K를 함께 30도 더 회전해도 사이각 75도와 내적 약 0.366이 유지됩니다.

왼쪽은 Q의 위치가 0, K의 위치가 1이므로 각각 0°와 30°를 적용합니다. 오른쪽은 Q의 위치가 1, K의 위치가 2이므로 각각 30°와 60°를 적용합니다. 오른쪽은 왼쪽의 두 벡터를 함께 30° 더 회전한 결과입니다. 두 벡터를 같은 각도만큼 회전하면 각각의 방향은 달라져도 서로 이루는 각도는 유지됩니다. 길이도 유지되므로 내적은 두 경우 모두 약 0.366입니다.

두 경우의 토큰 위치 차이는 모두 한 칸입니다. 왼쪽은 K 위치 − Q 위치 = 1 − 0 = 1, 오른쪽은 2 − 1 = 1입니다. 성분 쌍 i에서 두 벡터에 적용한 회전각의 차이도 (K 위치 − Q 위치) × θᵢ로 같습니다. RoPE는 각 벡터를 절대 위치에 따라 회전하지만, 내적에서 위치에 따른 영향은 이 상대 위치로 나타납니다. 각 성분 쌍의 내적을 더한 전체 Q·K의 내적에도 같은 원리가 적용됩니다.

위치가 반영되면 Attention 점수도 달라집니다

이제 지난 글에서 사용한 Q와 K로 돌아가겠습니다. 그림 6은 같은 Q와 K에서 RoPE 적용 전후의 점수를 비교합니다. 각 토큰의 위치는 0·1·2이며, 그림 4와 같은 설명용 회전 속도 30°·10°를 사용합니다. 두 점수 행렬 모두 내적을 √dh = 2로 나눈 값입니다.

이전 글과 같은 Q와 K를 사용해 RoPE 적용 전후의 점수를 비교합니다. 토큰 3의 점수 행은 [1, 0, 3]에서 약 [0.866, −0.430, 3]으로 달라집니다. 이 점수에 Causal mask와 Softmax를 적용한 뒤 V를 가중합합니다.

토큰 3의 행을 보면 점수는 [1, 0, 3]에서 약 [0.866, −0.430, 3]으로 달라집니다. 앞의 두 값은 토큰 1·2와의 점수이고, 마지막 값은 자기 자신과의 점수입니다. 같은 위치의 Q와 K에는 동일한 회전이 적용되므로 자기 자신과의 점수는 유지됩니다. 다른 위치의 Q와 K에는 서로 다른 각도가 적용되어 이 예시의 점수가 바뀝니다.

이후의 계산은 지난 글과 같습니다. Causal mask로 참조 범위를 제한하고, Softmax로 가중치를 계산한 뒤 V를 가중합합니다. V의 값은 그대로지만, Q와 K에 위치를 반영해 계산한 점수가 Value를 모으는 비중을 결정합니다.

RoPE는 각 토큰의 Q와 K를 두 성분씩 묶어 위치에 따라 회전합니다. 입출력 차원은 유지되고, 회전 자체는 토큰마다 독립적으로 계산합니다. 이렇게 변환한 Q와 K를 비교하면 벡터의 내용과 두 토큰의 상대 위치가 함께 Attention 점수에 반영됩니다.