Deep Learning study
Self‑Attention 심층 분석: 수식·구현·튜닝 본문
Self‑Attention 심층 분석: 수식·구현·튜닝
포스트 요약: Transformer 기반 모델의 핵심 구성 요소인 Self‑Attention 메커니즘을 수학적으로 유도하고, PyTorch 구현 예제와 함께 주요 하이퍼파라미터(머리 수, 차원, 드롭아웃) 튜닝 팁을 상세히 살펴봅니다.
1. 서론
Self‑Attention은 입력 시퀀스 내 모든 위치가 서로를 참조하여 가중합을 계산하는 연산으로, 긴 거리 종속성(long‑range dependency)을 효과적으로 학습합니다. Vaswani et al.(2017)의 “Attention Is All You Need”에서 제시된 이 메커니즘은 이후 BERT, GPT, ViT 등 대부분의 최신 모델에 적용되었습니다[1].
2. 수식 유도
2.1 Scaled Dot‑Product Attention
쿼리(\(Q\)), 키(\(K\)), 값(\(V\)) 행렬에 대해 각 쿼리 \(q\)와 키 \(k\)의 내적을 통해 유사도를 계산하고, 값 벡터를 가중합합니다:
\[ \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\!\Bigl(\frac{QK^\top}{\sqrt{d_k}}\Bigr)\,V \]
- \(d_k\): 키 차원, 스케일링을 통해 큰 내적 값으로 인한 softmax 포화 방지
- softmax 출력은 각 쿼리에 대한 키별 확률 분포
2.2 Multi‑Head Attention
여러 개의 Attention “머리(head)”를 병렬로 수행해 다양한 표현(subspace)을 학습합니다:
\[ \mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(\mathrm{head}_1,\dots,\mathrm{head}_h)\,W^O, \quad \mathrm{head}_i=\mathrm{Attention}(QW^Q_i,KW^K_i,VW^V_i) \]
- \(W^Q_i,W^K_i,W^V_i\in\mathbb{R}^{d_\mathrm{model}\times d_k}\), \(W^O\in\mathbb{R}^{hd_k\times d_\mathrm{model}}\)
- 머리 수 \(h\)를 늘리면 표현 다양성↑, 연산 비용↑
3. PyTorch 구현 예제
import torch
import torch.nn as nn
class MultiHeadSelfAttention(nn.Module):
def __init__(self, d_model, num_heads, dropout=0.1):
super().__init__()
assert d_model % num_heads == 0
self.d_k = d_model // num_heads
self.h = num_heads
self.q_linear = nn.Linear(d_model, d_model)
self.k_linear = nn.Linear(d_model, d_model)
self.v_linear = nn.Linear(d_model, d_model)
self.dropout = nn.Dropout(dropout)
self.out = nn.Linear(d_model, d_model)
def forward(self, x, mask=None):
bs, seq_len, _ = x.size()
# 선형 변환 후 머리 분할
Q = self.q_linear(x).view(bs, seq_len, self.h, self.d_k).transpose(1,2)
K = self.k_linear(x).view(bs, seq_len, self.h, self.d_k).transpose(1,2)
V = self.v_linear(x).view(bs, seq_len, self.h, self.d_k).transpose(1,2)
# Scaled Dot-Product
scores = torch.matmul(Q, K.transpose(-2,-1)) / (self.d_k**0.5)
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf'))
attn = torch.softmax(scores, dim=-1)
attn = self.dropout(attn)
x = torch.matmul(attn, V)
# 머리 합치기
x = x.transpose(1,2).contiguous().view(bs, seq_len, self.h*self.d_k)
return self.out(x)
4. 하이퍼파라미터 튜닝 팁
| 파라미터 | 추천 값 | 영향 |
|---|---|---|
| 머리 수 (\(h\)) | 4~16 | 표현력↑ vs 연산 비용↑ |
| 키/쿼리 차원 (\(d_k\)) | 64~128 | 스케일 안정성, 메모리 사용량 |
| 드롭아웃 | 0.1~0.3 | 과적합 방지 |
| 마스크 적용 | padding mask | 패딩 토큰 무시 |
- 큰 배치 크기(≥32)에서 안정적인 학습
- 학습률 warm‑up 후 cosine decay 권장[2]
- LayerNorm 후 Self‑Attention vs 전 위치 차이 실험
5. 실습 과제
- BERT‑base(12 heads, d_k=64) vs 작은 모델(4 heads, d_k=32) 비교
- mask vs no‑mask 성능 차이 실험(seq2seq 번역 태스크)
- Attention weight 시각화(heatmap) 및 해석
'AI > Deep learning 을 위한 지식' 카테고리의 다른 글
| Self‑Supervised Learning(SSL) 심층 가이드: Contrastive vs Generative (0) | 2025.04.18 |
|---|---|
| 컨볼루션 신경망(CNN) 심층 분석: 수식·구현·최신 트릭 (0) | 2025.04.18 |
| 배치 정규화(Batch Normalization) 심층 분석: 수학적 유도부터 구현·튜닝까지 (0) | 2025.04.18 |
| GPU 메모리·연산 효율 최적화 완전 가이드 (0) | 2025.04.18 |
| 전이 학습(Transfer Learning) 심층 가이드: 이론부터 도메인 적응까지 (0) | 2025.04.18 |