포지셔널 인코딩 및 컨텍스트 윈도우 엔지니어링: 토큰 순서가 중요한 이유
Source: Dev.to
약어 및 기술 용어 참고
약어
- AI – 인공지능 (Artificial Intelligence)
- ALiBi – 선형 바이어스를 이용한 어텐션 (Attention with Linear Biases)
- API – 응용 프로그래밍 인터페이스 (Application Programming Interface)
- BERT – 양방향 인코더 표현 변환기 (Bidirectional Encoder Representations from Transformers)
- GPU – 그래픽 처리 장치 (Graphics Processing Unit)
- GPT – 사전 학습 생성 변환기 (Generative Pre‑trained Transformer)
- LLM – 대형 언어 모델 (Large Language Model)
- QKV – 쿼리, 키, 값 (Query, Key, Value)
- RAM – 임의 접근 메모리 (Random Access Memory)
- RoPE – 회전 위치 임베딩 (Rotary Positional Embeddings)
- ROI – 투자 대비 수익 (Return on Investment)
기술 용어
- Context Window – 모델이 한 번의 요청에서 처리할 수 있는 최대 토큰 수.
- Positional Encoding – 토큰이 어느 위치에 있는지를 모델에 알려주는 방법.
- Sinusoidal – 사인·코사인 파형 함수를 이용한 인코딩.
- Extrapolation – 학습 시 길이보다 긴 시퀀스를 처리할 수 있는 능력.
- Sparse Attention – 모든 토큰이 아니라 일부 토큰에만 어텐션을 적용하는 방식.
왜 위치 정보가 중요한가
Transformer 어텐션은 순열 불변이다: 모든 토큰이 동시에 다른 모든 토큰에 어텐션을 주지만, 원시 어텐션 메커니즘에는 순서를 나타내는 요소가 없다. 명시적인 위치 정보가 없으면 같은 토큰 집합을 가진 문장은 구분이 불가능해진다:
- “The cat chased the dog”
- “The dog chased the cat”
- “Dog the cat chased the”
- “Chased cat dog the the”
모두 동일한 토큰 집합을 가지고 있어 어텐션 점수도 동일하지만 의미는 크게 다르다. 위치 인코딩은 토큰이 위치 1, 위치 2, …, 위치 N에 놓였는지를 Transformer가 알 수 있게 해준다.
데이터 엔지니어에게 실질적인 영향
- Context‑window 제한은 위치 정보가 어떻게 표현되는가에 따라 달라진다.
- 서로 다른 인코딩 전략은 모델이 긴 시퀀스를 처리하는 능력에 영향을 미친다.
- 최신 기법은 100 K, 200 K, 혹은 1 M 토큰 규모의 컨텍스트 윈도우를 지원한다.
- 정확도와 효율성 사이의 엔지니어링 트레이드‑오프가 대규모 환경에서 핵심이 된다(예: 문서 Q&A 시스템이 긴 PDF에서 실패하는 이유, 요약이 중간에 끊기는 이유 등).
실생활 비유
1. 뒤섞인 사진 앨범
날짜나 타임스탬프가 없는 휴가 사진 모음은 여행 이야기를 전달하지 못한다. 마찬가지로 Transformer는 모든 토큰을 보지만 위치 단서가 없으면 서사 흐름을 유추할 수 없다.
2. 순서가 뒤바뀐 미스터리 소설 페이지
페이지 번호가 없고 뒤섞인 미스터리 소설은 모든 단서는 있지만 순서 없이는 줄거리를 이해할 수 없다. Transformer도 순서가 없는 토큰에 대해 같은 문제를 겪는다.
3. 라벨 없는 조립 라인
부품 번호나 조립 순서가 없는 자동차 공장은 차량을 만들 수 없다. 순서는 제조와 언어 모두에서 중요하다.
이 비유들은 언어는 본질적으로 순차적이라는 점을 보여준다; 단어 순서를 바꾸면 의미가 바뀐다:
- “The lawyer questioned the witness” ≠ “The witness questioned the lawyer”
- “I didn’t say she stole the money” ≠ “She didn’t say I stole the money”
- “Time flies like an arrow” ≠ “Arrow flies like a time”
위치 인코딩 전략
Sinusoidal Positional Encodings
원 논문 Attention Is All You Need에서는 고정된 사인·코사인 인코딩을 소개했다:
[ \text{PE}(pos, 2i) = \sin!\left(\frac{pos}{10000^{2i/d}}\right) \ \text{PE}(pos, 2i+1) = \cos!\left(\frac{pos}{10000^{2i/d}}\right) ]
- pos – 토큰 위치 (0, 1, 2, …)
- i – 차원 인덱스 (0 … d/2 − 1)
- d – 임베딩 차원 (예: 512)
왜 사인·코사인인가?
- 부드러움 – 인접한 위치는 유사한 인코딩을 가진다.
- 범위 제한 – 값이 ([-1, 1]) 안에 머물러 안정성을 돕는다.
- 고유성 – 각 위치마다 독특한 패턴을 만든다.
- Extrapolation – 함수 형태가 학습 중 보지 못한 위치에도 일반화될 수 있다.
코드 시각화 (Python)
import numpy as np
import matplotlib.pyplot as plt
def sinusoidal_encoding(position: int, d_model: int = 128) -> np.ndarray:
"""Generate sinusoidal positional encoding for a single position."""
encoding = np.zeros(d_model)
for i in range(d_model // 2):
denominator = 10000 ** (2 * i / d_model)
encoding[2 * i] = np.sin(position / denominator)
encoding[2 * i + 1] = np.cos(position / denominator)
return encoding
# Generate encodings for positions 0‑99
positions = range(100)
encodings = np.stack([sinusoidal_encoding(p) for p in positions])
# Visualize
plt.figure(figsize=(12, 6))
plt.imshow(encodings.T, aspect='auto', cmap='RdBu')
plt.xlabel('Position')
plt.ylabel('Encoding Dimension')
plt.title('Sinusoidal Positional Encodings')
plt.colorbar(label='Encoding Value')
plt.show()
히트맵은 각 위치가 사인·코사인 값의 고유 “지문”을 받는 방식을 보여준다.
적용 방법
token_embedding = embed("cat") # e.g., [0.23, -0.45, 0.67, ...]
positional_encoding = sinusoidal_encoding(5, d_model=token_embedding.shape[0])
# Combine token and position information
input_to_transformer = token_embedding + positional_encoding
덧셈을 통해 무엇(토큰)과 어디에(위치) 정보를 동시에 모델에 전달한다.
Learned Positional Embeddings
고정 함수 대신 위치를 학습 가능한 벡터 테이블에 저장할 수 있다:
import torch.nn as nn
position_embeddings = nn.Embedding(num_embeddings=512, embedding_dim=768)
# Example lookup
pos_vec = position_embeddings(torch.tensor([5])) # shape: (1, 768)
학습 과정에서 모델은 이러한 벡터를 downstream 작업에 가장 적합하도록 조정한다.
비유
- Sinusoidal – 공식에 따라 좌석이 배정되는 것 (예: 1열 = VIP).
- Learned – 실제 선호도에 따라 좌석이 배치되는 것 (예: A7 좌석이 커플에게 인기).
컨텍스트 윈도우 확장
- Sparse Attention – 토큰의 일부만 어텐션을 적용해 2차 비용을 감소시킨다.
- Sliding / Chunked Windows – 겹치는 청크로 긴 시퀀스를 순차적으로 처리한다.
- Modern Techniques – ALiBi, RoPE 등 상대 위치 방법을 활용하면 100 K + 토큰 규모의 컨텍스트 윈도우를 계산량을 크게 늘리지 않고도 구현할 수 있다.
이 기본 개념들을 이해하면 엔지니어는 언제 한계에 부딪히는지와 언제 지능적으로 우회할지를 판단할 수 있다.