Deep Learning study

Self‑Attention 심층 분석: 수식·구현·튜닝 본문

AI/Deep learning 을 위한 지식

Self‑Attention 심층 분석: 수식·구현·튜닝

illinaire 2025. 4. 18. 12:27
반응형
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\)를 늘리면 표현 다양성↑, 연산 비용↑
Multi-Head Attention
Multi‑Head Attention 구조 (출처: Wikimedia Commons, Public Domain)

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. 실습 과제

  1. BERT‑base(12 heads, d_k=64) vs 작은 모델(4 heads, d_k=32) 비교
  2. mask vs no‑mask 성능 차이 실험(seq2seq 번역 태스크)
  3. Attention weight 시각화(heatmap) 및 해석

참고 문헌

  1. Vaswani, A. et al. (2017). Attention Is All You Need. NeurIPS. [PDF]
  2. Devlin, J. et al. (2019). BERT: Pre-training of Deep Bidirectional Transformers. NAACL. [PDF]
반응형
Comments