위치 인코딩 — Sinusoidal, RoPE, ALiBi

어텐션(Attention)은 순열 불변(permutation-invariant)입니다. 위치 신호(positional signal)가 없으면 "The cat sat on the mat"과 "mat the on sat cat the"가 같은 출력을 만듭니다. 세 알고리즘(algorithm)이 이를 고칩니다. 다만 각각 "위치(position)"가 무엇인지에 대해 다른 가정을 둡니다.

유형: Build 언어: Python 선수 지식: Phase 7 · 02 (Self-Attention), Phase 7 · 03 (Multi-Head Attention) 예상 시간: 약 45분

문제

스케일드 점곱 어텐션(scaled dot-product attention)은 순서를 모릅니다. 어텐션 행렬(attention matrix) softmax(Q K^T / √d) V는 쌍별 유사도(pairwise similarity)로 계산됩니다. X의 행(row) 순서를 섞으면 출력 행도 같은 방식으로 섞입니다. 어텐션 내부에는 위치를 신경 쓰는 부분이 없습니다.

단어 주머니 모델(bag-of-words model)에서는 이것이 버그(bug)가 아닐 수 있습니다. 하지만 언어(language), 코드(code), 오디오(audio), 비디오(video)처럼 순서가 의미를 담는 모든 영역에서는 치명적입니다.

해결책은 위치를 임베딩(embedding)에 어떤 방식으로든 주입하는 것입니다. 세 시대의 답이 있습니다.

  1. 절대 사인파(Absolute sinusoidal) (Vaswani 2017). 위치의 sin/cos를 임베딩에 더합니다. 단순하고 학습 가능한 파라미터(learnable parameter)가 없지만, 훈련 길이(training length) 밖으로는 잘 외삽(extrapolate)하지 못합니다.
  2. RoPE, 회전 위치 임베딩(Rotary Position Embeddings) (Su 2021). Q와 K 벡터(vector)를 위치에 비례하는 각도(angle)로 회전합니다. 내적(dot product) 안에 상대 위치(relative position)를 직접 인코딩(encode)합니다. 2026년 기준 지배적 선택(dominant choice)입니다.
  3. ALiBi, 선형 편향 어텐션(Attention with Linear Biases) (Press 2022). 임베딩 기법(embedding trick)을 건너뛰고 거리(distance)에 따른 헤드별 선형 페널티(per-head linear penalty)를 어텐션 점수(attention score)에 더합니다. 길이 외삽(length extrapolation)이 매우 좋습니다.

2026년 기준 거의 모든 프런티어 오픈 모델(frontier open model)은 RoPE를 사용합니다. Llama 2/3/4, Qwen 2/3, Mistral, Mixtral, DeepSeek-V3, Kimi가 그렇습니다. 일부 긴 문맥 모델(long-context model)은 ALiBi나 현대적 변형(modern variant)을 사용합니다. 절대 사인파는 역사적 기준점에 가깝습니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.셀프 어텐션(self-attention)에 위치 신호(positional signal)가 필요한 이유는 무엇인가요?

2.절대 위치 인코딩(absolute positional encoding)과 상대 위치 인코딩(relative positional encoding)의 핵심 차이는 무엇인가요?

0/2 답변 완료

개념

three ways to tell attention about position sinusoidal (2017) add sin/cos to the embedding dim 0: fast sine dim 64: slow sine X' = X + PE does not extrapolate beyond trained positions history only RoPE (2021) — dominant 2026 rotate Q,K by position angle q_m rotated by m·θ k_n rotated by n·θ <q'_m, k'_n> = f(m − n) relative distance, for free base knob extends context Llama, Qwen, Mistral, DeepSeek, Kimi ALiBi (2022) linear bias in attention scores score -= m · |i − j| darker = smaller penalty extrapolates cleanly BLOOM, MPT, long-context ablations attention is permutation-invariant; pick the injection that matches your context length strategy

절대 사인파(Absolute Sinusoidal)

형태(shape)가 (max_len, d_model)인 고정 행렬(fixed matrix) PE를 미리 계산합니다.

PE[pos, 2i]   = sin(pos / 10000^(2i / d_model))
PE[pos, 2i+1] = cos(pos / 10000^(2i / d_model))

그다음 어텐션 전에 X' = X + PE[:N]을 사용합니다. 각 차원(dimension)은 서로 다른 주파수(frequency)의 사인파(sinusoid)입니다. 모델(model)은 위상 패턴(phase pattern)에서 위치를 읽는 법을 학습합니다. 다만 max_len 밖에서는 약합니다. 0-2047 위치만 본 모델에게 위치 2048에서 무엇이 일어나는지 알려 준 적이 없기 때문입니다.

RoPE

임베딩이 아니라 Q와 K 벡터를 회전합니다. 차원 쌍(dimension pair) (2i, 2i+1)에 대해 다음을 적용합니다.

[q'_2i    ]   [ cos(pos·θ_i)  -sin(pos·θ_i) ] [q_2i   ]
[q'_2i+1  ] = [ sin(pos·θ_i)   cos(pos·θ_i) ] [q_2i+1 ]

θ_i = base^(-2i / d_head),  base = 10000 by default

키에도 위치 pos_k로 같은 회전(rotation)을 적용합니다. 그러면 내적 q'_m · k'_n(m - n)만의 함수가 됩니다. 즉 절대 위치(absolute position)를 사용해 회전했는데 어텐션 점수는 상대 거리(relative distance)에만 의존합니다. 아름다운 기법(trick)입니다.

RoPE 확장(extension)에서는 base를 스케일링(scaling)할 수 있습니다. NTK-aware, YaRN, LongRoPE 같은 방식은 재훈련(retraining) 없이 긴 문맥으로 외삽하는 데 사용됩니다. Llama 3는 이런 방식으로 8K에서 128K 문맥까지 확장했습니다.

ALiBi

임베딩 기법을 건너뛰고 어텐션 점수에 직접 편향(bias)을 더합니다.

attn_score[i, j] = (q_i · k_j) / √d  -  m_h · |i - j|

여기서 m_h는 헤드별 기울기(head-specific slope)입니다. 예를 들어 1 / 2^(8·h/H) 같은 형태입니다. 가까운 토큰은 덜 벌점(penalize)을 받고, 먼 토큰은 더 벌점을 받습니다. 훈련 시점 비용(training-time cost)이 없습니다. 논문에서는 길이 외삽이 사인파 방식보다 좋고, 원래 훈련 길이(original trained length)에서는 RoPE와 비슷하다는 결과를 보입니다.

2026년에 무엇을 고를까

변형(Variant)외삽(Extrapolation)훈련 비용(Training cost)사용 모델
절대 사인파(Absolute sinusoidal)나쁨무료original transformer, early BERT
학습형 절대(Learned absolute)없음매우 적음GPT-2, GPT-3
RoPE스케일링과 함께 좋음무료Llama 2/3/4, Qwen 2/3, Mistral, DeepSeek-V3, Kimi
RoPE + YaRN매우 좋음파인튜닝 단계Qwen2-1M, Llama 3.1 128K
ALiBi매우 좋음무료BLOOM, MPT, Baichuan

RoPE가 이긴 이유는 아키텍처(architecture)를 바꾸지 않고 어텐션 안에 들어가며, 상대 위치를 인코딩하고, base 하이퍼파라미터(hyperparameter)가 긴 문맥 파인튜닝(long-context fine-tuning)의 명확한 손잡이(knob)가 되기 때문입니다.

직접 만들기

Step 1: 사인파 인코딩(Sinusoidal Encoding)

code/main.py를 봅니다. 네 줄짜리 계산입니다.

def sinusoidal(N, d):
    pe = [[0.0] * d for _ in range(N)]
    for pos in range(N):
        for i in range(d // 2):
            theta = pos / (10000 ** (2 * i / d))
            pe[pos][2 * i]     = math.sin(theta)
            pe[pos][2 * i + 1] = math.cos(theta)
    return pe

이 행렬을 첫 어텐션 계층(attention layer) 전에 임베딩 행렬(embedding matrix)에 더합니다.

Step 2: Q, K에 RoPE 적용

RoPE는 Q와 K에 제자리(in-place)로 적용됩니다. 각 차원 쌍에 대해 다음을 수행합니다.

def apply_rope(x, pos, base=10000):
    d = len(x)
    out = list(x)
    for i in range(d // 2):
        theta = pos / (base ** (2 * i / d))
        c, s = math.cos(theta), math.sin(theta)
        a, b = x[2 * i], x[2 * i + 1]
        out[2 * i]     = a * c - b * s
        out[2 * i + 1] = a * s + b * c
    return out

중요한 점은 Q에는 위치 m, K에는 위치 n으로 같은 함수를 적용한다는 것입니다. 두 벡터의 내적은 각 좌표 쌍(coordinate pair)에서 cos((m-n)·θ_i) 계수(factor)를 얻게 됩니다. 어텐션은 상대 위치를 공짜로 학습합니다.

Step 3: ALiBi 기울기(slope)와 편향(bias)

def alibi_bias(n_heads, seq_len):
    # h = 1..n_heads에 대해 slope_h = 2 ** (-8 * h / n_heads)
    slopes = [2 ** (-8 * (h + 1) / n_heads) for h in range(n_heads)]
    bias = []
    for m in slopes:
        row = [[-m * abs(i - j) for j in range(seq_len)] for i in range(seq_len)]
        bias.append(row)
    return bias  # softmax 전에 attention score에 더함

bias[h]를 헤드 h(seq_len, seq_len) 어텐션 점수 행렬에 더한 뒤 소프트맥스(softmax)를 적용합니다.

Step 4: RoPE의 상대 거리 속성(relative-distance property) 검증

두 무작위 벡터(random vector) a, b를 고릅니다. (pos_a, pos_b)로 회전하고, 다시 (pos_a + k, pos_b + k)로 회전합니다. 두 내적은 부동소수점 오차(floating-point error) 범위 안에서 같아야 합니다. 이것이 RoPE의 핵심입니다. 절대 오프셋(absolute offset)에는 불변(invariant)이고 상대 간격(relative gap)만 중요합니다.

사용해보기

PyTorch 2.5+에는 torch.nn.functional에 RoPE 유틸리티(utility)가 들어 있습니다. 프로덕션 코드(production code)는 보통 flash_attn이나 xformers를 사용하고, RoPE는 어텐션 커널(attention kernel) 안에서 적용합니다.

from transformers import AutoModel
model = AutoModel.from_pretrained("meta-llama/Llama-3.2-3B")
# model.config.rope_scaling -> {"type": "yarn", "factor": 32.0, "original_max_position_embeddings": 8192}

2026년 긴 문맥 기법(long-context trick):

  • NTK-aware 보간(interpolation). 4K에서 16K+로 늘릴 때 basebase * (scale_factor)^(d/(d-2))로 재스케일링(rescale)합니다.
  • YaRN. 긴 문맥에서 어텐션 엔트로피(attention entropy)를 보존하는 더 정교한 보간입니다. Llama 3.1 128K가 사용합니다.
  • LongRoPE. 차원별 스케일 계수(scale factor)를 진화적 탐색(evolutionary search)으로 고르는 Microsoft의 2024년 방법입니다. Phi-3-Long이 사용합니다.
  • 위치 보간 + 파인튜닝(Position interpolation + fine-tuning). 위치를 확장 계수(extension factor)만큼 줄이고 1-5B 토큰으로 파인튜닝합니다. 생각보다 효과적입니다.

산출물 만들기

outputs/skill-positional-encoding-picker.md를 봅니다. 이 스킬(skill)은 목표 문맥 길이(target context length), 외삽 필요성(extrapolation need), 훈련 예산(training budget)이 주어졌을 때 새 모델의 위치 인코딩 전략(positional encoding strategy)을 고릅니다.

연습문제

  1. 쉬움. max_len=512, d=128에서 사인파 PE 행렬을 히트맵(heatmap)으로 그립니다(plot). "차원 인덱스(dimension index)가 커질수록 줄무늬(stripe)가 넓어지는" 패턴(pattern)을 확인합니다.
  2. 중간. NTK-aware RoPE 스케일링을 구현합니다. 길이 256 시퀀스에서 작은 언어 모델(tiny LM)을 학습한 뒤, 스케일링을 적용한 경우와 적용하지 않은 경우를 길이 1024에서 테스트(test)합니다. 퍼플렉서티(perplexity)를 측정합니다.
  3. 어려움. 같은 어텐션 모듈(attention module) 안에 ALiBi와 RoPE를 모두 구현합니다. 길이 512 복사 과제(copy task)로 4계층 트랜스포머(4-layer transformer)를 학습하고, 테스트 시점(test time)에는 2048로 외삽합니다. 성능 저하를 비교합니다.

핵심 용어

용어흔한 설명실제 의미
위치 인코딩(Positional encoding)"어텐션에 순서를 알려준다"임베딩이나 어텐션에 추가되어 위치를 인코딩하는 모든 신호(signal)이다.
사인파(Sinusoidal)"원래 방식"기하학적 주파수(geometric frequency)의 sin/cos를 임베딩에 더하는 방식이다. 잘 외삽하지 못한다.
RoPE"회전 임베딩(Rotary embedding)"Q, K를 위치 의존 각도(position-dependent angle)로 회전한다. 내적이 상대 거리를 인코딩한다.
ALiBi"선형 편향 기법(Linear bias trick)"어텐션 점수에 `-m·
base"RoPE 손잡이(knob)"RoPE의 주파수 스케일러(frequency scaler)다. 추론 문맥(inference context)을 늘릴 때 키운다.
NTK-aware"RoPE 스케일링 기법"문맥이 늘어날 때 고주파 차원(high-frequency dimension)이 눌리지 않도록 base를 재스케일링하는 방법이다.
YaRN"더 정교한 방식"어텐션 엔트로피를 보존하는 차원별 보간+외삽 방식이다.
외삽(Extrapolation)"학습 길이 밖에서도 동작함"위치 방식(position scheme)이 훈련에서 본 max_len을 넘어 올바른 출력을 낼 수 있는지다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

positional-encoding-picker

Pick positional encoding (RoPE, ALiBi, sinusoidal) + scaling strategy given context length and training budget.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.RoPE는 Q와 K 벡터를 위치 의존 각도(position-dependent angle)로 회전하는데, 어텐션 점수는 결국 상대 거리(m-n)에만 의존합니다. 왜 이런 현상이 생기나요?

2.max_len=4096으로 RoPE를 사용해 학습한 모델을 32K 문맥(context)에서 서비스해야 합니다. 전체 재훈련(full retraining) 없이 확장할 수 있는 방법은 무엇인가요?

3.ALiBi는 임베딩을 수정하는 대신 어텐션 점수에 헤드별 선형 페널티(per-head linear penalty) -m_h * |i-j|를 더합니다. 길이 외삽(length extrapolation)에서 이 설계의 주요 장점은 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다