4장. Transformer Decoder와 작은 번역기
Transformer 의 세 가지 변형
같은 부품으로 가게를 세 종류 차릴 수 있습니다. 읽기만 하는 도서 감정소(Encoder-only), 쓰기만 하는 대필 작가(Decoder-only), 읽고 나서 옮겨 쓰는 번역 사무소(Encoder-Decoder)입니다. 원조 Transformer 는 번역 사무소였지만, 부품을 떼어 쓰자 각자 잘하는 일이 생겼습니다.

그림은 Transformer 구조도의 왼쪽 기둥을 BERT(Encoder), 오른쪽 기둥을 GPT(Decoder)로 이름 붙였습니다. GPT 는 오른쪽 기둥에서 Encoder 와 이어지는 Cross-Attention 을 뺀 모양입니다.
세 변형 견주기
| 구조 | 쓰는 부분 | Attention 방향 | 대표 모델 | 잘하는 일 |
|---|---|---|---|---|
| Encoder-only | Encoder | 양방향 | BERT, RoBERTa | 분류, 개체명 인식, 검색 임베딩 |
| Decoder-only | Decoder(Cross-Attention 뺌) | 단방향(causal) | GPT, Llama, Qwen | 글 생성, 대화, 범용 LLM |
| Encoder-Decoder | 둘 다 | Encoder 양방향 + Decoder 단방향 | 원조 Transformer, T5, BART, Marian | 번역, 요약 |
실무 상황에 대어 봅니다. 고객 문의를 "환불·배송·기타"로 나누는 일은 문장 전체를 읽고 판단만 하면 되므로 Encoder-only 가 잘 맞습니다. 영문 계약서 번역은 원문을 다 읽고 새 문장을 쓰므로 Encoder-Decoder 가 맞습니다. 이어지는 챗봇 답변은 앞 문맥을 보고 계속 이어 쓰는 일이므로 Decoder-only 가 맞습니다. 다만 최종 성능은 데이터와 학습 조건에 따라 달라집니다. Decoder-only 는 대화, 글, 코드를 모두 토큰 나열로 보고 "앞을 보고 다음 토큰 예측"이라는 한 가지 계산으로 처리하므로, 한 모델로 여러 일을 할 수 있습니다. 한편 LLM 이 "계산기를 불러라" 같은 도구 호출 글을 만들어도 도구가 저절로 실행되지는 않습니다. 그 글을 읽고 실제로 도구를 돌려 결과를 돌려주는 프로그램이 따로 있어야 합니다.
짧은 예시
import numpy as np
n = 4 # 토큰 4개짜리 문장
# Encoder-only: 모든 칸을 본다(1 = 볼 수 있음)
encoder_mask = np.ones((n, n), dtype=int)
# Decoder-only: np.tril = triangle lower(아래쪽 삼각형). 자기와 앞쪽만 1
decoder_mask = np.tril(np.ones((n, n), dtype=int))
print(encoder_mask)
print(decoder_mask)
# 결과: 첫 표는 1 로 꽉 차고, 둘째 표는 대각선 위가 0
print("볼 수 있는 칸:", encoder_mask.sum(), decoder_mask.sum()) # 결과: 볼 수 있는 칸: 16 10이 코드가 뜻하는 것
두 가게의 "볼 수 있는 범위"를 표 두 장으로 그린 코드입니다. 감정소는 문서 전체를 펼쳐 놓고 보고, 대필 작가는 지금까지 쓴 곳까지만 봅니다. 여기서 감정소의 시야가 encoder_mask, 대필 작가의 시야가 decoder_mask 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
np.ones((n, n)) | 모두 1 | 앞뒤를 다 본다 |
np.tril(np.ones((n, n))) | 아래 삼각형만 1 | 앞쪽만 본다 |
.sum() | 1 의 개수 | 볼 수 있는 칸 수 |
토큰 4개이면 Encoder 는 16칸을 모두 보고, Decoder 는 1 + 2 + 3 + 4 = 10칸만 봅니다. Encoder-Decoder 는 Encoder 쪽에 첫 표, Decoder 쪽에 둘째 표를 쓰고, 둘을 Cross-Attention 으로 잇습니다.
주의할 점
np.tril로 만든 "볼 수 있는 칸" 표와, 앞 절의np.triu(..., k=1)로 만든 "가릴 칸" 표는 서로 반대입니다. 라이브러리마다 1 이 "보기"인지 "가리기"인지 다르므로 문서를 확인합니다.- BERT 같은 Encoder-only 모델은 문장을 이어 쓰는 데 맞지 않습니다. 생성에는 Decoder 가 필요합니다.