Day 29: 위치 인코딩 (Positional Encoding)
요약
트랜스포머 모델이 본질적으로 부족한 순서 감각을 보완하기 위해 위치 인코딩(Positional Encoding)의 필요성을 설명합니다. 학습 가능한 방식과 고정된 사인파 기반 방식을 비교하며, 특히 수학적 공식으로 구현되는 사인파 기반 인코딩은 훈련 범위를 넘어선 긴 시퀀스 처리와 일반화에 유리함을 강조합니다.
핵심 포인트
- 트랜스포머는 순서 감각이 없어 위치 정보가 필수적이다.
- 학습 가능한 방식은 적응성이 높으나, 범위 외 일반화가 어렵다.
- 사인파 기반 인코딩은 수학 공식으로 구현되어 임의 길이 처리가 가능하다.
- 위치 벡터를 단어 임베딩에 더하여 순서 정보를 주입한다.
이전(Day 28): 트랜스포머 모델에서 사용되는 멀티-헤드 어텐션(multi-head attention)을 설명하며, 여러 개의 어텐션 헤드가 독립적이고 병렬적인 계산을 통해 입력 시퀀스 내의 다양하고 중첩된 패턴을 포착할 수 있게 하고, 이를 결합하여 하나의 표현으로 완성하는 과정을 상세히 다루었습니다.
트랜스포머에서 위치 인코딩이 해결하는 문제점
트랜스포머는 언어, 비전 및 기타 시퀀스 작업을 처리하는 강력한 모델입니다. 하지만 이들은 내재된 순서 감각(sense of order)이 부족합니다. 순환 신경망(Recurrent Neural Networks, RNNs)은 시퀀스를 단계별로 처리하기 때문에 단어의 순서가 명확합니다. 예를 들어,
- 학습 가능한 위치 임베딩 (Learnable Positional Embeddings): 시퀀스의 각 위치는 학습 가능한 벡터를 할당받으며, 이는 단어 각각이 고유한 임베딩을 갖는 방식과 유사합니다. 훈련 과정 동안 네트워크는 특정 작업에 가장 적합한 위치 패턴을 스스로 학습합니다. 예를 들어, 문장의 위치 1, 2, 3 등 각 위치마다 해당 벡터를 조회(look up)하게 됩니다.
직관적 이해: 모델은 특정 작업과 데이터셋에 맞춰 조정된 자체적인 '순서의 언어'를 발명해냅니다. 하지만 오직 훈련에서 본 위치만 학습하며, 더 길거나 이동된 시퀀스를 유연하게 처리하지 못할 수 있습니다.
- 고정된 (사인파 기반) 위치 인코딩 (Fixed (Sinusoidal) Positional Encodings): 위치 벡터는 서로 다른 속도의 사인(sine) 및 코사인(cosine) 파동을 사용하여 계산됩니다. 각 위치에는 수학적 공식이 존재하기 때문에, 모델은 훈련에서 본 것보다 더 긴 시퀀스 길이도 처리할 수 있습니다.
직관적 이해: 각 위치는 고유한 '파형 패턴'으로 레이블링됩니다. 어떤 파동은 빠르서 국지적인 순서(인접 단어)를 포착하고, 다른 파동은 느려서 광범위한 거리를 표시합니다.
트레이드오프 (Tradeoff):
학습된 인코딩은 훈련 데이터에 가깝게 적응하지만 그 범위를 넘어서 일반화하는 데 어려움을 겪습니다. 고정된 인코딩은 더 보편적이며 임의의 시퀀스 길이에 대해 작동합니다.
사인파 기반 위치 인코딩: 작동 방식
사인파 기반 위치 인코딩 (sinusoidal positional encoding) 은 서로 다른 주파수의 사인 및 코사인 파동을 결합하여 각 위치에 고유한 벡터를 생성합니다. 먼저 벡터 길이를 8 또는 512와 같이 지정합니다. 벡터의 모든 차원 i에 대해 다음 공식을 사용합니다:
-
짝수 인덱스:
sin(position / (10000^(2i/dim))) -
홀수 인덱스:
cos(position / (10000^(2i/dim))) -
position은 시퀀스 내 단어의 위치입니다 (0부터 시작). -
i는 벡터 내의 위치를 나타냅니다. -
dim은 벡터의 총 크기입니다.
낮은 번호의 벡터 차원은 각 단어마다 빠르게 변화하여 짧은 거리를 추적하는 반면, 높은 번호의 차원은 더 느리게 변화하여 장거리 순서(longer-range order)를 추적합니다. 이를 그래프로 그리면, 모든 토큰 위치에 고유한, 빠르거나 느린 일련의 파동들이 생성됩니다.
단순히 모델에게 “이것은 4번째 위치다”라고 알려주는 것을 넘어, 이 파동들은 임의의 두 위치가 얼마나 떨어져 있는지 쉽게 감지하도록 돕습니다. 두 위치 벡터 사이의 수치적 차이가 시퀀스 내에서의 거리를 인코딩합니다.
실제 적용에서 Positional Encoding 사용하기
실제적으로 볼 때, positional encoding을 추가하는 것은 간단합니다. 위치 벡터들의 행렬(각 토큰마다 하나씩, 단어 임베딩 크기에 맞춤)을 계산한 다음, 이를 단어 임베딩에 더하면 됩니다. 이 덧셈은 요소별(elementwise)로 이루어집니다: 각 토큰의 의미 벡터의 모든 값은 위치 벡터에서 해당되는 숫자를 받게 됩니다.
새로운 입력 필드는 없습니다. 추론 시 특별한 변경도 없습니다. 단지 이 공식만 있으면 됩니다:
final_embedding = word_embedding + position_signal
거의 모든 Transformer 아키텍처는 첫 번째 어텐션 레이어 바로 직전에, 단어 임베딩 직후에 positional encoding을 추가합니다.
다음은 사인파 인코딩(sinusoidal encoding)과 단어 임베딩과의 결합을 보여주는 최소한의 실행 가능한 코드입니다:
import numpy as np
def get_sinusoidal_positional_encoding(seq_len, d_model):
...
이것만으로 충분합니다: 위치 신호를 만들고 더해주면 됩니다. 이제 각 토큰은 자신의 의미와 그 자리를 모두 “가지게” 됩니다.
직관적인 비유: 시퀀스 속의 음악 음표
음악을 생각해 보세요. 음표는 단순히 소리일 뿐입니다—G, D, 또는 E 같은 것입니다. 하지만 멜로디는 어떤 음표를 연주했는지뿐만 아니라 그 순서대로 연주하는 것이 중요합니다. 어떤 음표가 먼저 오는지 모른다면, 음악은 사라집니다.
Positional encoding은 마치 각 음표에 타임스탬프나 라벨을 추가하는 것과 같습니다. 악보가 뒤섞여 있어도 연주자에게 음표들 사이의 순서와 간격을 알려줍니다.
Transformer에서 positional encoding은 모든 단어에 문장의 “멜로디” 속에서의 자리를 부여합니다. 모델은 각 단어의 의미와 그것이 어디에 적합한지 둘 다 얻게 됩니다. 이는 순서가 중요한 거의 모든 언어 작업에 필수적입니다.
핵심 요약
핵심 요약
- Transformer는 시퀀스 내 단어 순서를 구별하기 위해 위치 인코딩(positional encoding)이 필요합니다.
- 학습 가능한 위치 임베딩(learnable position embeddings)은 데이터에 적응하지만, 더 긴 시퀀스로 일반화되지 않을 수 있습니다.
- 사인파 인코딩(Sinusoidal encodings)은 수학적 파형 패턴을 사용하여 모든 길이의 토큰 위치를 라벨링합니다.
- 위치 인코딩을 추가하는 것은 어텐션(attention) 전에 단어 임베딩에 단순히 요소별 덧셈을 하는 것입니다.
직접 실습해보기
시퀀스 길이가 10이고 임베딩 차원이 8인 사인파 위치 인코딩을 생성하는 코드를 작성하세요. 동일한 모양의 무작위 단어 임베딩을 만들고, 위치 인코딩을 요소별로 더한 다음, 결합된 결과를 출력하세요. 위치 인코딩이 원래 임베딩을 어떻게 변화시키는지 관찰해 보세요.
추가 자료
- 🎥 L‑5 | Transformer의 위치 인코딩 설명
- 📘 Transformer의 위치 인코딩 — Neuromatch Academy 튜토리얼
- 📄 “위치 정보가 있는 Transformer: 개요” (survey paper)
다음 내용: Day 30: 트랜스포머 인코더 아키텍처
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기