이번 포스트는 seq2seq Model에 대해 다뤄보고자 합니다.
내용 중에 Encoder-Decoder의 개념도 포함되어 있으니 정리해 나가면서 진행해 보도록 하겠습니다.
Sequence-To-Sequence Model은 한 Sequence를 다른 Sequence로 변환하는 작업을 수행하는 Deep Learning Model로 주로 자연어 처리(NLP) 분야에서 많이 활용됩니다.
기계 번역, 뭐... 한국어로 어떤 문장을 입력하면 이를 영어, 일본어, 중국어 등으로 번역하는 기본적인 번역기에 활용되기도 하고 어떤 질문을 입력하면 이에 대응하는 답변을 반환하는 Chatbot에도 활용됩니다. 더 나아가 Text Summarization, Speech To Text, Image Captioning과 같은 Input Sequence를 다른 도메인의 Sequence로 변환하는 Task에 많이 활용됩니다.
seq2seq Model의 경우, Encoder와 Decoder라는 Module을 포함하고 있으며, 때문에 seq2seq를 Encoder-Decoder Model이라고 부르기도 합니다. 따라서 seq2seq, 즉 Encoder와 Decoder의 개념부터 다뤄보도록 하겠습니다.
Encoder는 Input Data를 Encoding라고 Decoder는 Encoder에서 Encoding 된 Data를 Decoding 합니다.
설명을 풀어써보면, Input Sequence인 "그녀는 학생입니다"라는 문장을 Encoding(≒ 일종의 암호화) 과정을 통해 "111 432 975"라는 어떠한 Data로 변환합니다. 이때의 Data를 Context Vector라고 합니다. 이러한 Context Vector를 Decoder에 Input 하면 Decoder는 이를 Decoding( ≒ 일종의 복호화) 과정을 통해 Output Sequence인 "그녀는 학생입니다"를 생성합니다.
위 설명을 읽다 보면, Output Sequence는 "She is student"인데?라고 생각하실 수 있습니다. 이것도 맞습니다. 다만, Encoder-Decoder의 구조를 위에서는 암호화와 복호화로 설명했는데요. 일반적인 DL관점에서는 Encoding을 Data의 압축으로, Decoding을 압축 해제 및 Domain Transfer와 같은 작업으로 이해하시면 될 것 같습니다. 참고로 Encoder와 Decoder는 서로 다른 Model이기 때문에 Encoder는 Input Sequence와 관련된 Domain을 학습하고 Decoder는 Output Sequence와 관련된 Domain을 따로 학습합니다. (→ 각 Model은 Parameter를 공유하지 않습니다.)
어찌 되었든 Encoder-Decoder의 전체 개념에 대해 알아보았으니, 이제는 세부적인 구조에 대해 알아가 보도록 하겠습니다.
우선, Encoder부터 다뤄보겠습니다.
Encoder는 일반적으로 RNN(= Recurrent Neural Network)이나 LSTM(= Long Short-Term Memory), GRU(= Gated Recurrent Unit) 등의 순환 신경망 구조를 사용해 Input Sequence를 고정 길이의 Vector(= 압축된 Context Vector, 임의의 길이를 가진 Data를 고정 길이로 변환)로 변환하는 역할을 수행합니다.
위 이미지와 같이 Input Sequence의 각 Data를 순차적으로 처리하면서 각 단계에서 Hidden State를 Update 하고 최종적으로 전체 Input Sequence를 대표하는 고정 길이의 Vecotor를 생성합니다. 이 Vector는 LSTM의 마지막 Hidden State이며, 이러한 Encoding 된 Context Vector는 Decoder에 전달됩니다. 이 Context Vector는 Decoder에 포함된 Model의 첫 번째 시점 Hidden State Vector가 됩니다.
이제 Decoder를 다뤄보겠습니다.
Decoder는 Encoder의 Output인 Context Vector(= 고정 길이 Vector)를 기반으로 원하는 Output Sequence를 생성하는 역할을 수행합니다. Decoder 또한 Encoder와 같이 RNN, LSTM, GRU 등의 순환 신경망 구조를 사용합니다.
Vector h를 입력으로 받으며, Decoder의 예측은 일반적으로는 Softmax Activation Function을 통해 확률 분포로 변환되며 가장 확률이 높은 Data가 채택됩니다. 이러한 과정을 반복적으로 수행하면 최종적인 Output Sequence가 생성됩니다.
조금 더 세부적으로 설명하면, Decoder의 LSTM Model은 Sequence의 시작을 알리는 Special Token인 <eos>를 첫 번째 시점의 입력으로 받습니다. 따라서 Token과 Context Vector를 바탕으로 첫 번째 시점의 Output을 생성합니다.
두 번째 시점에서는 방법에 따라 Input 값을 다르게 처리할 수 있습니다. 첫 번째 방법([1] 파란 Dot Line)은 첫 번째 시점의 출력 값을 두 번째 시점의 입력 값으로 사용, 즉 모델의 예측 값을 입력으로 사용하는 방법입니다. 출력 값이 정답과 달라고 Model의 입력으로 사용되며, 이는 학습 속도가 상대적으로 느리지만 실제 환경과 가까운 방식입니다. 두 번째 방법([2] 검정 Line)은 정답 Sequence의 첫 번째 Token을 두 번째 시점의 입력 값으로 사용, 즉 정답을 알려주면서 수행되는 방식으로 Teacher Forcing이라고도 합니다. 이는 학습 속도가 빠르지만 실제 환경과는 조금 거리가 있는 방식입니다.
어찌 되었든, 두 방식 모두 최종적으로 Decoder가 Sequence의 끝을 알리는 Special Token <eos>를 출력하면 종료됩니다.
여기까지가 Encoder-Decoder, Sequence-To-Sequence에 대한 내용입니다. 내부 연산 과정은 복잡하겠지만, 개념 자체는 굉장히 단순합니다.
당연한 이야기겠지만, 이러한 seq2seq Model도 한계점이 존재합니다. Encoder가 Input Sequence를 Context Vector, 즉 하나의 고정된 길이의 Vector로 압축해 출력합니다. 이로 인해 Input Sequence의 길이가 길어질 수록 정보의 손실이 발생할 수 있습니다. 시작 시점의 Data가 유실될 수 있다는 것이지요. (= Long-Term Dependency 문제) 또한 RNN의 고질적인 문제인 경사 소실/폭발 문제가 여전히 발생한다는 것입니다.
이를 극복하기 위해 제안된 방법인 Attention Mechanism이며, 결국 이를 설명하기 위해 seq2seq 구조에 대해 설명한 것입니다. 따라서 다음 포스트에서는 Attention이란 무엇인지, Transformer가 Attention을 어떻게 활용하고 있는지에 대해 다뤄보도록 하겠습니다.
이번 포스트는 여기서 마무리하도록 하겠습니다.
'Programming > Deep Learning Network' 카테고리의 다른 글
[Model] About Multi-Head Attention (0) | 2023.10.31 |
---|---|
[Model] About Self-Attention (1) | 2023.10.31 |
[Code] XNect (0) | 2023.04.04 |
[Code] VNect (0) | 2023.03.13 |
[Model] VNect과 XNect (0) | 2023.03.13 |
댓글