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) 이미지 캡셔닝('이미지'를 '문장'으로 변환)
'Study > DL' 카테고리의 다른 글
[Stanford cs231n] Lecture 10(Recurrent Neural Networks) (0) | 2024.06.16 |
---|---|
[밑시딥2] Chapter 8. 어텐션 (1) | 2024.02.03 |
[밑시딥2] Chapter 5~6. 순환신경망(RNN)& 게이트가 추가된 RNN (0) | 2024.01.25 |
[밑시딥2] Chapter 3~4. word2vec & 속도 개선 (0) | 2024.01.24 |
[모두를 위한 딥러닝 시즌2] lab 10-5. Advanced CNN(VGG) (0) | 2024.01.21 |