인코더(Encoder)는 이해하고, 디코더(Decoder)는 생성합니다. 둘을 다시 합치면 번역(translate), 요약(summarize), 재작성(rewrite), 전사(transcribe)처럼 입력 → 출력(input → output) 형태의 과제에 맞는 모델이 됩니다.
유형: Learn
언어: Python
선수 지식: Phase 7 · 05 (Full Transformer), Phase 7 · 06 (BERT), Phase 7 · 07 (GPT)
예상 시간: 약 45분
문제
디코더 전용(decoder-only)인 GPT와 인코더 전용(encoder-only)인 BERT는 2017년에 발표된 본래의 트랜스포머(Transformer) 구조를 각각의 목표에 맞게 일부만 떼어 낸 형태입니다. 하지만 실제 많은 과제는 본질적으로 입력-출력(input-output) 구조를 가집니다.
번역(Translation): 영어(English) → 프랑스어(French).
요약(Summarization): 5,000 토큰 분량의 글 → 200 토큰 분량의 요약.
음성 인식(Speech recognition): 오디오 토큰 → 텍스트 토큰.
구조화 추출(Structured extraction): 산문(prose) → JSON.
이런 과제에는 인코더-디코더(encoder-decoder) 구조가 가장 깔끔하게 들어맞습니다. 인코더는 원본 입력(source)의 밀집 표현(dense representation)을 만들어 두고, 디코더는 매 단계 그 표현을 교차 참조(cross-attend)하며 출력을 생성합니다. 학습은 출력 쪽에서 한 칸씩 미는 시프트 바이 원(shift-by-one) 방식이고, 손실 함수(loss)는 GPT와 동일하지만 인코더 출력에 조건화(conditioned)되어 있습니다.
다음 두 논문이 현대적인 인코더-디코더 활용 방식을 정의했습니다.
T5 (Raffel et al. 2019). "Text-to-Text Transfer Transformer." 모든 자연어 처리 과제를 텍스트 입력, 텍스트 출력(text-in, text-out)으로 재구성했습니다. 하나의 구조, 하나의 어휘(vocabulary), 하나의 손실 함수만으로 처리합니다. 사전학습(pretrain)은 마스크된 구간 예측(masked span prediction)으로 진행하며, 입력에서 일부 구간(span)을 훼손한 뒤 출력에서 그 구간을 복원하도록 학습합니다.
BART (Lewis et al. 2019). "Bidirectional and Auto-Regressive Transformer." 잡음 제거 오토인코더(denoising autoencoder)입니다. 입력을 섞기(shuffle), 마스킹(mask), 삭제(delete), 회전(rotate) 등 여러 방식으로 훼손한 다음, 디코더가 원본을 복원하도록 학습합니다.
2026년에도 입력 구조 자체가 중요한 영역에서는 인코더-디코더 형식이 여전히 살아 있습니다.
Whisper(음성 → 텍스트).
Google의 번역 스택.
문맥과 수정(context-and-edit)이 분명히 구분되는 일부 코드 자동완성/수정 모델.
구조화된 추론 과제(structured reasoning)에 쓰이는 Flan-T5와 그 변형들.
디코더 전용 구조가 주목을 가져갔지만, 인코더-디코더 구조 역시 사라지지 않았습니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.명확한 입력-출력 매핑이 있는 과제(예: 번역)에서 인코더-디코더(encoder-decoder) 트랜스포머가 디코더 전용(decoder-only) 모델보다 가진 구조적 장점은 무엇인가요?
2.T5는 모든 자연어 처리 과제를 '텍스트-투-텍스트(text-to-text)'로 재구성했습니다. 이것이 중요한 설계 선택이었던 이유는 무엇인가요?
여기서 중요한 점은 인코더가 입력당 한 번만 실행된다는 것입니다. 디코더는 자기회귀적(autoregressive)으로 단계마다 실행되지만, 매 단계 동일한 인코더 출력을 교차 참조합니다. 따라서 긴 입력에서는 인코더 출력 캐싱(encoder output caching)만으로도 거의 공짜에 가까운 속도 향상을 얻을 수 있습니다.
T5 사전학습 — 구간 훼손(span corruption)
입력에서 무작위 구간을 고릅니다. 평균 길이는 3토큰이고, 전체 토큰의 약 15%가 대상이 됩니다. 고른 각 구간을 고유한 센티넬 토큰(sentinel token)인 <extra_id_0>, <extra_id_1> 등으로 바꿉니다. 디코더는 훼손된 구간만 센티넬 접두사와 함께 출력합니다.
source: The quick <extra_id_0> fox jumps <extra_id_1> dog
target: <extra_id_0> brown <extra_id_1> over the lazy
전체 시퀀스를 예측하는 것보다 학습 신호가 가볍습니다. T5 논문의 비교 실험(ablation)에서는 BERT가 사용한 MLM이나 UniLM의 prefix-LM과도 충분히 경쟁력 있는 결과를 보였습니다.
BART 사전학습 — 다중 잡음 제거(multi-noise denoising)
BART는 다섯 가지 잡음 함수(noising function)를 시도했습니다.
토큰 마스킹(Token masking).
토큰 삭제(Token deletion).
텍스트 채워넣기(Text infilling). 한 구간을 가린 뒤 디코더가 알맞은 길이와 내용을 채워 넣게 합니다.
문장 순서 섞기(Sentence permutation).
문서 회전(Document rotation).
이 가운데 텍스트 채워넣기와 문장 순서 섞기를 함께 적용한 조합이 다운스트림(downstream) 과제에서 가장 좋은 수치를 냈습니다. 디코더는 언제나 원본 전체를 복원합니다. BART의 출력은 훼손된 구간만이 아니라 전체 시퀀스이므로, 사전학습에 드는 연산량은 T5보다 더 큽니다.
추론(Inference)
GPT와 동일한 자기회귀 생성(autoregressive generation) 방식을 사용합니다. 그리디 탐색(greedy), 빔 서치(beam search), 누클리어스 샘플링(top-p sampling)이 모두 그대로 적용됩니다. 번역과 요약에서는 출력 분포가 채팅보다 좁기 때문에, 보통 너비(width) 4~5의 빔 서치가 표준으로 쓰입니다.
2026년에 어떤 변형을 고를까
과제(Task)
인코더-디코더 사용?
이유
번역(Translation)
보통 그렇습니다
원본 시퀀스가 명확하고 출력 분포가 좁아 빔 서치가 잘 작동합니다
음성-텍스트(Speech-to-text)
그렇습니다 (Whisper)
입력 모달리티(modality)가 출력과 달라, 인코더가 오디오 특징을 정돈해 줍니다
채팅/추론(Chat / reasoning)
아닙니다, 디코더 전용
별도의 지속적인 "입력"이 없고 대화 자체가 하나의 시퀀스입니다
코드 자동완성(Code completion)
보통 아닙니다
긴 문맥에 강한 디코더 전용이 유리하며, Qwen 2.5 Coder 같은 코드 모델도 디코더 전용입니다
요약(Summarization)
둘 다 가능합니다
BART, PEGASUS가 과거 디코더 전용 기준선을 앞섰지만 최신 디코더 전용 LLM도 비슷한 성능을 냅니다
구조화 추출(Structured extraction)
둘 다 가능합니다
T5는 "텍스트 → 텍스트" 형식으로 어떤 출력 포맷도 깔끔하게 흡수합니다
2022년 이후의 큰 흐름은 디코더 전용 구조가 인코더-디코더가 차지하던 영역까지 가져가는 방향입니다. 그 이유는 (a) 지시 학습된(instruction-tuned) 디코더 전용 LLM이 프롬프트만으로 거의 모든 과제에 일반화되고, (b) 두 개의 스택보다 하나의 구조가 스케일링하기 더 쉽고, (c) RLHF 자체가 디코더 구조를 전제로 하기 때문입니다. 그럼에도 인코더-디코더는 입력 모달리티가 출력과 다르거나(음성, 이미지) 빔 서치 품질이 결정적인 영역에서 자리를 지키고 있습니다.
직접 만들기
code/main.py를 봅니다. 작은 장난감 말뭉치에 T5 스타일의 구간 훼손을 구현합니다. 이 lesson에서 가장 쓸모 있는 한 조각이며, 이후 등장한 거의 모든 인코더-디코더 사전학습 레시피에서 같은 패턴이 반복되어 나타납니다.
Step 1: 구간 훼손(span corruption)
defcorrupt_spans(tokens, mask_rate=0.15, mean_span=3.0, rng=None):
"""전체 토큰의 약 mask_rate에 해당하는 길이만큼 구간을 고른다. (corrupted_input, target)을 반환한다."""
n = len(tokens)
n_mask = max(1, int(n * mask_rate))
n_spans = max(1, int(round(n_mask / mean_span)))
...
타깃의 형식은 T5의 관례인 <sent0> span0 <sent1> span1 ...을 따릅니다. 훼손된 입력은 바뀌지 않은 토큰들과, 구간이 있던 위치의 센티넬 토큰을 번갈아 끼워 넣은 형태입니다.
Step 2: 왕복 검증(round-trip 검증)
훼손된 입력과 타깃이 주어졌을 때 원래 문장을 복원해 봅니다. 훼손이 가역적이라면 순방향 흐름이 잘 정의되어 있다는 뜻입니다. 실제 학습 과정에서는 이런 검증을 하지 않지만, 비용이 거의 들지 않는 점검이라 구간 처리에서 흔히 생기는 오프바이원(off-by-one) 버그를 잡는 데 유용합니다.
Step 3: BART 잡음 함수(BART noising)
다음 다섯 함수를 만듭니다. token_mask, token_delete, text_infill, sentence_permute, document_rotate. 이 가운데 두 개를 합성해 결과를 확인해 봅니다.
사용해보기
HuggingFace의 참고 구현은 다음과 같습니다.
from transformers import T5ForConditionalGeneration, T5Tokenizer
tok = T5Tokenizer.from_pretrained("google/flan-t5-base")
model = T5ForConditionalGeneration.from_pretrained("google/flan-t5-base")
inputs = tok("translate English to French: Attention is all you need.", return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=32)
print(tok.decode(out[0], skip_special_tokens=True))
T5의 핵심 기법은 과제 이름을 입력 텍스트 안에 함께 넣는 것입니다. 모든 과제가 텍스트 입력, 텍스트 출력 형태로 통일되기 때문에 같은 모델이 수십 가지 과제를 동시에 처리할 수 있습니다. 2026년에는 지시 학습된 디코더 전용 모델들이 이 패턴을 더 일반화했지만, 이 흐름을 처음 체계화한 것은 T5였습니다.
산출물 만들기
outputs/skill-seq2seq-picker.md를 봅니다. 이 스킬(skill)은 입력-출력 구조, 지연 시간(latency), 품질 목표를 받아 새로운 과제에 인코더-디코더와 디코더 전용 중 무엇을 선택할지 결정해 줍니다.
연습문제
쉬움.code/main.py를 실행해 30토큰 문장에 구간 훼손을 적용한 뒤, 센티넬이 아닌 원본 토큰과 디코딩된 타깃 구간을 이어 붙이면 원래 문장이 그대로 재현되는지 확인합니다.
중간. BART의 text_infill 잡음을 구현합니다. 무작위 구간을 단일 <mask> 토큰으로 바꾸고, 디코더가 올바른 구간 길이와 내용을 함께 추론해야 합니다. 예시 하나를 출력합니다.
어려움. 영어 → 피그 라틴(pig-Latin)으로 변환하는 작은 말뭉치(200쌍)에 대해 flan-t5-small을 파인튜닝(fine-tune)합니다. 별도로 떼어 둔 50쌍에서 BLEU를 측정하고, 같은 연산량으로 Llama-3.2-1B를 파인튜닝한 결과와 비교합니다.
핵심 용어
용어
흔한 설명
실제 의미
인코더-디코더(Encoder-decoder)
"Seq2seq 트랜스포머"
입력용 양방향 인코더(bidirectional encoder)와, 교차 어텐션을 가진 인과 디코더(causal decoder) 두 스택으로 이뤄진 구조다.
교차 어텐션(Cross-attention)
"원본이 타깃에게 말하는 곳"
디코더의 Q와 인코더의 K/V로 계산한다. 인코더의 정보가 디코더 안으로 들어오는 유일한 통로다.
구간 훼손(Span corruption)
"T5의 사전학습 기법"
무작위 구간을 센티넬 토큰으로 바꾸고, 디코더가 그 구간을 복원해 출력하게 한다.
잡음 제거 목적(Denoising objective)
"BART가 푸는 게임"
입력에 잡음 함수를 적용한 뒤, 디코더가 깨끗한 원본 시퀀스를 복원하도록 학습시킨다.
센티넬 토큰(Sentinel token)
"<extra_id_N> 자리표시"
원본에서는 훼손된 구간을 표시하고, 타깃에서는 같은 구간을 다시 가리키는 데 쓰이는 특수 토큰이다.
Flan
"지시 학습된 T5"
1,800개 이상의 과제로 파인튜닝한 T5다. 인코더-디코더 구조도 지시 따르기(instruction-following)에서 경쟁력을 갖도록 만들었다.
빔 서치(Beam search)
"디코딩 전략"
매 단계 상위 k개의 부분 시퀀스를 유지하는 방식으로, 번역과 요약에서 표준적으로 사용된다.
Choose encoder-decoder vs decoder-only for a new sequence-to-sequence task.
Skill
확인 문제
3문제 · 모두 맞추면 완료 표시가 가능합니다
1.T5는 사전학습에 구간 훼손(span corruption)을 사용합니다. 무작위 구간이 <extra_id_0> 같은 센티넬 토큰(sentinel token)으로 교체되고 디코더가 훼손된 구간만 출력합니다. BERT의 MLM과 비교해 학습 효율성 면에서 어떤가요?
2.BART는 사전학습을 위해 다섯 가지 잡음 함수(noising function)를 시도했습니다. 텍스트 채워넣기(text infilling) + 문장 순서 섞기(sentence permutation)의 조합이 가장 좋은 성능을 보였습니다. 텍스트 채워넣기가 특히 효과적인 이유는 무엇인가요?
3.2026년에 디코더 전용 모델이 대부분의 자연어 처리 과제를 지배합니다. 인코더-디코더 아키텍처가 여전히 명확한 우위를 가지는 시나리오는 무엇인가요?