Seq2Seq
참고 자료
Seq2Seq2(시퀀스 투 시퀀스)
seq2seq는 이름 그대로 sequence(시계열 데이터)에서 sequence(시계열 데이터)로 보내는 방법입니다.
ex) 나는 학생이다 -> I am a student
seq2seq의 구조는 Encoder와 Decoder로 구성
되어있습니다.
Encoder
Encoder에서는 문장을 입력 받아서 Context vector(=hidden state)를 생성합니다.
그림으로 보면 다음과 같습니다.
Encoder는 Embedding층과 LSTM층으로 구성되있고, 보통의 신경망에서의 위로 올라가는 Affine 층
은 여기서는 사용하지 않고, Cell state
는 마지막 embedding까지 사용하고 폐기
하며, Hidden state만 최종적으로 출력
한다(이를 context vecotr
라 부름)
이 최종 Hidden state는 하이퍼 파라미터이며, 어찌되었건 이는 길이이며, 이 고정 길이 안에서 입력 문장을 번역하는데 필요한 정보를 인코딩하는게 encoder의 목적입니다.
[인코더 - 컨텍스트백터(hidden state) - 디코더]
로 이루어져 있고- seq2seq는 인코더와 디코더 아키텍처의 내부는 사실
두 개의 RNN 구조
로 이루어진 모델 - 시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq)는 챗봇과 기계 번역에서 많이 사용됩니다.
- 대략적인 구조는
입력 시퀀스
(질문)와출력 시퀀스
(대답)으로 이루어져 있습니다.
Decoder
디코더에서는 그림과 같이 진행됩니다.
embedding값
과 hidden state인 context vector
가 LSTM으로 연산됩니다.
자세히 살펴보면 <end of sentence>를 input data로 사용하여 hidden state와 연산한 값을 Affine과 softmax를 통해 I
인 출력값을 얻습니다. 그 I
가 다음 input으로 들어와서 반복합니다
- 아래 동영상을 보시면 쉽게 이해될 것입니다(10초)
seq2seq의 한계점
항상 고정된 크기의 벡터에(컨텍스트 벡터) 모든 정보를 저장하기 때문에 bottle neck현상이 발생하여 정보 손실이 발생한다.
입력의 길이가 길어지면 기울기 소실 문제가 발생한다.
(context vector를 기준으로 Encoder, Decoder가 완전히 분리되어 있으므로 입출력의 연관 관계가 너무 떨어져 있어서 역전파 시 기울기 소실 발생)결국은 RNN계열 대신 Attention을 사용하게 됨