검색
← 모듈 로드맵

위치 인코딩: 사인파 · 학습형 · RoPE · ALiBi

강의 · 준전문가 · KAITABASE 정리

원제 · Positional Encoding (D2L 11.6 · RoFormer · ALiBi 참고)

사인파 · 학습형 · RoPE · ALiBi 위치 인코딩을 작은 숫자로 계산하며 비교하는 수업

먼저 알아야 할 것

어텐션 점수와 소프트맥스내적삼각함수와 회전트랜스포머 입력 임베딩

다루는 내용

어텐션이 순서를 모르는 이유와 위치 정보를 넣는 네 가지 방법을 다룹니다. 사인파 인코딩을 4차원으로 채워 보고, RoPE가 회전으로 점수를 위치 차이에만 의존하게 만드는 원리와 ALiBi의 거리 벌점을 숫자로 확인합니다. 길이 외삽 관점에서 방식들을 비교합니다.

해설

위치 인코딩: 사인파 · 학습형 · RoPE · ALiBi

어텐션은 순서를 모릅니다. 토큰 순서를 섞어도 점수 계산은 똑같습니다. 그래서 트랜스포머는 "이 토큰이 몇 번째인가"라는 정보를 따로 넣어 줘야 하고, 이것이 위치 인코딩(positional encoding) 입니다. 이 수업에서는 원조 트랜스포머의 사인파 인코딩, 학습형 위치 임베딩, LLaMA 계열 등 많은 공개 LLM이 쓰는 RoPE(회전 위치 임베딩), 그리고 ALiBi(선형 편향)를 작은 숫자로 직접 계산하며 비교합니다.

항목내용
참고 출처D2L 11.6절 셀프 어텐션과 위치 인코딩 · 트랜스포머 원 논문(arXiv 1706.03762) · RoFormer(arXiv 2104.09864) · ALiBi(arXiv 2108.12409)
트랙 · 수준NLP·트랜스포머 · 중급
이 수업이 다루는 범위순서 정보가 필요한 이유, 절대 위치 · 상대 위치, 사인파 인코딩, 학습형 임베딩, RoPE, ALiBi, 길이 외삽

들어가기 전에

한눈에 보기

  • 어텐션만으로는 "개가 사람을 물었다"와 "사람이 개를 물었다"를 구분할 수 없는 이유를 압니다.
  • 사인파 위치 인코딩 식을 4차원 예로 직접 채워 봅니다.
  • RoPE가 쿼리 · 키를 돌려서 점수가 "두 위치의 차이"에만 의존하게 만드는 원리를 숫자로 확인합니다.
  • ALiBi가 점수에 거리 비례 벌점을 더하는 방식을 계산해 봅니다.
  • 방식마다 "학습 때보다 긴 문장"을 얼마나 잘 다루는지(길이 외삽)의 차이를 비교합니다.

1. 왜 위치 정보가 따로 필요한가

직관(해설용 비유). 단어 카드를 봉투에 넣고 흔들어서 꺼낸다고 합시다. 어텐션은 봉투 안 카드끼리 서로 얼마나 관련 있는지만 봅니다. 카드가 원래 몇 번째였는지는 봉투 안에서 사라집니다. 카드 뒷면에 번호를 적어 두는 것이 위치 인코딩입니다.

조금 더 정확히. 셀프 어텐션의 출력은 입력 토큰의 순서를 바꾸면 출력도 같은 방식으로 순서만 바뀝니다(순열 등변, permutation equivariance). 각 토큰이 받는 가중합 자체는 순서와 무관하다는 뜻입니다. RNN은 토큰을 한 개씩 차례로 읽으니 순서가 저절로 들어가지만, 트랜스포머는 모든 토큰을 한꺼번에 병렬로 처리하므로 순서를 따로 알려 줘야 합니다.

두 가지 넣는 방식.

  1. 입력에 더하기: 토큰 임베딩에 위치 벡터를 더해서 첫 층에 넣습니다. 사인파 · 학습형이 이 방식입니다.
  2. 어텐션 점수 안에서 처리하기: 쿼리 · 키를 위치에 따라 변형하거나(RoPE), 점수에 거리 편향을 더합니다(ALiBi). 층마다 적용됩니다.

절대 위치 vs 상대 위치. "이 토큰은 7번째"는 절대 위치, "저 토큰은 나보다 3칸 앞"은 상대 위치입니다. 언어에서는 대개 상대 위치가 더 중요합니다("형용사 바로 뒤의 명사"는 문장 어디에 있든 같은 관계). 아래 방식들은 이 둘을 서로 다르게 다룹니다.

2. 사인파 위치 인코딩 (원조 트랜스포머)

직관. 시계를 떠올립니다. 초침은 빨리, 분침은 천천히, 시침은 더 천천히 돕니다. 세 바늘 위치를 함께 보면 하루 중 언제인지 정확히 알 수 있습니다. 사인파 인코딩은 차원마다 서로 다른 속도로 도는 바늘 을 둔 것입니다.

식. 위치 ii, 차원 짝 (2j,2j+1)(2j, 2j+1) 에 대해 트랜스포머 논문은 다음을 씁니다.

pi,2j=sin⁡ ⁣(i100002j/d),pi,2j+1=cos⁡ ⁣(i100002j/d)p_{i,2j} = \sin\!\left(\frac{i}{10000^{2j/d}}\right),\qquad p_{i,2j+1} = \cos\!\left(\frac{i}{10000^{2j/d}}\right)
기호뜻
ii토큰 위치(0, 1, 2, …)
dd모델 차원(임베딩 길이)
jj차원 짝의 번호(0부터 d/2−1d/2-1)
100002j/d10000^{2j/d}짝마다 다른 '느려지는 정도'. jj 가 클수록 천천히 돕니다

논문에 따르면 각 차원은 사인파 하나이고, 파장은 2π2\pi 에서 10000⋅2π10000\cdot 2\pi 까지 기하급수로 늘어납니다. 저자들은 고정된 거리 kk 만큼 떨어진 위치의 인코딩이 원래 위치 인코딩의 선형 함수로 표현되므로 상대 위치를 배우기 쉬울 것이라고 가설을 세웠습니다.

숫자로 해 보기(해설용, d=4d=4). 짝 0은 100000=110000^{0}=1 로 나누고, 짝 1은 100002/4=10010000^{2/4}=100 으로 나눕니다.

위치 iisin⁡(i)\sin(i)cos⁡(i)\cos(i)sin⁡(i/100)\sin(i/100)cos⁡(i/100)\cos(i/100)
00.0001.0000.0001.000
10.8410.5400.0101.000
20.909−0.4160.0201.000
30.141−0.9900.0301.000

앞 두 차원(빠른 바늘)은 위치마다 크게 달라지고, 뒤 두 차원(느린 바늘)은 아주 조금씩 변합니다. 짧은 거리는 빠른 바늘이, 먼 거리는 느린 바늘이 구분해 줍니다. 이 벡터를 토큰 임베딩에 그대로 더합니다.

왜 이렇게 했나. 저자들은 학습형 위치 임베딩도 실험했는데 결과가 거의 같았다고 보고했습니다. 그런데도 사인파를 고른 이유로 "학습 때 본 것보다 긴 길이로 외삽할 수 있을지도 모른다"는 점을 들었습니다. 이 '외삽 가능성'은 이후 연구에서 실제로는 제한적이라는 결과가 나왔고(5절 ALiBi), 그래서 다른 방식들이 나왔습니다.

3. 학습형 위치 임베딩

방식. 위치마다 벡터 하나를 표에 두고, 토큰 임베딩처럼 학습합니다. 위치 0용 벡터, 위치 1용 벡터, … 최대 길이까지. GPT-1과 BERT 같은 초기 사전학습 모델이 이 방식을 썼습니다. GPT-1 논문은 원조의 사인파 대신 학습형 위치 임베딩을 썼다고 밝히고, BERT는 사전학습 마지막 10% 단계를 길이 512로 학습해 위치 임베딩을 익혔다고 적었습니다.

장점. 단순하고, 데이터에서 필요한 위치 패턴을 자유롭게 배웁니다.

한계. 표에 없는 위치(최대 길이 초과)는 벡터가 아예 없습니다. 512칸 표로 학습한 모델에 1,000토큰을 넣을 수 없습니다. 또 "3칸 차이"라는 상대 관계를 직접 표현하지 않아, 모델이 위치 쌍마다 따로 배워야 합니다.

4. RoPE: 회전으로 위치를 넣기

직관. 쿼리와 키를 각자의 위치만큼 돌려 놓고 내적을 잽니다. 위치 5의 쿼리는 5칸만큼, 위치 3의 키는 3칸만큼 돕니다. 두 벡터 사이 각도는 "5칸 − 3칸 = 2칸"만큼만 벌어지므로, 점수는 두 위치의 차이 에만 달려 있게 됩니다. 절대 위치로 돌렸는데, 결과는 상대 위치를 반영합니다.

단계.

  1. 쿼리 · 키 벡터를 두 칸씩 짝지어 2차원 평면 여러 개로 봅니다.
  2. 짝 jj 마다 회전 속도 θj\theta_j 를 정합니다(사인파처럼 짝마다 다른 속도).
  3. 위치 mm 의 쿼리는 각 평면에서 mθjm\theta_j 만큼, 위치 nn 의 키는 nθjn\theta_j 만큼 돌립니다.
  4. 돌린 쿼리와 돌린 키로 평소처럼 내적 점수를 구합니다. 값 벡터는 돌리지 않습니다.

식(2차원 한 짝, RoFormer 논문 표기를 단순화).

R(α)=(cos⁡α−sin⁡αsin⁡αcos⁡α),(R(mθ) q)⊤(R(nθ) k)=q⊤R((n−m)θ) kR(\alpha)=\begin{pmatrix}\cos\alpha & -\sin\alpha\\ \sin\alpha & \cos\alpha\end{pmatrix},\qquad (R(m\theta)\,q)^\top (R(n\theta)\,k) = q^\top R\big((n-m)\theta\big)\,k
기호뜻
R(α)R(\alpha)평면 위의 점을 각도 α\alpha 만큼 돌리는 2×2 회전 행렬
m,nm, n쿼리 · 키 토큰의 위치
θ\theta이 짝의 회전 속도. RoFormer는 θi=10000−2(i−1)/d\theta_i = 10000^{-2(i-1)/d} (i=1,…,d/2i=1,\dots,d/2) 를 씁니다
q,kq, k회전 전 쿼리 · 키(2차원 조각)

오른쪽 식에 mm 과 nn 이 차이 n−mn-m 으로만 남는다는 점이 핵심입니다. 회전 행렬을 곱하면 각도가 더해지고(R(a)⊤R(b)=R(b−a)R(a)^\top R(b)=R(b-a)), 회전은 길이를 바꾸지 않기 때문입니다.

숫자로 해 보기 ①(해설용). 가장 단순하게 q=k=(1,0)q=k=(1,0), θ=0.5\theta=0.5 라 합시다. 돌린 뒤 내적은 cos⁡((m−n)θ)\cos\big((m-n)\theta\big) 입니다.

  • 위치 (m,n)=(2,0)(m,n)=(2,0): cos⁡(1)=0.540\cos(1)=0.540
  • 위치 (5,3)(5,3): cos⁡(1)=0.540\cos(1)=0.540 — 문장 어디에 있든 2칸 차이면 같은 점수
  • 위치 (4,0)(4,0): cos⁡(2)=−0.416\cos(2)=-0.416 — 4칸 차이는 다른 점수

숫자로 해 보기 ②(해설용, 일반 벡터). q=(1,2)q=(1,2), k=(3,1)k=(3,1), θ=0.5\theta=0.5. 돌리기 전 내적은 1⋅3+2⋅1=51\cdot3+2\cdot1=5 입니다. 2차원에서는 다음이 성립합니다.

(R(mθ)q)⋅(R(nθ)k)=(q⋅k)cos⁡Δ+(q1k2−q2k1)sin⁡Δ,Δ=(m−n)θ(R(m\theta)q)\cdot(R(n\theta)k) = (q\cdot k)\cos\Delta + (q_1k_2-q_2k_1)\sin\Delta,\qquad \Delta=(m-n)\theta

q1k2−q2k1=1⋅1−2⋅3=−5q_1k_2-q_2k_1 = 1\cdot1-2\cdot3=-5 입니다. (m,n)=(2,0)(m,n)=(2,0) 이면 Δ=1\Delta=1 이므로 5×0.540+(−5)×0.841≈−1.5065\times0.540+(-5)\times0.841\approx -1.506. 실제로 회전 행렬을 곱해 계산해도 (2,0)(2,0), (5,3)(5,3), (9,7)(9,7) 모두 −1.506-1.506 이 나옵니다(코드로 확인한 값). 반대로 (3,5)(3,5) 처럼 키가 쿼리보다 뒤 에 있으면 Δ=−1\Delta=-1 이 되어 6.9096.909 로 완전히 다른 값입니다. 앞뒤 방향도 구분된다는 뜻입니다.

왜 이렇게 했나. RoFormer 논문은 RoPE의 장점으로 ① 길이를 유연하게 다룰 수 있고 ② 거리가 멀수록 토큰 사이 의존이 약해지는 성질(장거리 감쇠)이 있으며 ③ 선형 어텐션과도 함께 쓸 수 있다는 점을 듭니다. 입력에 더하는 방식과 달리 매 층의 쿼리 · 키에 직접 적용되므로 위치 정보가 깊은 층까지 흐려지지 않습니다. LLaMA는 절대 위치 임베딩을 빼고 각 층에 RoPE를 넣었고, Llama 2도 같은 구성을 이어 갔습니다.

주의할 점. RoPE도 학습 때 본 적 없는 큰 회전 각도(아주 긴 거리)에서는 성능이 떨어질 수 있습니다. 그래서 회전 속도를 늘이거나 줄여 긴 문맥에 맞추는 여러 확장 기법이 나와 있습니다. 이 수업에서는 이름만 언급하고, 원리 수준(각도 범위를 학습 때 범위 안으로 맞춘다)만 기억하면 충분합니다.

5. ALiBi: 멀수록 점수를 깎기

직관. "가까운 말이 더 중요하다"는 사전 지식을 아주 노골적으로 넣습니다. 쿼리와 키가 멀리 떨어질수록 어텐션 점수에서 일정 비율로 벌점을 뺍니다. 위치 벡터는 아예 쓰지 않습니다.

식(ALiBi 논문). 위치 ii 의 쿼리 qiq_i 에 대해

softmax(qiK⊤+m⋅[−(i−1), …, −2, −1, 0])\mathrm{softmax}\Big(q_i K^\top + m\cdot[-(i-1),\ \dots,\ -2,\ -1,\ 0]\Big)
기호뜻
qiK⊤q_iK^\top보통 어텐션 점수(이전 위치들과의 내적)
[−(i−1),…,0][-(i-1),\dots,0]키가 쿼리에서 얼마나 떨어졌는지(멀수록 더 큰 음수)
mm헤드마다 고정된 기울기. 학습하지 않습니다

기울기 정하는 법. 헤드 8개면 mm 은 121,122,…,128\tfrac{1}{2^1}, \tfrac{1}{2^2}, \dots, \tfrac{1}{2^8} 입니다. 일반적으로 헤드 nn 개면 2−8/n2^{-8/n} 에서 시작해 같은 비율로 줄어드는 등비수열입니다. 기울기가 큰 헤드는 아주 가까운 토큰만, 작은 헤드는 멀리까지 봅니다. 논문은 기울기를 학습하게도 해 봤지만 외삽 결과가 좋지 않았다고 보고했습니다.

숫자로 해 보기(해설용). 네 번째 위치 쿼리의 원래 점수가 앞 토큰들에 대해 (2,1,3,2)(2, 1, 3, 2) 라 합시다(마지막이 자기 자신). 거리 편향은 (−3,−2,−1,0)(-3,-2,-1,0) 입니다.

  • 편향 없음: 소프트맥스 ≈(0.197, 0.072, 0.534, 0.197)\approx(0.197,\ 0.072,\ 0.534,\ 0.197)
  • m=1/2m=1/2 헤드: 점수 (0.5, 0, 2.5, 2)(0.5,\ 0,\ 2.5,\ 2) → ≈(0.074, 0.045, 0.548, 0.333)\approx(0.074,\ 0.045,\ 0.548,\ 0.333) — 먼 첫 토큰 비중이 크게 줄고 자기 자신 쪽이 늘었습니다.
  • m=1/256m=1/256 헤드: 점수가 거의 그대로 → ≈(0.195, 0.072, 0.535, 0.198)\approx(0.195,\ 0.072,\ 0.535,\ 0.198) — 멀리까지 고르게 봅니다.

결과(논문이 보고한 것). 길이 1,024로 학습한 13억(1.3B) 파라미터 모델이 길이 2,048 입력에서, 길이 2,048로 학습한 사인파 모델과 같은 퍼플렉서티를 냈고, 학습은 11% 빨랐으며 메모리를 11% 덜 썼다고 합니다. 이 논문의 제목 그대로 "짧게 학습하고 길게 시험하기(train short, test long)"가 핵심 주장입니다.

6. 네 방식 비교

방식어디에 넣나위치 종류학습하나최대 길이 넘으면
사인파입력 임베딩에 더함절대(상대를 표현할 여지)아니오계산은 되지만 성능 보장 없음
학습형입력 임베딩에 더함절대예벡터가 없어 쓸 수 없음
RoPE매 층 쿼리 · 키 회전절대로 돌려 상대를 얻음아니오큰 각도에서 성능 저하, 확장 기법 필요
ALiBi매 층 점수에 편향상대(거리)아니오(기울기 고정)비교적 잘 외삽(논문 보고)
mermaid
flowchart LR
  T[토큰 임베딩] --> A{위치를 어디서 넣나}
  A -->|입력에 더하기| S[사인파 · 학습형 위치 벡터 더함]
  S --> L[트랜스포머 층]
  A -->|층 안에서| L2[트랜스포머 층]
  L2 --> QK[쿼리 · 키 계산]
  QK -->|RoPE| R[위치만큼 회전]
  QK -->|ALiBi| B[점수에 거리 벌점]
  R --> SM[소프트맥스 · 가중합]
  B --> SM
  L --> SM

어떤 걸 고르나(실무 감각). 공개 LLM 가운데 RoPE를 쓰는 모델이 많습니다(LLaMA 계열이 대표). 모델을 쓸 때는 모델 카드나 설정 파일에서 위치 방식을 확인하면 됩니다. 새 모델을 처음부터 만들 일이 없다면, 어떤 모델이 무엇을 쓰는지 알아 두고 "긴 문맥 확장"이 왜 별도 작업인지 이해하는 정도면 충분합니다.

연습 문제

  1. d=4d=4 사인파 인코딩에서 위치 4의 벡터를 구하세요(sin⁡4≈−0.757\sin 4\approx-0.757, cos⁡4≈−0.654\cos4\approx-0.654).
    • 풀이: (sin⁡4, cos⁡4, sin⁡0.04, cos⁡0.04)≈(−0.757, −0.654, 0.040, 0.999)(\sin4,\ \cos4,\ \sin0.04,\ \cos0.04)\approx(-0.757,\ -0.654,\ 0.040,\ 0.999) 입니다.
  2. RoPE에서 q=k=(1,0)q=k=(1,0), θ=0.5\theta=0.5 일 때 위치 (10,4)(10, 4) 의 점수는?
    • 풀이: 차이 6칸 → cos⁡(3)≈−0.990\cos(3)\approx-0.990 입니다. (6,0)(6,0) 과 같습니다.
  3. ALiBi로 헤드 16개를 쓰면 첫 헤드의 기울기는?
    • 풀이: 2−8/16=2−0.5≈0.7072^{-8/16}=2^{-0.5}\approx0.707 입니다. 그다음은 0.50.5, 0.3540.354, … 로 같은 비율로 줄어듭니다.
  4. 학습형 위치 임베딩(최대 512)으로 학습한 모델에 600토큰을 넣으면 어떤 문제가 생기나요?
    • 풀이: 위치 512~599에 해당하는 벡터가 표에 없어 그대로는 처리할 수 없습니다. 잘라 넣거나 위치 표를 늘려 추가 학습해야 합니다.

스스로 점검

  1. 셀프 어텐션에 위치 정보가 없으면 정확히 무엇을 구분 못 하나요?
    • 답: 같은 토큰들로 이루어진 서로 다른 순서의 문장입니다. 각 토큰이 받는 가중합이 순서와 무관하므로 "개가 사람을 물었다"와 "사람이 개를 물었다"가 같은 표현 집합이 됩니다.
  2. RoPE가 절대 위치로 회전하는데도 '상대 위치' 방식이라 불리는 이유는?
    • 답: 쿼리를 mθm\theta, 키를 nθn\theta 만큼 돌리면 내적에는 차이 (n−m)θ(n-m)\theta 만 남기 때문입니다. 점수가 두 위치의 차이에만 의존합니다.
  3. ALiBi에서 헤드마다 기울기를 다르게 두는 이유는?
    • 답: 어떤 헤드는 바로 옆 단어만, 어떤 헤드는 먼 문맥까지 보도록 '시야 범위'를 여러 개 확보하기 위해서입니다.

용어 정리

용어쉬운 뜻
위치 인코딩(positional encoding)토큰이 몇 번째인지 알려 주는 정보를 모델에 넣는 방법
순열 등변입력 순서를 바꾸면 출력도 똑같이 순서만 바뀌는 성질
절대 위치 · 상대 위치'몇 번째인가' vs '몇 칸 떨어졌나'
사인파 인코딩차원마다 다른 주기의 sin · cos 값으로 위치를 나타내는 고정 벡터
학습형 위치 임베딩위치마다 벡터를 하나씩 두고 학습하는 방식
RoPE(회전 위치 임베딩)쿼리 · 키를 위치만큼 회전해 점수가 위치 차이에 의존하게 하는 방식
ALiBi어텐션 점수에 거리에 비례한 벌점을 더하는 방식
길이 외삽(extrapolation)학습 때보다 긴 입력에서도 잘 작동하는 것

더 깊이 보려면

다음에 볼 것

라이선스

본문은 KAITABASE 자체 해설입니다. 참고 자료 Dive into Deep Learning은 CC BY-SA 4.0으로 공개되어 있습니다. 숫자 예는 이 수업을 위해 만든 해설용 예이며, 계산 결과는 파이썬으로 검산했습니다. 논문 수치는 각 원문에서 확인한 것만 옮겼습니다.

출처

AI 원리부터 이해하기 · NLP·트랜스포머 모듈

NLP·트랜스포머 모듈 학습

이 글은 NLP·트랜스포머 모듈의 학습 자료입니다. 전체 23개 자료 중 10번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 D2L(CC BY-SA 4.0) · arXiv 원 논문