Seq2Seq

모와이·2026년 1월 26일

llm

목록 보기
12/20

간단 요약

학습할때는 정답 데이터를 미리 주고
1. 영어 원문 + 한글 정답(디코더 입력 : 앞에 <sos>를 붙힘)
2. 이걸 토대로 한글 정답(디코더 타깃/정답 :뒤에 <eos> 를 붙혀서 끝임을 알림)
3. 이걸 토대로 학습할떄 디코더가 매 시점 ‘다음 토큰’을 맞추면서, <eos>를 통해 어디서 끝나는지도 학습
4. 추론때는 영어 원문만 입력 i like apple
5. 이 원문을 lstm으로 요약상태(히든h,셀c)를 만듦
6. 디코더에서 매 시점 다음 단어의 확률분포를 예측
7. 시작은<sos> 디코더가 다음 단어 확률분포를 예측(6번과정)하고, 거기서 선택(argmax/beam 등)된 단어(예: “나는”)를 다음 시점 디코더 입력으로 넣으며, 동시에 LSTM 상태(h,c)도 업데이트한다. 이 과정을 반복해 다음 값을 예측한다.
8. 마지막으로 디코더에서 <eos>를 예측하면 끝

번역 과정

  1. 영어 문장(Encoder 입력)을 넣음
  2. LSTM 인코더가(h,c)를 요약상태를 만듦
  3. 디코더가 <sos> 부터 시해 한 토큰씩 한국어를 생성
  4. <eos>가 나오면 멈추는 Seq2Seq 번역기를 학습/추론까지 구현

학습 데이터 준비 개념 설명

  • 데이터는 manythings.org의 영어-한국어 문장쌍
  • 핵심 개념
    -Decoder input : <sos> 정답문장
    -Decoder output : 정답문장 <eos>

    디코더는 "다음 단어 맞추기"를 해야 하므로 입력은 한 칸 앞(<sos>)시작, 정답은 한 칸 뒤 (<eos>)맞춤
    teacher forcing의 기본 형태

eng_inputs / kor_inputs / kor_targets 만들기

  1. 파일을 다운로드 한 뒤
  2. eng_kor.txt를 한 줄씩 읽고 탭으로 분리
    • eng_inputs : 영어 원문
    • kor_inputs : <sos> + 한국어
    • kor_targets : 한국어 + <eos>
  3. 마지막에 길이 확인 후(len(...)) 데이터 잘 들어왔는지 체크

    개념: <sos> vs <eos>
    <sos>: 디코더가 “지금부터 문장 생성 시작”하라고 받는 시작 신호(입력 쪽)
    <eos>: 디코더가 “문장 끝”을 예측하도록 하는 종료 신호(정답 쪽)
    <eos>가 target이냐?모델이 “언제 멈출지”도 학습해야 하니까, 끝 토큰을 맞추는 문제를 만들어줘야 함.

토큰화

  1. VOCAB_SIZE=20000
  • 상위 빈도 단어 기준으로 최대 어휘 수 제한
  • 왜 제한? → 어휘가 너무 크면 학습이 느리고 희소해짐
  1. 영문 토큰화 학습 + 시퀀스 변환
  • Tokenizer()
  • fit_on_texts(eng_inputs) : 단어 사전 생성(단어 -> 정수ID)
  • texts_to_sequences : 문장 → 정수 ID 리스트로 변환
  1. eng_num_words, eng_max_len 계산
  • eng_num_words: 실제 쓰는 단어 수(설정값 vs 실제 사전 크기 중 작은 것)
  • eng_max_len: 가장 긴 문장의 토큰 길이(패딩 기준)
  1. 한국어 토크나이저 학습 + 시퀀스 변환
  • filters =''로 특수문자 필터 제거해서 <sos> <eos> 안날아가게함
  • fit_on_texts(kor_inputs + kor_targets): 입력/정답 양쪽에 등장하는 토큰을 모두 사전에 포함

패딩

  1. pad_sequences 영문/국문 길이 맞춤(이때 영문만 padding='pre'나머진 'post')

    인코더는 보통 “마지막 상태”를 요약으로 쓰니까, 뒤쪽이 실제 단어로 끝나게(pre padding) 만드는 선택이 흔함.

    디코더는 왼→오 생성이라 정렬이 쉬워 post padding이 흔함.

Encoder 만들기 (영어 → 요약 상태 만들기)

  1. 입력: 영어 토큰 시퀀스 (batch, eng_max_len)
  2. Embedding -> LSTM -> 출력: (h, c) 두 개 상태

    핵심: 영어 문장을 읽고 마지막에 남는 요약 정보(h,c)를 뽑아냄.

Teacher Forcing용 Decoder + 전체 학습 모델 만들기

  1. 디코더 입력: + 정답문장 (학습 때는 정답을 “입력으로” 줌)
  2. 인코더에서 나온 (h,c)를 디코더의 초기 상태로 넣음
  3. 디코더는 매 시점마다 다음 토큰의 확률을 출력(softmax)

    핵심: 학습은 “번역 생성”이 아니라 다음 단어 맞추기 문제로 바뀜.

추론용 Decoder 모델 따로 만들기 (1토큰씩 생성용)

학습용 디코더는 "정답 문장 전체"를 한번에 넣지만 추론은 정답이 없어서
1. 입력 : 현재 토큰 1개 + 이전 상태(h,c)
2. 출력 : 다음 토큰 분포 + 업데이트된 상태(h,c)

"한 스텝씩" 생성하기 위한 전용 구조

translate() 번역 류프 (추론 핵심)

  1. <sos>로 시작
  2. 디코더가 다음 단어를 예측 → 그걸 다시 다음 입력으로 넣음
  3. <eos>가 나오면 종료

    핵심: 추론은 결국 영어 → (h,c) 요약 → <sos>부터 한 단어씩 생성 → <eos>에서 멈춤

결론

  • 학습: 영어→인코더 상태(h,c), 디코더는 <sos>+정답을 입력으로 받아 다음 토큰을 맞추며 파라미터 업데이트.
  • 추론: 영어→(h,c) 얻고 <sos>부터 시작해 (현재 토큰, (h,c))로 다음 토큰 분포와 새 (h,c)를 반복 생성하다 <eos>에서 종료.
profile
공부하는거 정리하는 블로그

0개의 댓글