본문 바로가기
AI/Deep Learning

[Transformer 정리] 03. Positional Encoding과 특수 토큰

by je0nsye0n 2025. 1. 13.

Positional Encoding(위치 인코딩)

✅ 위치 인코딩 방식의 필요성

트랜스포머의 특징 : 시퀀스의 각 단어는 임베딩 처리되어 벡터 형태로 변환됨 / 시퀀스를 병렬 구조로 처리

→ 따라서, 단어의 순서 정보를 제공하지 않는다. 때문에 위치 정보를 임베딩 벡터에 추가하여 단어의 순서 정보를 모델에 반영해야 한다. 이를 위해 트랜스포머는 위치 인코딩 방식을 사용한다.

 

위치 인코딩이란?

  • 위치 인코딩 : 입력 시퀀스의 순서 정보를 모델에 전달하는 방법 (각 단어의 위치 정보를 나타내는 벡터를 더하여 임베딩 벡터에 위치 정보를 반영)

인코딩 벡터는 sin 함수와 cos 함수를 사용하여 생성되며, 이를 통해 임베딩 벡터와 위치 정보가 결합된 최종 입력 벡터를 생성한다. 위치 인코딩 벡터를 추가함으로써 모델은 단어의 순서 정보를 학습할 수 있게 된다.

 

✅ 위치 인코딩 실습

import math
import torch 
from torch import nn
from matplotlib import pyplot as plt

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_len, dropout=0.1):
        super().__init__()
        
        self.dropout = nn.Dropout(p=dropout) 

        position = torch.arange(max_len).unsqueeze(1)
        # torch.arange(max_len) : 0부터 max_len까지의 정수로 이루어진 1차원 텐서 생성
        # .unsqueeze(1) : 텐서의 두번째 차원에 차원을 추가하여 (max_len,i) 모양의 2D 텐서를 생성
        div_term = torch.exp(
            torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))
        # 주파수 조정 값 div_term 계산
        # 최종적으로는 지수 함수(exp 함수)로 변환하여 주파수를 조정한다. 과정으로는 짝수 인덱스의 위치를 계산과 위치 인코딩에 사용되는 파라미터 값을 사용한다.

        pe = torch.zeros(max_len, 1, d_model)
        # 위치 인코딩 값을 저장하는 텐서로, 초깃값은 0이다.
        pe[:,0,0::2] = torch.sin(position * div_term)
        pe[:,0,1::2] = torch.cos(position * div_term)
        # 짝수 인덱스는 사인 함수를, 홀수 인덱스는 코사인 함수를 사용한다.
        self.register_buffer("pe",pe)
        # pe를 버퍼로 등록하여 학습 중 업데이트 되지 않도록 설정한다.

    def forward(self, x):
        x = x + self.pe[: x.size(0)]
        return self.dropout(x)
    # 입력 시퀀스의 길이에 맞게 위치 인코딩 값을 슬라이싱 해준 후, 입력 텐서에 위치 인코딩 값을 더한다.
    # 드롭아웃을 사용하여 과적합을 방지한다.

encoding = PositionalEncoding(d_model=128, max_len=50)

plt.pcolormesh(encoding.pe.numpy().squeeze(),cmap="RdBu")
plt.xlabel("Embedding Dimension")
plt.xlim((0,128))
plt.ylabel("Positional")
plt.colorbar()
plt.show()

 

 

출력 결과

→ PositinalEncoding의 클래스는 임베딩 차원(d_model)과 최대 시퀀스(max_len)을 입력받는다. 입력 시퀀스의 위치마다 sin과 cos 함수로 위치 인코딩을 계산한다.

특수 토큰

트랜스포머는 단어 토큰 이외의 특수 토큰을 활용하여 문장을 표현한다. 이 특수 토큰은 입력 시퀀스의 시작과 끝을 나타내거나 마스킹(Masking) 영역으로 사용된다. 특수 토큰으로 모델이 입력 시퀀스의 시작과 끝을 인식할 수 있게 하며, 마스킹을 통해 일부 입력을 무시할 수 있다.

 

아래 그림에서 사용한 앞뒤 토큰들은

[START] → BOS(Beginning of Sentence), [END] → EOS(End of Sentence)로 보면된다.

이 토큰들은 각각 문장의 시작과 문장의 끝을 나타낸다.

추가적으로 특수 토큰이 몇 개 더 있다.

  • UNK 토큰 : 어휘 사전에 없는 단어로, 모르는 단어를 의미한다. 이 토큰은 모델이 이전에 본적 없는 단어를 처리할 때 사용함
  • PAD 토큰 : 모든 문장을 일정한 길이로 맞추기 위해 사용된다. (짧은 문장의 빈 공간을 채울 때 사용)

 

✅ 입력 임베딩 산출 과정

입력 임베딩으로 변환되는 과정은 Word2Vec와 동일하다. 어휘 사전의 크기를 V, 입력 임베딩 차원을 d라고 했을 때 트랜스포머의 원-핫 벡터는 [1,V]의 크기를 갖는다. 이 원-핫 벡터는 임베딩 행렬 [V,d]에 의해 [1,d] 크기의 벡터로 변환된다.

이러한 방식을 일반화하면 N개의 문장이 최대 S개의 토큰 길이를 가질 때 [N, S, V] 크기의 원-핫 벡터 텐서는 [N,S,d] 크기의 임베딩 텐서로 변환된다.

입력 임베딩 산출 과정

 

이 임베딩 텐서는 입력으로 사용되며, 트랜스포머의 모든 계층에서 공유되는 텐서로 사용된다.