본문 바로가기
C.W.K.
Stream
Lesson 12 of 12 · published

Transformer 블록

~22 min · transformer, blocks, ffn

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

Transformer는 거의 같은 블록을 반복해서 쌓는다

모든 Transformer 블록에는 두 개의 하위층이 있어. 하나는 멀티헤드 셀프 어텐션이고, 다른 하나는 위치별 피드포워드 신경망이야. 위치별 피드포워드 신경망은 각 위치에 독립적으로 적용되는 작은 MLP다. 두 하위층은 모두 잔차 연결과 층 정규화로 감싸.

구조는 이게 전부야. 블록을 12개 쌓으면 작은 Transformer인 BERT-base가 되고, 96개 쌓으면 최전선 LLM이 돼. 입력에는 임베딩 층을 두고, 출력에는 LM 헤드나 분류기를 붙여. 모델이 토큰 순서를 알 수 있도록 위치 인코딩도 추가해.

팁: Transformer 블록을 머릿속에서 그릴 수 있으면 모든 현대 LLM 논문을 읽을 수 있어. 잔차 연결 + LN, 어텐션, 잔차 연결 + LN, FFN 순서만 기억하면 돼. RMSNorm, rotary 위치 임베딩, GLU 활성화, 전문가 혼합 같은 아키텍처 변형도 모두 이 기본 부품을 다른 것으로 교체한 거야.

위치 인코딩

셀프 어텐션 자체는 순열 불변이야. 모델에 순서 감각을 주려면 토큰 임베딩에 위치 정보를 더해야 해. 원래 Transformer는 sinusoidal 인코딩을 사용했고, 현대 LLM은 RoPE를 사용해. RoPE는 query/key projection 자체에 위치 정보를 통합해서 어떤 문맥 길이에서도 상대 위치를 추론할 수 있게 해.

어텐션을 구성하는 세 가지 방식

  • 인코더 (BERT, ViT) — 양방향 셀프 어텐션을 사용해서 모든 토큰이 다른 모든 토큰에 주목해. 분류, 검색, 임베딩에 사용해.
  • 디코더 (GPT, LLaMA) — triangular mask를 적용한 causal 셀프 어텐션을 사용해서 각 토큰이 자기 자신과 이전 토큰에만 주목해. 생성에 사용해.
  • 인코더-디코더 (T5, BART) — 두 구조를 모두 사용하고, 디코더가 인코더를 참조하는 cross-어텐션도 추가해. 번역, 요약, 텍스트 변환 과제에 사용해.
원칙: 현대 Transformer는 대부분 하나의 블록을 변형한 구조야. 임베딩 + 위치 인코딩 + N×(LayerNorm + 어텐션 + LayerNorm + 잔차 연결이 있는 FFN) + 최종 norm + 헤드로 이어지는 구조를 깊이 익혀. 그러면 Hugging Face의 모든 모델 카드를 읽을 수 있어.

Code

사전 정규화 Transformer 블록·python
import torch
import torch.nn as nn

class TransformerBlock(nn.Module):
    def __init__(self, d_model=512, n_heads=8, d_ff=2048, dropout=0.1):
        super().__init__()
        self.norm1 = nn.LayerNorm(d_model)
        self.attn  = nn.MultiheadAttention(d_model, n_heads, dropout=dropout,
                                           batch_first=True)
        self.norm2 = nn.LayerNorm(d_model)
        self.ffn   = nn.Sequential(
            nn.Linear(d_model, d_ff),
            nn.GELU(),
            nn.Dropout(dropout),
            nn.Linear(d_ff, d_model),
        )
        self.drop = nn.Dropout(dropout)

    def forward(self, x, attn_mask=None):
        # Pre-norm: norm before each sublayer, residual after
        h = self.norm1(x)
        x = x + self.drop(self.attn(h, h, h, attn_mask=attn_mask, need_weights=False)[0])
        h = self.norm2(x)
        x = x + self.drop(self.ffn(h))
        return x

External links

Exercise

위 블록을 쌓아서 2-블록 Transformer 인코더를 만들어. [B=2, T=16, d_model=128] 텐서를 순전파에 통과시키고 출력 형태를 확인해. 그다음 위치 0에 [CLS] 토큰을 추가하고, 해당 위치의 출력을 시퀀스 수준 임베딩으로 사용해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.