1. 트랜스포머 위치 인코딩의 구조적 한계와 컨텍스트 확장 병목
대규모 언어 모델(LLM)이 수만 줄의 코드베이스, 수백 페이지의 기술 서적, 방대한 법률 문서를 한 번에 이해하기 위해서는 128K 이상의 초장문 컨텍스트 윈도우(Long Context Window)가 필수적입니다. 그러나 기존 트랜스포머의 절대 위치 인코딩(Absolute Positional Embedding)은 학습된 최대 시퀀스 길이를 초과하는 미지의 위치 인덱스에 대해 외삽(Extrapolation) 능력을 완전히 상실하여 퍼플렉서티(Perplexity)가 기하급수적으로 폭증하는 한계를 보였습니다.
이러한 한계를 극복하기 위해 제안된 핵심 위치 임베딩이 바로 RoPE(Rotary Position Embedding)이며, 추가 학습 비용을 최소화하며 문맥을 4배~16배 확장하는 YaRN(Yet another RoPE extensioN) 아키텍처가 결합되어 현대 LLM의 표준으로 자리 잡았습니다.
2. RoPE(Rotary Position Embedding)의 수학적 원리와 상대 위치 보존
<a href='https://arxiv.org/abs/2104.09864' target='_blank' rel='noopener'>RoFormer 공식 논문 (Su et al., 2021)에 따르면, RoPE는 쿼리(Query)와 키(Key) 벡터의 각 2차원 청크를 복소 평면(Complex Plane) 상의 벡터로 간주하고 위치 인덱스 m에 비례하는 각도 mθ만큼 2D 직교 회전 행렬을 곱하는 연산입니다.
- 상대적 거리 보존(Inner Product Invariance): 위치 m의 쿼리와 위치 n의 키 벡터 간 내적 연산을 수행하면 절대 위치 인덱스는 상쇄되고 상대적 거리 (m – n)에만 의존하는 주기 함수로 단순화됩니다. 이를 통해 모델은 시퀀스 내 토큰 간의 물리적 간격을 완벽하게 학습합니다.
- 장거리 감쇠 특성(Long-term Decay): 주파수 파라미터 θ_i가 차원별로 지수적으로 증가하므로, 토큰 간 거리가 멀어질수록 내적 기여도가 자연스럽게 감쇠하여 주의 집중(Attention)의 지역성(Locality)을 보장합니다.
3. 순수 선형 보간의 실패와 YaRN 주파수 도메인 스케일링
학습된 4K 모델의 문맥을 16K로 확장하기 위해 모든 주파수를 단순히 4배 나누는 위치 보간(Position Interpolation)을 적용하면, 고주파수(High-frequency) 차원의 파장 정보가 과도하게 뭉개져 단거리 토큰 간의 문법적·어휘적 식별력이 붕괴됩니다.
이를 해결하기 위해 <a href='https://arxiv.org/abs/2309.00071' target='_blank' rel='noopener'>YaRN 논문 (Peng et al., 2023)은 차원의 주파수 대역에 따라 차등 보간을 수행하는 주파수 분할 전략을 도입했습니다.
- 고주파 차원 (파장 < 원본 컨텍스트): 회전 주기가 원본 길이보다 충분히 작으므로 보간을 일절 수행하지 않고 원본 주파수를 100% 유지하여 국소 문법 정밀도 보존.
- 저주파 차원 (파장 > 확장 컨텍스트): 회전 주기가 전체 시퀀스를 아우르므로 스케일 팩터(s)만큼 완전 보간(Scale) 수행.
- 중간 주파수 램프(Ramp): 두 영역 사이의 경계 왜곡을 방지하기 위해 선형 가중치 램프 함수로 부드럽게 블렌딩.
- 엔트로피 보정(Attention Scaling): 컨텍스트가 길어짐에 따라 어텐션 로짓 분포의 엔트로피가 증가하여 모델이 둔감해지는 현상을 방어하기 위해 온도 팩터(Temperature Scale)를 로짓에 곱해 정밀도를 복원.
4. 프로덕션 YaRN 기반 RoPE 확장 모듈 파이썬 구현
다음은 <a href='https://huggingface.co/docs/transformers/main/en/model_doc/llama' target='_blank' rel='noopener'>Hugging Face Transformers RoPE 규격과 완벽히 호환되는 YaRN 주파수 분할 보간 및 복소 회전 적용 PyTorch 모듈 구현체입니다.
<code class='language-python'>import torch
import torch.nn as nn
import math
class YaRNScaledRotaryEmbedding(nn.Module):
def __init__(self, dim: int, max_position: int = 4096, original_max: int = 4096,
scale: float = 4.0, base: float = 10000.0, beta_fast: float = 32.0, beta_slow: float = 1.0):
super().__init__()
self.dim = dim
self.scale = scale
self.original_max = original_max
# 1. 차원별 기본 주파수(Theta) 계산: theta_i = base^(-2(i-1)/dim)
inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim))
# 2. YaRN 파장(Wavelength) 임계치 판별 및 주파수 램프(Ramp) 보간
wavelength = 2 * math.pi / inv_freq
low_idx = wavelength / original_max < beta_slow
high_idx = wavelength / original_max > beta_fast
# 저주파 영역: 선형 보간(scale), 고주파 영역: 비보간(1.0), 중간 영역: 선형 램프 블렌딩
yarn_freq = inv_freq / scale
ramp = (wavelength / original_max - beta_slow) / (beta_fast - beta_slow)
ramp = torch.clamp(ramp, 0.0, 1.0)
blended_freq = (1.0 - ramp) * inv_freq + ramp * yarn_freq
self.register_buffer('inv_freq', blended_freq)
self.temperature_scale = 0.1 * math.log(scale) + 1.0 # 엔트로피 보정 팩터
def forward(self, x: torch.Tensor, seq_len: int):
t = torch.arange(seq_len, device=x.device).type_as(self.inv_freq)
freqs = torch.einsum('i,j->ij', t, self.inv_freq)
emb = torch.cat((freqs, freqs), dim=-1)
# 3. 코사인 및 사인 임베딩 생성 (엔트로피 스케일링 적용)
cos = emb.cos() * self.temperature_scale
sin = emb.sin() * self.temperature_scale
return cos, sin
def rotate_half(x: torch.Tensor):
# [-x2, x1] 벡터 회전 변환
x1 = x[..., :x.shape[-1] // 2]
x2 = x[..., x.shape[-1] // 2:]
return torch.cat((-x2, x1), dim=-1)
def apply_rotary_pos_emb(q: torch.Tensor, k: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor):
# RoPE 복소 회전 적용: R(theta_m) * q
q_rot = (q * cos) + (rotate_half(q) * sin)
k_rot = (k * cos) + (rotate_half(k) * sin)
return q_rot, k_rot
5. 컨텍스트 확장 기법별 벤치마크 및 프로덕션 도입 가이드
Llama 아키텍처 기반 4K 사전 학습 모델을 32K 및 128K로 확장했을 때 각 보간 기법별 퍼플렉서티(PPL, 낮을수록 우수) 및 추가 파인튜닝 스텝 효율을 측정한 지표는 다음과 같습니다.
<table style='width: 100%; border-collapse: collapse; margin: 20px 0; font-size: 14px;'>
<tr style='background-color: #1e293b; color: #f8fafc; text-align: left;'><th style='padding: 12px; border: 1px solid #334155;'>컨텍스트 확장 기법<th style='padding: 12px; border: 1px solid #334155;'>32K 시퀀스 PPL
<th style='padding: 12px; border: 1px solid #334155;'>128K 시퀀스 PPL
<th style='padding: 12px; border: 1px solid #334155;'>필요 추가 파인튜닝 스텝
<tr style='border-bottom: 1px solid #334155;'><td style='padding: 12px; border: 1px solid #334155; color: #ef4444; font-weight: bold;'>> 1,000 (발산/붕괴)
<td style='padding: 12px; border: 1px solid #334155; color: #ef4444;'>측정 불가 (NaN)
<tr style='border-bottom: 1px solid #334155;'>
<td style='padding: 12px; border: 1px solid #334155;'>7.82
<td style='padding: 12px; border: 1px solid #334155;'>12.45 (성능 저하)
<tr style='background-color: #0f172a; border-bottom: 1px solid #334155; color: #38bdf8; font-weight: bold;'>
<td style='padding: 12px; border: 1px solid #334155; color: #10b981;'>4.12 (원본 수준 유지)
<td style='padding: 12px; border: 1px solid #334155; color: #10b981;'>4.86 (초장문 정밀 독해)
<td style='padding: 12px; border: 1px solid #334155; color: #10b981;'>200 스텝 내 수렴 (80% 절감)
프로덕션 LLM 서빙 파이프라인에 본 아키텍처를 적용할 때는 다음 사항을 반드시 설계에 반영해야 합니다.
- FlashAttention-2 커널과의 인라인 융합: 회전 행렬 곱셈 연산을 별도의 파이토치 커널로 실행하면 HBM 메모리 대역폭 병목이 발생하므로, FlashAttention의 온라인 어텐션 루프 내부에서 RoPE 회전을 인라인으로 융합(Fused Kernel)해야 추론 지연을 최소화할 수 있습니다.
- KV 캐시 VRAM 압박 대응: 시퀀스 길이가 128K에 도달하면 단일 요청의 KV 캐시 크기만 16GB를 상회하므로, vLLM의 PagedAttention 및 FP8 KV 캐시 양자화를 병행하여 VRAM 고갈(OOM)을 원천 방어해야 합니다.
- Needle In A Haystack (NIAH) 검색 평가: 단순히 전체 PPL 수치만 점검하지 말고, 128K 텍스트 깊숙한 위치에 임의의 사실을 삽입한 뒤 100% 회수할 수 있는지 문맥 심도별 검색 정확도(Retrieval Accuracy)를 전수 검증해야 합니다.