소개: 모든 것을 변화시킨 아키텍처
Il 트랜스포머, "Attention Is All You Need"(Vaswani et al., 2017) 논문에 소개된, RNN의 재발을 완전히 제거하여 딥 러닝에 혁명을 일으켰습니다. 그의 자리에는 메커니즘 자기 관심 시퀀스의 각 요소를 허용합니다. 다른 모든 요소를 직접 "보고", 없이 장기적인 종속성을 캡처합니다. 사라지는 그래디언트의 병목 현상.
Transformer는 도입 이후 NLP뿐만 아니라 지배적인 아키텍처가 되었습니다. (BERT, GPT, T5)뿐만 아니라 컴퓨터 비전(Vision Transformer), 오디오(Whisper) 및 이미지 생성(DALL-E, Stable Diffusion). 이 아키텍처를 이해하고 현대 딥 러닝 분야에 종사하는 모든 사람에게 필수적입니다.
무엇을 배울 것인가
- Self-Attention: 각 토큰이 시퀀스의 다른 토큰을 "보는" 방법
- 쿼리, 키, 가치: 주의의 메커니즘
- Multi-Head Attention: 다양한 패턴을 동시에 캡처
- 위치 인코딩: Transformer가 시퀀스 순서를 아는 방법
- 완전한 인코더-디코더 아키텍처
- BERT vs GPT: 인코더 전용 vs 디코더 전용
- Hugging Face Transformers를 사용한 실제 구현
Self-Attention: 트랜스포머의 핵심
Il 자기 관심 (또는 인트라 어텐션)은 시퀀스의 각 위치를 허용합니다. 다른 모든 위치와 비교하여 관심의 가중치를 계산합니다. 이는 다음을 의미합니다. 문장에서 "은행"이라는 단어를 이해하면 모델이 이를 문맥에서 직접 볼 수 있습니다. "river"(강둑) 또는 "money"(은행 기관)와 같은 단어가 있습니다.
메커니즘은 각 토큰에 대해 계산된 세 가지 벡터를 기반으로 합니다.
- 쿼리(Q): "내가 무엇을 찾고 있는가"를 나타냅니다. 각 토큰이 다른 토큰에게 묻는 질문입니다.
- 키(K): "내가 제공하는 것"을 나타냅니다. 각 토큰이 표시되는 레이블입니다.
- 가치(V): "내 콘텐츠"를 나타냅니다 - 전달하려는 실제 정보
두 토큰 사이의 어텐션 점수와 첫 번째 쿼리와 두 번째 키 사이의 내적, 크기의 제곱근으로 정규화됩니다. 소프트맥스 이후에 이 점수는 i에 가중치를 둡니다. 출력을 생성하는 값입니다.
import torch
import torch.nn as nn
import math
class ScaledDotProductAttention(nn.Module):
"""Scaled Dot-Product Attention: Attention(Q, K, V)"""
def __init__(self, d_k):
super().__init__()
self.scale = math.sqrt(d_k)
def forward(self, query, key, value, mask=None):
# query, key, value: (batch, seq_len, d_k)
scores = torch.matmul(query, key.transpose(-2, -1)) / self.scale
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf'))
attention_weights = torch.softmax(scores, dim=-1)
output = torch.matmul(attention_weights, value)
return output, attention_weights
# Esempio
batch_size, seq_len, d_model = 2, 10, 64
Q = torch.randn(batch_size, seq_len, d_model)
K = torch.randn(batch_size, seq_len, d_model)
V = torch.randn(batch_size, seq_len, d_model)
attention = ScaledDotProductAttention(d_k=d_model)
output, weights = attention(Q, K, V)
print(f"Output: {output.shape}") # [2, 10, 64]
print(f"Weights: {weights.shape}") # [2, 10, 10]
다중 헤드 주의
단일 주의 메커니즘은 토큰 간의 한 가지 유형의 관계만 캡처합니다. 거기 다중 헤드 주의 여러 예측을 병행하여 주의를 수행합니다. 선형(헤드)을 통해 모델이 구문 관계를 동시에 포착할 수 있습니다. 의미론적, 위치적, 상호참조.
각 헤드는 임베딩 공간의 하위 차원에서 작동합니다. d_model=512이고 다음과 같습니다. 8개의 헤드, 각 헤드는 d_k=64 차원에서 작동합니다. 결과는 연결되어 투영됩니다. 최종 선형변환을 통해
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
assert d_model % num_heads == 0
self.d_model = d_model
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.W_o = nn.Linear(d_model, d_model)
def forward(self, query, key, value, mask=None):
batch_size = query.size(0)
# Proiezioni lineari e split in heads
Q = self.W_q(query).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
K = self.W_k(key).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
V = self.W_v(value).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
# Scaled dot-product attention
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf'))
attn = torch.softmax(scores, dim=-1)
context = torch.matmul(attn, V)
# Concatena heads e proiezione finale
context = context.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)
return self.W_o(context)
mha = MultiHeadAttention(d_model=512, num_heads=8)
x = torch.randn(4, 20, 512) # batch=4, seq=20, dim=512
output = mha(x, x, x)
print(f"MHA output: {output.shape}") # [4, 20, 512]
위치 인코딩
토큰을 순차적으로 처리하는 RNN과 달리 Transformer는 모든 토큰을 처리합니다. 토큰을 병렬로 사용합니다. 위치 정보가 없으면 모델은 시퀀스를 다음과 같이 처리합니다. 정렬되지 않은 세트. 그만큼 위치 인코딩 위치 정보를 추가합니다 임베딩에 있는 각 토큰의
원본 논문은 각 차원에 대해 서로 다른 주파수를 갖는 정현파 함수를 사용합니다. 이 이 방식은 훈련 중에 보이는 것보다 더 긴 시퀀스로 일반화할 수 있다는 장점이 있습니다. 사인과 코사인 함수는 주기적이기 때문입니다.
Transformer가 RNN보다 나은 이유
세 가지 주요 이점: (1) 병렬화 - 모든 토큰이 처리됩니다. 동시에 GPU를 최대한 활용합니다. (2) 장기 중독 - 각 토큰은 순차적 전파 없이 다른 토큰을 직접 "볼" 수 있습니다. (3) 확장성 - 아키텍처는 수십억 개의 매개변수로 효과적으로 확장됩니다. (GPT-3: 175B, GPT-4: ~1.8T 추정) 이는 RNN으로는 불가능합니다.
인코더-디코더 아키텍처
원래 Transformer에는 아키텍처가 있습니다. 인코더-디코더:
- 인코더: 6개의 동일한 레이어, 각각은 Multi-Head Self-Attention + Feed-Forward Network를 가지며 레이어 정규화 및 잔여 연결로 구분됩니다. 전체 입력 처리
- 디코더: Masked Self-Attention(미래 토큰을 확인하지 않음), Cross-Attention(인코더 출력을 확인함) 및 Feed-Forward Network가 포함된 6개의 동일한 레이어. 자동 회귀적으로 출력 생성
BERT 대 GPT: 두 가지 철학
BERT(인코더 전용)
버트 (변환기의 양방향 인코더 표현)은 인코더만 사용합니다. 사전 훈련 중에 토큰의 15%를 무작위로 마스크하고 예측합니다(Masked Language Modeling). 양방향 표현을 학습합니다. 이해력 과제에 탁월함: 분류, NER, 질문 답변.
GPT(디코더 전용)
GPT (Generative Pre-trained Transformer)는 주의가 가려진 디코더만 사용합니다. 다음 토큰(인과 언어 모델링)을 예측하도록 사전 훈련되어 생성에 탁월합니다. 텍스트. GPT-3 및 GPT-4는 규모가 증가함에 따라 새로운 기능을 보여주었습니다.
from transformers import pipeline, AutoTokenizer, AutoModel
# Sentiment analysis con pipeline Hugging Face
classifier = pipeline("sentiment-analysis")
result = classifier("This movie was absolutely fantastic!")
print(result) # [{'label': 'POSITIVE', 'score': 0.9998}]
# Text generation con GPT-2
generator = pipeline("text-generation", model="gpt2")
text = generator("Deep learning is", max_length=50, num_return_sequences=1)
print(text[0]['generated_text'])
# BERT embeddings per downstream tasks
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModel.from_pretrained("bert-base-uncased")
inputs = tokenizer("The transformer architecture is revolutionary",
return_tensors="pt")
outputs = model(**inputs)
# outputs.last_hidden_state: (1, seq_len, 768)
cls_embedding = outputs.last_hidden_state[:, 0, :] # CLS token
print(f"CLS embedding: {cls_embedding.shape}") # [1, 768]
ViT(Vision Transformer) 및 그 이상
NLP에서 Transformers의 성공은 다른 영역에서의 적용에 영감을 주었습니다. 그만큼 비전 트랜스포머(ViT) 이미지를 패치(일반적으로 16x16)로 나눕니다. 이를 토큰으로 처리하고 표준 Transformer 아키텍처를 적용합니다. 놀랍게도 ViT는 대규모 데이터 세트에서 CNN을 사용하여 경쟁력 있는 성능을 달성하고 사전 훈련된 경우보다 뛰어난 성능을 발휘합니다. 대규모 데이터세트에 대해
오늘날 Transformers는 언어 모델(GPT-4, Claude, Llama), 생성의 기초입니다. 이미지(DALL-E, Stable Diffusion), 음성인식(Whisper), 로봇공학(RT-2) 및 다중 모드 모델(GPT-4V, Gemini). 건축은 다음과 같은 것으로 입증되었습니다. 유니버설 재단 현대 인공지능을 위한
시리즈의 다음 단계
- 다음 기사에서는 GAN(생성적 적대 네트워크)
- 두 경쟁 네트워크가 어떻게 현실적인 합성 데이터를 생성하는지 살펴보겠습니다.
- DCGAN, StyleGAN 및 적대적 훈련의 과제를 분석합니다.







