본문 바로가기
Study/DL

[밑시딥2] Chapter 7. RNN을 사용한 문장 생성

by hyeon827 2024. 2. 2.

RNN을 사용한 문장 생성

언어 모델은 지금까지 주어진 단어들에서 다음에 출현하는 단어의 확률 분포 출력

해당 분포를 기초로 2가지 방법을 통해 다음 단어 생성

 

1) 결정적 알고리즘

  • 확률이 가장 높은 단어 선택

2) 확률적 알고리즘

  • 각 후보 단어의 확률에 맞게 선택
  • 따라서 선택되는 단어는 실행할 때마다 달라짐

 

seq2seq

  • 시계열 데이터를 다른 시계열 데이터로 변환하는 모델
  • Encoder-Decoder 모델
  • Encoder는 RNN을 이용해 시계열 데이터를 h라는 은닉 상태 벡터로 변환
  • LSTM 뿐만 아니라 '단순한 RNN'이나 GRU 등도 물론 이용 가능

  • 마지막 은닉 상태 h에 입력 문장(출발어)을 번역하는 데 필요한 정보가 인코딩
  • 중요한 점은 LSTM의 은닉 상태 h는 고정 길이 벡터라는 사실

 

  • Decoder에서는 LSTM 계층이 벡터 h를 입력받음
  • <eos> : Decoder에 '시작/종료'를 알리는 구분자로 이용

  • seq2seq는 LSTM 두개로 구성
  • 이때 LSTM 계층의 은닉 상태가 Encoder와 Decoder를 이어주는 '가교'가 됨
  • 역전파 때는 이 '가교'를 통해 기울기가 Decoder로부터 Encoder로 전해짐

 

시계열 데이터 변환용 장난감 문제

  • seq2seq는 덧셈의 논리에 대해 아무것도 모름
  • 덧셈의 '예'로부터, 거기서 사용되는 문자의 패턴 학습
  • '단어' 단위로 분할하지 않고 '문자' 단위로 분할(['5','7','+','5'])

  • '덧셈' 문제에서는 샘플마다 데이터의 시간 방향 크기가 다름(=가변 길이 시계열 데이터)
  • 가변 길이 시계열 데이터를 미니배치로 학습하기 위한 가장 단순한 방법은 '패딩(padding)'
  • 모든 입력 데이터의 길이를 통일하고, 남는 공간에는 의미 없는 데이터를 채움
  • 정답데이터에도 패딩 수행
  • 질문과 정답을 구분하기 위해 출력 앞에 구분자 밑줄(_) 붙임 
  • 참고로, 이 구분자는 Decoder에 문자열을 생성하라고 알리는 신호

  • seq2seq에 패딩 전용 처리 추가 필요
  • Decoder에 입력된 데이터가 패딩이라면 손실의 결과에 반영하지 않도록 함 (Softmax with Loss 계층에 '마스크' 기능)
  • Encoder에 입력된 데이터가 패딩이라면 LSTM 계층이 이전 시각의 입력을 그대로 출력하게 함

 

seq2seq 구현

 

Encoder 클래스

  • Embedding 계층과 LSTM 계층으로 구성
  • Embedding 계층에서는 문자를 문자 벡터로 변환하여 LSTM 계층으로 입력
  • LSTM 계층은 오른쪽(시간 방향)으로는 은닉 상태와 셀을 출력하고 위쪽으로는 은닉 상태만 출력
  • Encoder에서는 마지막 문자를 처리한 후 LSTM 계층의 은닉 상태 h를 출력

 

Decoder 클래스

  • 정답 데이터는 "_62"
  • 입력 데이터를 ['_','6','2',' ']로 주고, 이에 대응하는 출력은 ['6','2',' ',' ']이 되도록 학습
  • 'argmax' 노드를 통해 최대값을 가진 원소의 인덱스를 선택 (Softmax 계층 생략가능)

 

 

Seq2seq 클래스

  • Encoder 클래스와 Decoder 클래스 연결하고, Time Softmax with Loss 계층을 이용해 손실 계산

 

seq2seq 학습 속도 개선

입력 데이터 반전(Reverse)

  • 입력 데이터의 순서를 반전시키는 것
  • 이 트릭을 사용하면 많은 경우 학습 진행이 빨라져서, 결과적으로 최종 정확도도 좋아진다고 함
  • 입력 문장의 첫 부분에서는 반전 덕분에 대응하는 변환 후 단어와 가까우므로, 기울기가 더 잘 전해져서 학습 효율이 좋아진다고 생각할 수 있음
  • 다만, 입력 데이터를 반전해도 단어 사이의 '평균' 거리는 그대로

 

엿보기(Peeky)

  • 중요한 정보가 담긴 Encoder의 출력 h를 Decoder의 다른 계층에게도 전해주는 것
  • 모든 시각의 Affine 계층과 LSTM 계층에 Encoder의 출력 h를 전해줌(집단지성)

  • Affine 계층에 입력이 2개인 경우 정확한 그림 (두 입력을 연결한 하나의 벡터 입력)

 

seq2seq을 이용한 애플리케이션

아래처럼 2개의 짝을 이루는 시계열 데이터를 다루는 문제에 이용

  • 기계 번역: '한 언어의 문장'을 '다른 언어의 문장'으로 변환
  • 자동 요약: '긴 문장'을 '짧게 요약된 문장'으로 변환
  • 질의응답: '질문'을 '응답'으로 변환
  • 메일 자동 응답: '받은 메일의 문장'을 '답변 글'로 변환

1) 챗봇

 

2) 알고리즘 학습(소스 코드)

 

3) 이미지 캡셔닝('이미지'를 '문장'으로 변환)