C.W.K.
Stream
Lesson 05 of 12 · published

Sinusoidal positional encoding (원조 논문)

~14 min · sinusoidal, positional

Level 0Token
0 XP0/94 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

2017년 Transformer 논문은 다른 주파수의 sine/cosine 고정 조합으로 위치를 인코딩하자고 제안했어:

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

각 위치가 길이 d_model인 unique 벡터 받아. 차원마다 다른 속도로 진동 — 차원 0은 빠르게 한 바퀴 돌고(고주파), 차원 d_model−1은 매우 천천히 진동. 합쳐서 위치마다 unique 지문 형성.

설계가 영리한 이유

  • 위치별 unique. 학습 범위 안에서 두 위치가 같은 인코딩을 공유하지 않아.
  • 선형 변환이 상대 위치를 잡아. PE(pos + k) = M_k @ PE(pos), 여기서 M_k는 k에만 의존. 모델이 원리상 상대 위치 attention을 인코딩에 대한 선형 연산으로 학습할 수 있어.
  • 파라미터 0. 인코딩이 공식으로 완전 결정 — 학습 불필요.
  • 외삽 잠재력. 공식이 모든 정수 위치에 정의돼 있어서, 학습보다 긴 시퀀스도 적어도 문법적으론 유효(실제론 품질 저하 잦지만).

sinusoidal 인코딩은 모던 decoder-only LLM에서 RoPE에 대체로 밀렸지만, 가장 깔끔한 멘탈 모델은 여전히 이거야. sinusoidal을 먼저 이해하면 RoPE는 "같은 아이디어인데 입력에서 더하는 게 아니라 attention 안에서 회전으로 적용"일 뿐이야.

Code

Sinusoidal PE in NumPy·python
import numpy as np

def sinusoidal_positional_encoding(max_len, d_model):
    pe = np.zeros((max_len, d_model))
    position = np.arange(max_len)[:, None]                # (L, 1)
    div_term = np.exp(np.arange(0, d_model, 2) *
                      -(np.log(10000.0) / d_model))        # (d/2,)
    pe[:, 0::2] = np.sin(position * div_term)
    pe[:, 1::2] = np.cos(position * div_term)
    return pe

PE = sinusoidal_positional_encoding(512, 64)
# Add to input embeddings (broadcasting):
# x = token_embeddings + PE[:seq_len]

External links

Exercise

sinusoidal_positional_encoding 구현하고, matplotlib imshow로 (512 × 64) 행렬 시각화. 그림 저장. 그 다음 PE[i] · PE[j] dot product를 (i, j) 쌍의 히트맵으로 플롯. 합리적인 '거리' 행렬처럼 보이나? 인코딩의 어떤 성질이 그렇게 만드나?

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.