멀티헤드 자기어텐션

PyTorch로 배우는 Transformer 모델

James Chapman

Curriculum Manager, DataCamp

트랜스포머의 멀티헤드 어텐션

논문 ‘Attention Is All You Need’에 제시된 트랜스포머 아키텍처

PyTorch로 배우는 Transformer 모델

자기어텐션 메커니즘

자기어텐션 메커니즘 구조

PyTorch로 배우는 Transformer 모델

자기어텐션 메커니즘

자기어텐션 메커니즘 구조

  • Q: 각 토큰이 다른 토큰에서 무엇을 "찾는지" 표시
  • K: 각 토큰의 내용 표현
  • V: 집계/가중합할 실제 내용
PyTorch로 배우는 Transformer 모델

자기어텐션 메커니즘

자기어텐션 메커니즘 구조

  • Q: 각 토큰이 다른 토큰에서 무엇을 "찾는지" 표시
  • K: 각 토큰의 내용 표현
  • V: 집계/가중합할 실제 내용

 

  • 어텐션 점수: Q-K 유사도 → 도트 프로덕트
PyTorch로 배우는 Transformer 모델

자기어텐션 메커니즘

자기어텐션 메커니즘 구조

  • Q: 각 토큰이 다른 토큰에서 무엇을 "찾는지" 표시
  • K: 각 토큰의 내용 표현
  • V: 집계/가중합할 실제 내용

 

  • 어텐션 점수: Q-K 유사도 → 도트 프로덕트
  • 어텐션 가중치: softmax 스케일링
PyTorch로 배우는 Transformer 모델

자기어텐션 메커니즘

자기어텐션 메커니즘 구조

  • 어텐션 점수: Q-K 유사도 → 도트 프로덕트
  • 어텐션 가중치: softmax 스케일링

 

Orange is my favorite fruit
Query: Orange
Attention weights: .21 .03 .05 .31 .40
PyTorch로 배우는 Transformer 모델

자기어텐션 메커니즘

자기어텐션 메커니즘 구조

  • 어텐션 점수: Q-K 유사도 → 도트 프로덕트
  • 어텐션 가중치: softmax 스케일링

 

Orange is my favorite fruit
Query: Orange
Attention weights: .21 .03 .05 .31 .40
PyTorch로 배우는 Transformer 모델

자기어텐션 메커니즘

자기어텐션 메커니즘 구조

  • 어텐션 점수: Q-K 유사도 → 도트 프로덕트
  • 어텐션 가중치: softmax 스케일링

 

Orange is my favorite fruit
Query: Orange
Attention weights: .21 .03 .05 .31 .40
PyTorch로 배우는 Transformer 모델

멀티헤드 어텐션

멀티헤드 자기어텐션

PyTorch로 배우는 Transformer 모델

멀티헤드 어텐션

멀티헤드 자기어텐션

PyTorch로 배우는 Transformer 모델

멀티헤드 어텐션

멀티헤드 자기어텐션

PyTorch로 배우는 Transformer 모델
import torch.nn as nn
import torch.nn.functional as F

class MultiHeadAttention(nn.Module):

def __init__(self, d_model, num_heads): super().__init__()
assert d_model % num_heads == 0, "d_model must be divisible by num_heads."
self.num_heads = num_heads self.d_model = d_model self.head_dim = d_model // num_heads
self.query_linear = nn.Linear(d_model, d_model, bias=False) self.key_linear = nn.Linear(d_model, d_model, bias=False) self.value_linear = nn.Linear(d_model, d_model, bias=False)
self.output_linear = nn.Linear(d_model, d_model)
  • num_heads: 어텐션 헤드 수, 각 헤드는 head_dim 크기 임베딩 처리
  • bias=False: 성능 영향 없이 복잡도 감소(입력에만 적용)
PyTorch로 배우는 Transformer 모델
    def split_heads(self, x, batch_size):

seq_length = x.size(1) x = x.reshape(batch_size, seq_length, self.num_heads, self.head_dim) return x.permute(0, 2, 1, 3)
def compute_attention(self, query, key, value, mask=None):
scores = torch.matmul(query, key.transpose(-2, -1)) / (self.head_dim ** 0.5)
if mask is not None: scores = scores.masked_fill(mask == 0, float('-inf'))
attention_weights = F.softmax(scores, dim=-1) return torch.matmul(attention_weights, value)
def combine_heads(self, x, batch_size):
x = x.permute(0, 2, 1, 3).contiguous() return x.view(batch_size, -1, self.d_model)
  • compute_attention(): F.softmax()으로 어텐션 가중치 계산
  • torch.matmul(attention_weights, value): 값의 가중합
PyTorch로 배우는 Transformer 모델
    def forward(self, query, key, value, mask=None):
        batch_size = query.size(0)

        query = self.split_heads(self.query_linear(query), batch_size)
        key = self.split_heads(self.key_linear(key), batch_size)
        value = self.split_heads(self.value_linear(value), batch_size)

        attention_weights = self.compute_attention(query, key, value, mask)


output = self.combine_heads(attention_weights, batch_size)
return self.output_linear(output)
  • self.output_linear(): 헤드 출력을 연결해 투영
PyTorch로 배우는 Transformer 모델

Vamos praticar!

PyTorch로 배우는 Transformer 모델

Preparing Video For Download...