지난 글에서 우리는 트랜스포머가 RNN의 재귀(Recurrence)를 과감히 버리고 병렬화라는 무기를 얻었다고 이야기했습니다.
하지만 공짜 점심은 없습니다. 재귀를 버리자마자 트랜스포머는 치명적인 약점을 노출합니다. 바로 '순서'를 모르는 바보가 되었다는 점입니다.
모델 입장에서는 "아버지가 방에 들어가신다"와 "아버지 가방에 들어가신다"가 그저 똑같은 단어 카드 뭉치로 보입니다. 모든 토큰을 한꺼번에 병렬로 처리하기 때문입니다.
그래서 우리는 단어 벡터에 "네 위치는 여기야!"라는 이정표를 심어줘야 합니다. 이것이 바로 Positional Encoding(PE)입니다.
왜 결합(Concat)이 아니라 더하기(Add)인가?
PE를 처음 접할 때 아주 가끔, 하지만 꽤나 근본적인 질문을 던지는 분들이 있습니다.
"정보 오염을 막으려면 단어 벡터 옆에 위치 벡터를 붙여버리면(Concatenate) 되잖아요? 왜 굳이 더해서(Add) 정보를 섞어버리나요?"
직관적으로는 결합이 정보를 온전히 보존하는 정답처럼 보입니다. 하지만 실무적, 그리고 연구적 관점 모두에서 결합은 '자폭' 행위에 가깝습니다.
1. 텐서 규격의 파괴 (Dimension Mismatch)
트랜스포머의 모든 가중치 행렬($W^Q, W^K, W^V$)은 $d_{model}$(예: 512)이라는 고정된 차원에 맞춰 정교하게 설계되어 있습니다. 만약 위치 정보를 보존하겠다고 옆에 512차원을 더 붙여 1024차원을 만드는 순간, 모든 레이어 설계를 통째로 갈아엎어야 합니다. 배보다 배꼽이 더 커지는 꼴이죠.
2. 위치 정보가 '입혀지지' 않는다
사실 이게 더 본질적인 문제입니다. 결합(Concat)은 위치 정보를 단어 옆에 '나열'할 뿐, 단어 벡터에 위치 속성을 '주입'하지 못합니다. 연구적 관점에서 보자면, 우리는 단어 자체가 특정 위치에 있을 때의 '상태(State)'를 모델링하고 싶은 것이지, 단어 옆에 위치 번호표를 따로 붙여두고 모델이 알아서 매칭하길 기다리는 게 아니기 때문입니다.
3. 계산 비용의 낭비 (Parameter Inefficiency)
만약 512차원 단어 벡터 옆에 512차원 위치 벡터를 붙인다면(Concat), 입력 차원은 1024가 됩니다. 이렇게 되면 모델 내부의 연산량은 제곱비례로 늘어나게 됩니다. 학습 속도는 느려지고 메모리는 더 많이 잡아먹겠죠. 연구진은 차원을 늘리지 않고도($d_{model}$ 유지), 덧셈만으로 위치 정보를 충분히 표현할 수 있음을 증명해 낸 것입니다.
그래서 '더하기(Add)'를 선택했습니다.
연구진은 고차원 공간의 희소성(Sparsity)을 믿었습니다. 512차원이라는 공간은 생각보다 광활합니다. 단어의 의미 정보를 담은 벡터 위에 위치 정보를 담은 벡터를 더해도($Element-wise Sum$), 두 정보는 충분히 분리될 수 있습니다.
마치 흰색 도화지(단어 의미)에 아주 연한 색연필(위치 정보)로 숫자를 적는 것과 같습니다. 본질을 망치지 않으면서도 순서는 알 수 있게 하는, 일종의 '착색(Coloring)' 기법인 셈입니다.
사인/코사인(Sinusoidal)의 설계 철학
구글 연구진은 이 착색 작업을 위해 삼각함수를 가져왔습니다. 단순히 수식이 멋있어 보여서 쓴 게 아닙니다.
$$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$$
수식이 복잡해 보이지만, 핵심 철학은 딱 두 가지입니다.
1. 유일성 (Uniqueness)
각 차원($i$)마다 주파수(Frequency)가 다릅니다. 이들이 조합되면 모든 위치($pos$)는 겹치지 않는 고유한 벡터 값을 가지게 됩니다. 마치 시계의 시침, 분침, 초침이 매 순간 다른 각도로 조합되어 시간을 가리키는 것과 같습니다.
2. 상대적 위치 보존 (Relative Positioning)
이 부분이 가장 중요합니다. 논문 저자들은 모델이 절대적인 위치보다 상대적인 거리(예: "이 단어는 저 단어보다 $k$칸 뒤에 있다")를 학습하길 원했습니다. 사인/코사인의 덧셈 정리에 의해, $pos+k$ 위치의 인코딩 벡터는 $pos$ 위치의 벡터에 선형 변환(Linear Transformation)을 가한 형태로 표현될 수 있기 때문입니다.
모델은 $QK^T$ 내적 연산을 통해 "아, 얘네 둘은 각도가 이만큼 차이 나니 거리가 이 정도겠구나"라는 거리감을 수학적으로 자연스럽게 익히게 됩니다.
고전의 한계, 그리고 다음을 기약하며
이 방식은 효율적이고 우아합니다. 하지만 완벽하진 않습니다.
가장 큰 문제는 외삽(Extrapolation)입니다. Sinusoidal PE는 고정된 함수입니다. 만약 학습 때 최대 길이가 512토큰이었다면, 추론 때 1000번째 토큰이 들어왔을 때 모델은 당황합니다. 주기 함수니까 값은 나오겠지만, 모델이 학습하지 못한 '거리감'이기 때문입니다.
최근의 LLaMA 같은 거대 모델들은 이 한계를 극복하기 위해 벡터를 더하는 대신 공간 자체를 회전시켜버리는 RoPE(Rotary Positional Embedding) 같은 방식을 사용합니다. 이런 현대적인 기법들은 추후 연재될 [고급] 현대 트랜스포머 시리즈에서 아주 깊게 파헤쳐 보겠습니다.
마치며
Positional Encoding은 단순한 덧셈이 아닙니다. 단어라는 본질에 '순서'라는 상태(State)를 부여하는 과정입니다. 이로써 트랜스포머는 병렬 처리의 속도와 순차 정보의 디테일을 모두 잡을 수 있었습니다.
네. 사실 이번 글을 막상 적으려고 보니 놀랍게도 설명할 게 진짜 많이 없었습니다. (웃음) 하지만 당연해 보이는 이 '더하기' 연산 속에 텐서 규격을 지키고 상태를 모델링하려는 필사적인 설계가 숨어있다는 점을 꼭 기억해 주셨으면 합니다.
이제 입력 데이터를 위한 모든 준비는 끝났습니다. 다음 글에서는 드디어 이 모든 정보가 모여 집단 지성을 발휘하는 Multi-Head Attention의 진짜 얼굴을 파헤쳐 보겠습니다.
그럼 다음 글에서 뵙도록 하겠습니다.
해당 게시글은 Gemini 3 Flash를 이용해 작업하였음을 알립니다.
'트랜스포머 시리즈' 카테고리의 다른 글
| [딥러닝] 트랜스포머 Attention 완벽 이해: Q, K, V의 역할과 원리 (0) | 2026.01.08 |
|---|