seq2seq
seq2seq모델은 시계열 데이터를 다른 시계열 데이터로 변환하는 모델입니다. 시계열 데이터의 변환을 예를 들면 특정 언어의 문장을 다른 언어의 문장으로 번역하는 과정을 들 수 있습니다. 또한 seq2seq모델은 Encoder-Decoder 모델이라고도 하는데, 이름처럼 input을 인코딩하고, 인코딩된 데이터를 다시 디코딩하는 과정을 거칩니다.
"나는 고양이로소이다"라는 한글 문장을 "I am a cat"으로 변환(번역)하는 경우로 예를 들어 보겠습니다.
seq2seq의 Encoder
LSTM모델에 한 문장을 넣는 경우를 생각해보겠습니다.
위 모델이 출력하는 h는 LSTM계층의 마지막 은닉 상태인데, 이 h에 입력된 문장을 번역하는데 필요한 정보가 인코딩됩니다. 겉으로 보면 "나는 고양이로소이다"라는 문장이 h라는 고정 길이 벡터로 변환되는 것입니다!
seq2seq의 Decoder
이전 글에서 봤던 LSTM의 시작 계층은 h를 입력받지 않았는데, Decoder의 첫 LSTM계층은 Encoder의 output h를 입력받습니다. 따라서 Encoder와 Decoder를 합쳐서 보면 다음과 같습니다.
seq2seq모델의 개선
1. 입력 데이터 반전
입력 데이터인 "나 는 고양이 로소 이다"를 "이다 로소 고양이 는 나"로 반전시키면 어떻게 될까요?
구조적으로 같은 의미를 가진 "나"와 "I"의 거리가 더 가까워져 기울기가 직접 전해집니다(기울기 전파 원활)
따라서 학습 효율이 좋아진다고 생각할 수 있습니다.(입력 데이터를 반전해도 단어 사이의 평균거리는 그대로)
(저의 생각인데 입력 데이터를 반전시키면 문장의 마지막 단어들은 서로 멀어지는 거 아닌가..?싶었는데 한글과 영어의 어순이 달라 일정 부분 상쇄되는 것이 아닌가 싶은데 더 공부해서 정확한 이론으로 수정하겠습니다!)
2. 엿보기(Peeky)
Decoder에게 입력되는 input(예시에서는 번역을 하려는 언어의 문장-Encoder의 input)에 대한 정보는 Encoder의 출력 즉 h로만 전달이 됩니다. 이 정보를 Decoder에 더 활용할 방법으로서 Peeky가 사용됩니다.
위 그림과 같이 Affine계층과 LSTM계층에도 h를 전달해줍니다 h를 공유함으로서 집단지성을 같은 Decoder로 이해할 수 있습니다. 근데 이렇게 공유를 하면 Affine계층에 두 벡터가 입력되는데, 이는 입력 전 두 벡터를 연결시키는 concat 노드를 추가해 하나의 벡터가 입력되도록 합니다.
seq2seq의 활용
지금까지 seq2seq의 정말 기본적인 구조만을 알아봤는데, 그럼 이런 seq2seq모델은 어디에 쓰일까요?
1. 챗봇
대화라는 것은 "상대의 말"과 "자신의 말"로 구성되어 이를 변환하는 문제로 볼 수 있습니다. 따라서 seq2seq을 활 용해 챗봇을 학습시킬 수 있습니다.
2.알고리즘 학습
소스코드도 시계열 데이터로 볼 수 있습니다. 따라서 이를 seq2seq에 입력할 수 있고, 원하는 답과 대조하여 학습시 킬 수 있습니다.
3. 이미지 캡셔닝
이미지 캡션은 이미지를 문장으로 변환합니다. Decoder에 입력되는 h를 CNN의 output으로 설정하여 이미지를 문장으로 변환시킵니다. 이 때 CNN의 feature map은 대부분 3차원이기 때문에 Decoder로 가기 전 Affine계층을 통해 평탄화를 해야합니다.
'AI_basic > Deeplearning' 카테고리의 다른 글
[Deeplearning Part.8-5] 어텐션 (0) | 2022.01.27 |
---|---|
[Deeplearning Part.8-4] GRU (0) | 2022.01.25 |
[Deeplearning Part. 8-2] LSTM (0) | 2022.01.25 |
[Deeplearning Part.8-1] RNN 기본구조 (0) | 2022.01.24 |
[Deeplearning Part.7-1] 자연어 처리와 Word Embedding (0) | 2022.01.22 |