Encoder-Decoder 구조: 번역에서 요약까지

트랜스포머의 완전한 Encoder-Decoder 아키텍처가 어떻게 소스 시퀀스를 타깃 시퀀스로 변환하는지, Cross-Attention의 역할과 대표 모델(T5, BART)을 중심으로 설명한다.

· 5 min read · PALDYN Team

지난 글에서 디코더 블록의 세 서브레이어와 자기 회귀 생성 방식을 살펴봤다. 이제 인코더와 디코더가 어떻게 하나의 완성된 시스템을 이루는지, 그리고 어떤 태스크에 이 구조가 적합한지 큰 그림을 그려 보자.

Seq2Seq 문제

시퀀스-투-시퀀스(Seq2Seq) 는 가변 길이의 입력을 가변 길이의 출력으로 변환하는 문제다. 기계 번역, 문서 요약, 코드 생성, 대화 생성 등이 모두 이 범주에 속한다. 과거에는 RNN 기반 Seq2Seq가 표준이었지만, 트랜스포머가 RNN의 순차 처리 병목과 장거리 의존성 문제를 동시에 해결하며 새로운 기준이 됐다.

Encoder-Decoder 전체 구조

Encoder-Decoder 전체 구조

전체 흐름은 다음과 같다.

  1. Encoder — 소스 시퀀스를 받아 (src_len × d_model) 크기의 문맥 표현을 생성.
  2. Cross-Attention — 인코더 출력을 K, V로 디코더에 공급. 디코더가 소스의 어느 부분에 집중할지 학습.
  3. Decoder — 이미 생성한 타깃 토큰을 조건으로 다음 토큰의 확률 분포를 출력.
  4. Linear + Softmax — 디코더 출력을 어휘 크기의 확률 벡터로 변환.

Cross-Attention이 핵심 연결 고리

인코더-디코더를 단순히 이어 붙인 것과 트랜스포머가 다른 점은 Cross-Attention의 존재다. 각 디코더 레이어가 인코더 출력 전체를 매 스텝마다 참조할 수 있어, 소스의 관련 부분에 동적으로 집중한다.

# PyTorch: 완전한 Encoder-Decoder
import torch.nn as nn

class Seq2SeqTransformer(nn.Module):
    def __init__(self, src_vocab, tgt_vocab, d_model=512,
                 n_heads=8, n_enc=6, n_dec=6, d_ff=2048):
        super().__init__()
        self.src_emb = nn.Embedding(src_vocab, d_model)
        self.tgt_emb = nn.Embedding(tgt_vocab, d_model)
        self.transformer = nn.Transformer(
            d_model=d_model, nhead=n_heads,
            num_encoder_layers=n_enc,
            num_decoder_layers=n_dec,
            dim_feedforward=d_ff,
            batch_first=True,
        )
        self.out_proj = nn.Linear(d_model, tgt_vocab)

    def forward(self, src, tgt, tgt_mask, src_padding_mask, tgt_padding_mask):
        src = self.src_emb(src)   # + PE 생략 (별도 적용)
        tgt = self.tgt_emb(tgt)
        out = self.transformer(
            src, tgt,
            tgt_mask=tgt_mask,
            src_key_padding_mask=src_padding_mask,
            tgt_key_padding_mask=tgt_padding_mask,
        )
        return self.out_proj(out)  # (batch, tgt_len, vocab)

학습: Teacher Forcing + Cross-Entropy

학습 시 정답 타깃 시퀀스를 한 칸 오른쪽으로 밀어 디코더에 입력하고(<BOS> w1 w2 ... wN), 예측 결과와 w1 w2 ... wN <EOS>를 비교해 Cross-Entropy 손실을 계산한다. Causal Mask 덕분에 전체 타깃 시퀀스를 한 번에 병렬로 처리할 수 있다.

대표 모델

모델공개특징
T52019 (Google)모든 NLP 태스크를 텍스트→텍스트로 통일
BART2019 (Meta)노이즈 추가 후 복원 방식 사전학습
mBART2020 (Meta)다국어 BART
PEGASUS2020 (Google)문장 추출 기반 사전학습, 요약 특화

Encoder-Decoder vs 다른 아키텍처

Encoder-Decoder 적용 태스크

아키텍처대표 모델적합 태스크
Encoder-onlyBERT분류, NER, 감성 분석
Decoder-onlyGPT텍스트 생성, 챗봇
Encoder-DecoderT5, BART번역, 요약, 조건부 생성

최근 Decoder-only LLM이 프롬프트만으로 번역·요약까지 수행하면서 Encoder-Decoder의 독점적 지위가 약해졌다. 하지만 동일 파라미터 대비 조건부 생성 효율은 Encoder-Decoder가 여전히 우위에 있다.

정리

  • Encoder-Decoder = 소스 이해(인코더) + 타깃 생성(디코더), Cross-Attention으로 연결
  • Cross-Attention이 소스의 어디를 볼지 동적으로 결정 — 자동 정렬(alignment) 역할
  • Teacher Forcing으로 학습 병렬화, 추론은 자기 회귀
  • T5·BART 등 Seq2Seq 태스크의 핵심 아키텍처

지난 글: Transformer Decoder: 문장을 생성하는 블록

다음 글: Masking: 트랜스포머의 정보 차단 전략


읽어주셔서 감사합니다. 😊