인코더 트랜스포머

PyTorch로 배우는 Transformer 모델

James Chapman

Curriculum Manager, DataCamp

원래 트랜스포머

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

PyTorch로 배우는 Transformer 모델

원래 트랜스포머

원래 트랜스포머 아키텍처

PyTorch로 배우는 Transformer 모델

인코더 전용 트랜스포머

인코더 전용 트랜스포머 아키텍처

트랜스포머 본체: N개의 인코더 레이어로 구성된 인코더 스택

인코더 레이어

  • 멀티헤드 자기어텐션
  • 피드포워드 (서브)레이어
  • 레이어 정규화, 드롭아웃

트랜스포머 헤드

PyTorch로 배우는 Transformer 모델

인코더 전용 트랜스포머

인코더 전용 트랜스포머 아키텍처

트랜스포머 본체: N개의 인코더 레이어로 구성된 인코더 스택

인코더 레이어

  • 멀티헤드 자기어텐션
  • 피드포워드 (서브)레이어
  • 레이어 정규화, 드롭아웃

트랜스포머 헤드: 인코딩된 입력을 처리해 예측값 생성

지도학습 과제: 분류, 회귀

PyTorch로 배우는 Transformer 모델

인코더 계층의 피드포워드 서브레이어

어텐션 이후의 피드포워드 서브레이어

class FeedForwardSubLayer(nn.Module):
    def __init__(self, d_model, d_ff):
        super().__init__()
        self.fc1 = nn.Linear(d_model, d_ff)
        self.fc2 = nn.Linear(d_ff, d_model)
        self.relu = nn.ReLU()


def forward(self, x): return self.fc2(self.relu(self.fc1(x)))

완전연결 x 2 + ReLU 활성화

  • d_ff: 선형 계층 사이의 차원

  • forward(): 어텐션 출력을 처리해 비선형 패턴을 포착

PyTorch로 배우는 Transformer 모델

인코더 레이어

class EncoderLayer(nn.Module):
    def __init__(self, d_model, num_heads, d_ff, dropout):
        super().__init__()
        self.self_attn = MultiHeadAttention(d_model, num_heads)
        self.ff_sublayer = FeedForwardSubLayer(d_model, d_ff)

self.norm1 = nn.LayerNorm(d_model) self.norm2 = nn.LayerNorm(d_model) self.dropout = nn.Dropout(dropout)
def forward(self, x, src_mask): attn_output = self.self_attn(x, x, x, src_mask) x = self.norm1(x + self.dropout(attn_output)) ff_output = self.ff_sublayer(x) x = self.norm2(x + self.dropout(ff_output)) return x

인코더 레이어

  • 멀티헤드 자기어텐션
  • 피드포워드 서브레이어
  • 레이어 정규화와 드롭아웃

forward():

  • mask는 패딩 토큰 처리를 막음
PyTorch로 배우는 Transformer 모델

어텐션 과정 마스킹

패딩 시퀀스

자기어텐션의 패딩 마스크

PyTorch로 배우는 Transformer 모델

인코더 트랜스포머 본체

class TransformerEncoder(nn.Module):
    def __init__(self, vocab_size, d_model, num_layers, num_heads, d_ff, dropout, max_seq_length):
        super().__init__()

self.embedding = InputEmbeddings(vocab_size, d_model)
self.positional_encoding = PositionalEncoding(d_model, max_seq_length)
self.layers = nn.ModuleList( [EncoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)] )
def forward(self, x, src_mask): x = self.embedding(x) x = self.positional_encoding(x) for layer in self.layers: x = layer(x, src_mask) return x
PyTorch로 배우는 Transformer 모델

인코더 트랜스포머 헤드

class ClassifierHead(nn.Module):
    def __init__(self, d_model, num_classes):
        super().__init__()
        self.fc = nn.Linear(d_model, num_classes)

    def forward(self, x):
        logits = self.fc(x)
        return F.log_softmax(logits, dim=-1)
class RegressionHead(nn.Module):
    def __init__(self, d_model, output_dim):
        super().__init__()
        self.fc = nn.Linear(d_model, output_dim)

    def forward(self, x):
        return self.fc(x)

분류 헤드

  • 과제: 텍스트 분류, 감성 분석, NER, 추출형 QA 등
  • fc: 완전연결 선형 계층
    • 인코더 은닉 상태를 num_classes 클래스 확률로 변환

회귀 헤드

  • 과제: 가독성, 언어 복잡도 추정 등
    • 단일 수치 예측 시 output_dim = 1
PyTorch로 배우는 Transformer 모델

연습해 봅시다!

PyTorch로 배우는 Transformer 모델

Preparing Video For Download...