[I2S] encoder-decoder network(예시 : 영어 문장을 프랑스어로 번역하는 모델)
영어 문장을 인코더로 주입하면 디코더는 프랑스어 번역을 출력.
프랑스어 번역은 한 스텝 뒤쳐져서 디코더의 입력으로도 사용됨. 즉슨 디코더는 이전 스텝에서 출력된 단어를(실제로 무엇이 출력되는지 상관없이) 입력으로 사용
맨 처음 단어는 (SOS : start of sequence)토큰으로 시작함. 디코더는 문장의 끝에 EOS(end of sequence)가 있을 것으로 기대한다.
영어 문장은 인코더로 주입되기 전에 거꾸로 뒤집힙니다. 예를 들어 'I drink milk'는 뒤집혀 'milk drink I' 가 됩니다. 즉 영어 문장의 시작 부분을 인코더에 마지막으로 주입합니다. 이 단어가 디코더가 번역할 첫 번째 단어이기 때문입니다.
각 단어는 초기에 1차원으로 표현되어 있습니다.(예를 들어 단어 milk는 288),
그 다음 임베딩 층이 단어 임베딩을 반환합니다.
이 단어 임베딩이 인코더와 디코더로 주입됩니다.
각 단계마다 디코더는 출력 어휘 사전(즉 프랑스어)에 있는 단어에 대한 점수를 출력합니다.
그 다음에 소프트맥스 층이 이 점수를 확률로 바꿉니다. 예를 들어 첫번째 스텝에서 단어 Je는 20%의 확률을 갖고 Tu는 1%의 확률을 갖는 식입니다. 가장 높은 확률의 단어가 출력됩니다. 이는 일반적인 분류 작업과 매우 비슷합니다. 따라서 Char-RNN 모델에서 했던 것처럼 "sparse_categorical_crossentropy 손실 함수를 사용해 훈련 할 수 있습니다.
(훈련이 끝나고) 추론 시에는 디코더에 주입할 타깃 문장이 없습니다. 대신 [그림16-4]처럼 그냥 이전 슽엡에서 디코더가 출력한 단어를 주입합니다.(여기서도 임베딩 룩업이 필요하지만 그림에는 나타내지 않았습니다.)--> 임베딩 룩업이 뭐지?
좋습니다. 이제 큰 그림을 그려보앗습니다. 아직 이 모델을 구현하려면 처리할 것이 조금 더 있습니다.
-지금까지는 모든(인코더와 디코더의) 입력 시퀸스의 길이가 동일하다고 가정했습니다. 당연히 문장의 길이는 다릅니다. 일반적인 텐서의 크기는 고정되어 있기 때문에 동일한 문장의 길이만 담을 수 있습니다.
앞서 설명한 것처럼 마스킹을 사용해 이를 처리할 수 있습니다.-->마스킹이 뭐지? 하지만 문장의 길이가 많이 다르면 감성 분석에서 했던 것처럼 그냥 잘라낼 수 없습니다.(잘려진 번역이 아니라. 전체 문장을 번역해야 하기 때문입니다.) 대신 문장을 비슷한 길이의 버킷으로 그룹핑합니다.(예를 들어, 한 버킷은 1개에서 6개 단어로 이루어진 문장을 담고 또 다른 버킷은 7개에서 12개 단어로 이루어진 문장을 담는 식입니다.). 버킷에 담긴 문장이 모두 동일한 길이가 되도록 패딩을 추가합니다.(tf.data.experimental.bucket_by_sequence_length() 함수를 확인해 보세요). 예를 들어 'I drink milk'는 '<pad> <pad> <pad> milk drink I.' 가 됩니다.
- EOS 토큰 이후 출력은 모두 무시합니다. 이 토큰들은 손실에 영향을 미치지 않습니다.(마스킹 처리되어야합니다.) 예를 들어 모델이 Je bois du lail<eos> oui'를 출력하면 마지막 단어에 대한 손실은 무시합니다