트랜스포머·PEFT 2일 과정4장 · Transformer Decoder와 작은 번역기9 / 17← 이전목차다음 →MetaContents

4장. Transformer Decoder와 작은 번역기

Transformer 의 세 가지 변형

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

가운데 Transformer 구조도를 두고 왼쪽 Encoder 쪽에 BERT, 오른쪽 Decoder 쪽에 GPT 를 적은 강사자료 그림

그림은 Transformer 구조도의 왼쪽 기둥을 BERT(Encoder), 오른쪽 기둥을 GPT(Decoder)로 이름 붙였습니다. GPT 는 오른쪽 기둥에서 Encoder 와 이어지는 Cross-Attention 을 뺀 모양입니다.

Encoder-only, Decoder-only, Encoder-Decoder 세 변형을 견준 그림

세 변형 견주기

구조쓰는 부분Attention 방향대표 모델잘하는 일
Encoder-onlyEncoder양방향BERT, RoBERTa분류, 개체명 인식, 검색 임베딩
Decoder-onlyDecoder(Cross-Attention 뺌)단방향(causal)GPT, Llama, Qwen글 생성, 대화, 범용 LLM
Encoder-Decoder둘 다Encoder 양방향 + Decoder 단방향원조 Transformer, T5, BART, Marian번역, 요약

실무 상황에 대어 봅니다. 고객 문의를 "환불·배송·기타"로 나누는 일은 문장 전체를 읽고 판단만 하면 되므로 Encoder-only 가 잘 맞습니다. 영문 계약서 번역은 원문을 다 읽고 새 문장을 쓰므로 Encoder-Decoder 가 맞습니다. 이어지는 챗봇 답변은 앞 문맥을 보고 계속 이어 쓰는 일이므로 Decoder-only 가 맞습니다. 다만 최종 성능은 데이터와 학습 조건에 따라 달라집니다. Decoder-only 는 대화, 글, 코드를 모두 토큰 나열로 보고 "앞을 보고 다음 토큰 예측"이라는 한 가지 계산으로 처리하므로, 한 모델로 여러 일을 할 수 있습니다. 한편 LLM 이 "계산기를 불러라" 같은 도구 호출 글을 만들어도 도구가 저절로 실행되지는 않습니다. 그 글을 읽고 실제로 도구를 돌려 결과를 돌려주는 프로그램이 따로 있어야 합니다.

짧은 예시

Python
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 가 필요합니다.
← 이전 절4장 · 작은 영한 번역기의 설계도다음 절 →4장 · Transformer 이후의 발전