Transformer
Transformer는 셀프 어텐션을 기반으로 시퀀스 전체를 병렬 처리하는 신경망입니다. 작동 원리, 변형 모델, 비전 분야의 활용을 살펴봅니다.
Transformer는 단어나 이미지 패치와 같은 토큰 시퀀스를 처리하는 신경망 아키텍처로, 셀프 어텐션을 통해 각 토큰이 다른 모든 토큰으로부터 정보를 얻습니다. Google 연구진은 2017년 기계 번역을 위해 Attention Is All You Need에서 이 아키텍처를 소개했습니다. 이전의 순환 신경망(RNN)은 문장을 한 번에 한 단어씩 읽었으므로 위치 간 병렬 학습이 불가능했습니다. Transformer는 모든 위치를 한 번에 처리하며, 기본 모델은 8개의 GPU에서 12시간 학습한 뒤 영어-독일어 번역에서 당시 최고 성능을 달성했습니다. 오늘날 Transformer는 대규모 언어 모델(LLM), 비전 Transformer, 음성 인식, 그리고 다양한 객체 탐지 및 이미지 생성 모델의 기반이 됩니다.
Transformer의 작동 방식#
입력 토큰은 먼저 고정된 너비의 벡터(원래 모델에서는 512차원)인 임베딩으로 변환됩니다. 그런 다음 Transformer는 각각 두 개의 하위 레이어로 구성된 동일한 레이어를 여러 개 쌓아 적용합니다.
- 멀티헤드 셀프 어텐션: 각 토큰은 쿼리, 키, 값 벡터를 생성합니다. 어텐션 메커니즘에서 설명하듯, 토큰의 출력은 쿼리가 각 키와 얼마나 잘 일치하는지에 따라 가중치를 부여한 모든 값 벡터의 가중 평균입니다. 원래 모델에서는 8개인 여러 헤드가 병렬로 실행되므로 각 헤드가 서로 다른 관계를 추적할 수 있습니다.
- 피드포워드 네트워크: 각 토큰에 개별적으로 적용되는 2계층 네트워크로, 어텐션이 수집한 정보를 변환합니다.
각 하위 레이어를 잔차 연결이 감싸고 레이어 정규화가 활성값을 안정적으로 유지합니다. 원래 모델은 소스 문장을 읽는 인코더에 이러한 레이어 6개를 쌓고, 한 번에 토큰 하나씩 번역문을 작성하는 디코더에도 6개를 쌓았습니다. 각 디코더 레이어에는 미래 토큰을 가리는 마스크드 셀프 어텐션 단계와 인코더의 출력을 읽는 크로스 어텐션 단계가 추가됩니다.
어텐션은 내용만을 기준으로 토큰을 비교하므로 Transformer 레이어에는 내재된 순서 감각이 없습니다. 입력 토큰을 섞으면 출력도 같은 방식으로 섞일 뿐입니다. 따라서 원 논문의 고정 사인·코사인 패턴, BERT와 ViT의 학습된 위치 벡터, 또는 대부분의 최신 LLM에서 사용하는 회전 위치 임베딩(RoPE) 등의 방법으로 위치 정보를 토큰 임베딩에 추가합니다. 이 PyTorch 코드는 인코더 레이어 하나를 사용해 그 효과를 보여 줍니다.
import torch
from torch import nn
# Transformer 인코더 레이어 하나와 토큰 임베딩 5개로 이루어진 시퀀스
torch.manual_seed(0)
layer = nn.TransformerEncoderLayer(d_model=32, nhead=4, batch_first=True).eval()
tokens = torch.randn(1, 5, 32)
reverse = torch.arange(4, -1, -1)
# 셀프 어텐션만으로는 순서를 무시합니다. 입력을 뒤집으면 출력만 뒤집힙니다.
print(torch.allclose(layer(tokens[:, reverse])[:, reverse], layer(tokens), atol=1e-5))
# 위치마다 학습 가능한 벡터 하나를 추가하면 각 출력은 해당 토큰의 위치에 따라 달라집니다.
positions = nn.Embedding(5, 32).weight
reordered = layer(tokens[:, reverse] + positions)[:, reverse]
print(torch.allclose(reordered, layer(tokens + positions), atol=1e-5))이 코드는 먼저 True을 출력한 다음 False을 출력합니다. 위치 벡터를 추가하기 전에는 토큰을 뒤집으면 출력만 뒤집히지만, 위치 벡터를 추가한 뒤에는 토큰 순서가 각 토큰의 출력을 바꿉니다.
인코더, 디코더 및 인코더-디코더 모델#
원래 스택을 사용하는 세 가지 방식은 서로 다른 용도에 적합합니다.
- 인코더 전용: 모든 토큰이 양방향에서 입력 전체에 주의를 기울이므로 이해 작업에 적합합니다. 텍스트용 BERT와 이미지용 ViT는 인코더 전용 모델입니다.
- 디코더 전용: 각 토큰은 앞에 있는 토큰에만 주의를 기울이므로 모델이 한 번에 토큰 하나씩 텍스트를 생성합니다. GPT 모델과 대부분의 최신 LLM은 이 설계를 사용합니다.
- 인코더-디코더: 인코더가 하나의 시퀀스를 읽고 디코더가 해당 시퀀스에 주의를 기울이며 다른 시퀀스를 작성합니다. 번역 모델, T5, Whisper 음성 인식기가 이러한 방식을 사용합니다.
컴퓨터 비전에서의 Transformer#
비전 Transformer(ViT)는 이미지를 16×16픽셀 패치 시퀀스로 취급해 수정하지 않은 Transformer 인코더를 적용하며, Swin Transformer는 고해상도 이미지로 확장할 수 있도록 어텐션을 로컬 윈도우로 제한합니다. DETR은 탐지를 집합 예측으로 재구성했습니다. Transformer 디코더가 학습된 객체 쿼리의 고정 집합을 박스로 변환하며 쿼리 하나당 객체 하나를 예측하므로 비최대 억제(NMS)와 수작업으로 설계한 앵커가 필요하지 않습니다. Ultralytics 패키지는 Baidu의 RT-DETR을 실행합니다. 이 설계를 실시간으로 구현한 RT-DETR의 하이브리드 인코더는 스트라이드 32의 특징 맵(640×640 이미지 기준 토큰 400개)에만 Transformer 인코더 레이어를 적용하며, 6개 레이어로 구성된 디코더는 객체 쿼리 300개를 정제해 NMS 없이 최종 탐지 결과를 생성합니다. Transformer는 이미지 생성에도 사용됩니다. 확산 Transformer는 최근 텍스트-이미지 및 비디오 모델에서 U-Net을 대체했으며, 비전 언어 모델은 이미지 토큰을 디코더 전용 LLM에 입력합니다.
Transformer와 관련 아키텍처 비교#
- 합성곱 신경망(CNN): 합성곱은 모든 위치에서 동일한 필터를 사용해 작은 주변 영역을 살펴보며, 이러한 내재된 가정은 작은 데이터셋에서 효과적입니다. 어텐션은 한 레이어 안에서 임의의 두 위치를 연결할 수 있지만 데이터로부터 공간 구조를 학습해야 하므로, Transformer가 CNN을 능가하려면 대개 더 많은 학습 데이터나 사전 학습이 필요합니다.
- RNN과 LSTM: 단계마다 고정 크기의 상태를 전달하므로 토큰당 메모리는 일정하게 유지되지만 학습은 순차적으로 진행됩니다. Transformer는 과거의 모든 토큰을 유지하고 병렬로 학습합니다.
- 상태 공간 모델: Mamba와 같은 아키텍처는 길이에 따라 비용이 선형적으로 증가하는 순환 상태를 사용해 시퀀스를 처리하며, 하이브리드 모델은 이러한 아키텍처와 어텐션 레이어를 교차 배치합니다.
셀프 어텐션은 모든 토큰을 서로 비교하므로 비용이 시퀀스 길이의 제곱에 비례해 증가합니다. 토큰 4,096개로 이루어진 시퀀스에는 모든 레이어의 모든 헤드에서 쿼리-키 쌍이 약 1,680만 개 생기며, 길이를 8,192개로 두 배 늘리면 약 6,700만 개로 네 배 증가합니다. FlashAttention은 이 연산의 메모리 트래픽을 줄이고, KV 캐시는 이전 토큰의 키와 값을 저장해 디코더가 생성 과정에서 각 토큰을 한 번만 계산하도록 합니다.










