# Positional Encoding (sin)
## 수식
$
PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)
$
## 표기법
| 기호 | 의미 |
|------|------|
| $PE_{(pos, 2i)}$ | 짝수 차원 위치 인코딩 값 |
| $pos$ | 토큰의 위치 인덱스 |
| $i$ | 임베딩 차원 인덱스 |
| $d_{model}$ | 모델 임베딩 전체 차원 |
| $\sin(\cdot)$ | 주기적 위치 정보를 부여하는 사인 함수 |
| $10000^{2i/d_{model}}$ | 차원별 주파수를 조절하는 스케일 항 |
| $2i$ | 짝수 차원 위치 |
| $PE$ | 최종 positional encoding 행렬 |
## 직관적 설명
$W^O$: 최종 출력 변환 행렬
Positional Encoding
위치 정보를 인코딩으로 주입해 순서 정보 보존 (RNN의 순차 처리 대체):
$d_{\text{model}}$: 모델의 전체 임베딩 차원
$i$: 임베딩 차원의 인덱스
$pos$: 시퀀스 위치 (0, 1, 2, ...)
## 구체적 예시
$d_{model}=8$, $pos=3$, $i=0$이면 분모는 $10000^0=1$이다.
따라서 $PE_{(3,0)}=\sin(3)$가 된다.
$i$가 커질수록 분모가 커져 주파수가 낮아지고, 더 완만한 위치 변화를 표현한다.
이 덕분에 서로 다른 차원이 서로 다른 위치 해상도를 담당한다.
## 응용 & 실제 구현
입력 임베딩에 positional encoding을 더해 순서 정보를 주입한다.
학습형 positional embedding 대신 고정형 sinusoidal encoding은 extrapolation에 유리한 경우가 있다.
구현은 보통 사전에 길이 `max_len`만큼 행렬을 계산해 버퍼로 저장한다.
긴 문서 처리에서는 rotary embedding이나 ALiBi와 비교 대상으로 자주 등장한다.
## 관련 개념
- [[ai/algorithms/transformer/concepts/transformer]]
## 참고 자료
Vaswani et al., *Attention Is All You Need* (2017).
[[ai/algorithms/transformer/concepts/transformer]]