한쪽은 이해하고, 다른 한쪽은 만든다
Encoder와 Decoder는 같은 Transformer 안에 있지만 역할은 다릅니다. 둘은 따로 움직이는 것이 아니라, Encoder가 만든 정보를 Decoder가 계속 참고하면서 함께 작동합니다.
전체 흐름을 먼저 살펴보자
Encoder와 Decoder의 역할은 어떻게 나뉠까?
Encoder의 역할
입력 문장의 모든 토큰을 함께 살펴보고, 각 토큰이 문맥 속에서 무엇을 의미하는지 벡터로 정리합니다.
Decoder의 역할
지금까지 생성한 토큰과 Encoder의 출력 벡터를 함께 참고하여 다음 토큰을 예측합니다.
두 구조는 Cross-Attention으로 연결된다
Encoder Stack
Decoder가 Encoder의 최종 출력 전체를 참고합니다.
Decoder Stack
Encoder와 Decoder가 함께 일하는 순서
입력 문장을 토큰과 벡터로 바꾼다
Tokenizer, Embedding, Positional Encoding을 거쳐 Encoder가 사용할 입력을 준비합니다.
Encoder가 입력 문맥을 계산한다
Self-Attention을 통해 입력 토큰들이 서로 어떤 관계인지 파악합니다.
Decoder가 지금까지 생성한 내용을 살펴본다
Masked Self-Attention으로 미래 토큰을 가리고 앞쪽 출력만 참고합니다.
Cross-Attention으로 입력 정보를 가져온다
Decoder의 Query가 Encoder의 Key와 Value를 참고합니다.
다음 토큰을 예측한다
Decoder의 최종 벡터를 Vocabulary 점수로 바꾸고 다음 토큰을 선택합니다.
생성한 토큰을 다시 Decoder에 넣는다
종료 토큰이 나올 때까지 같은 과정을 반복합니다.
번역 과정에서 두 구조가 어떻게 협력할까?
단계 버튼을 누르면 Encoder와 Decoder에서 어떤 정보가 사용되는지 확인할 수 있습니다.
Encoder 쪽
Decoder 쪽
Encoder 정보는 유지되고, Decoder 출력은 늘어난다
Encoder 출력
입력 문장을 처리한 결과는 생성 과정 동안 참고할 수 있도록 유지됩니다.
I · love · this · book의 문맥 벡터Decoder 출력
새 토큰을 하나씩 생성할 때마다 앞부분이 계속 길어집니다.
나는 → 나는 이 → 나는 이 책을 → …Decoder의 생성 반복 과정
이전 출력 확인
Masked Self-Attention으로 지금까지 생성한 토큰을 살펴봅니다.
입력 정보 확인
Cross-Attention으로 Encoder 출력에서 필요한 내용을 가져옵니다.
다음 토큰 선택
후보 토큰의 점수를 계산해 하나를 선택합니다.
다시 입력
선택한 토큰을 Decoder 입력에 붙이고 과정을 반복합니다.
핵심 정리
- Encoder는 입력 문장의 모든 토큰을 읽고 문맥 벡터를 만듭니다.
- Decoder는 지금까지 생성한 출력과 Encoder 정보를 함께 사용합니다.
- Masked Self-Attention은 Decoder의 앞쪽 출력 문맥을 계산합니다.
- Cross-Attention은 Decoder와 Encoder 출력을 연결합니다.
- Decoder는 다음 토큰을 선택하고 그 토큰을 다시 입력에 추가합니다.
- 이 과정을 종료 토큰이 나올 때까지 반복해 최종 문장을 완성합니다.