Step 9~15까지는 모두 분류(Classification) 문제였습니다. 입력 텍스트를 받아 카테고리 하나를 출력했죠. 이제부터는 차원이 다릅니다. 입력도 시퀀스, 출력도 시퀀스인 문제를 다룹니다!
| 구분 | 분류 (Step 9~15) | 생성 (Step 16~) |
|---|---|---|
| 입력 | 텍스트 | 텍스트 (시퀀스) |
| 출력 | 카테고리 1개 | 텍스트 (시퀀스) |
| 출력 길이 | 고정 (클래스 수) | 가변 (매번 다름) |
| 대표 태스크 | 감정분석, 뉴스분류 | 번역, 요약, 대화 |
| 대표 모델 | RoBERTa, BERT | Seq2Seq, GPT |
Sequence-to-Sequence. 말 그대로 시퀀스를 받아서 시퀀스를 출력합니다. 2014년 Google이 발표한 이 구조는 기계 번역의 역사를 바꿨습니다.
Encoder의 마지막 hidden state가 Context Vector입니다. 입력 문장 전체의 의미를 하나의 벡터에 담습니다.
Decoder가 입력 문장을 기억하지 못함. 긴 문장일수록 앞부분 정보 소실.
입력 전체 의미가 벡터에 압축됨. Decoder의 모든 스텝에서 이 정보를 활용.
# Encoder: 문장 → Context Vector input: ["나는", "학교에", "간다"] ↓ ↓ ↓ RNN → RNN → RNN ↓ context = h_final # [1, 256] 벡터 # Decoder: Context Vector → 번역 context → RNN → "I" context → RNN → "go" context → RNN → "to" context → RNN → "school" context → RNN → <EOS> # 종료!
| 토큰 | 의미 | 사용 위치 | 역할 |
|---|---|---|---|
<SOS> | Start of Sequence | Decoder 입력 첫 번째 | "이제 생성 시작해!" 신호 |
<EOS> | End of Sequence | Decoder 출력 마지막 | "생성 완료!" 신호 |
<PAD> | Padding | 짧은 문장 뒤 | 배치 내 길이 통일 |
<UNK> | Unknown | 어휘에 없는 단어 | 미등록 단어 처리 |
학습 시 Decoder가 틀린 단어를 예측해도 다음 입력으로 정답 단어를 주는 기법입니다.
이전 예측값을 다음 입력으로 사용.
오류가 누적될 수 있음.
예측: "I" → "go" → "to" → ...
틀렸어도 정답을 다음 입력으로 사용.
학습이 안정적이고 빠름.
정답: "I" → "go" → "to" → ...
고정된 크기의 Context Vector 하나에 입력 문장 전체를 압축하다 보니, 문장이 길수록 앞부분 정보가 소실됩니다. 이 문제는 Step 18(Seq2Seq + Attention)에서 해결합니다.