Seq2Seq모델은 many to many 형태에 해당하며 입력 sequence를 모두 읽은 후 출력 sequence를 생성 및 예측하는 구조이다.
입력 부분을 담당하는 RNN모델을 encoder 출력 부분을 담당하는 RNN모델을 decoder라고 부른다.
encoder와 decoder는 share가 이루어지지 않은 별개의 모델이며 encoder의 마지막 hidden state정보는 decoder의 입력으로 사용된다. 이때 decoder의 시작을 알리기 위해 <sos>라는 스페셜토큰과 문장의 끝을 알리는 <eos>을 사용하게 된다.
RNN의 구조 특성상 sequence의 길이와 상관없이 차원이 고정되어야 하기 때문에 마지막 hidden state vector에 모든 정보를 축적하기에는 한계가 있다. 또한 LSTM이 장기 기억에 탁월하다 하더라도 앞단의 정보가 변질되거나 소실될 우려는 충분하다. 이와 같은 이유로 문장의 순서를 역순으로 바꿔 정방향과 역방향의 정보를 사용해 앞단의 정보까지 기억하게끔 하는 테크닉도 소개가 되었다. 또한 seq2seq모델에 추가적인 Attention이라는 기법을 사용하게 된다.
Attention은 마지막 hidden vector만을 사용하는게 아니라 time step별로 생성되는 각각의 들을 decoder로 제공하여 필요한 정보를 사용할 수 있게 구성된다.
encoder의 들은 의 차원을 갖게 되고 decoder의 첫번째 hidden vector 는 의 차원을 갖게 된다.
decoder는 encoder의 각각의 정보를 사용하기 위해 내적을 수행하게 되고 의 차원을 갖는 내적값에 softmax를 취해 확률값을 얻게 된다.(attention vector)
이렇게 얻은 확률값과 그 확률값에 상응하는 와 곱하게 된다. 이런 계산은 encoder의 각각의 정보를 얼마나 사용할지를 정한다고 봐도 되며 이렇게 구한 값을 attention output이라고 부른다.
최종적으로 attention output과 decoder의 vector와의 concat을 통해 output layer에 사용되게 된다.
decoder의 hidden state vector의 입장에서는 2가지의 역할을 하게 되는데 첫번째는 해당 time step에서의 output layer의 입력으로 사용되고 두번째로 encoder의 vector중 어떤 vector를 가져와야 하는지를 결정하는 역할을 하게 된다.
따라서 backpropagation을 할때도 encoder의 정보를 적절하게 가져올 수 있도록 학습된다.
decoder는 해당 time step의 output이 다음 step의 input으로 사용되게 되는데 train 관점에서는 output이 잘못 예측되었다 하더라도 ground truth를 넣어주게된다. inference에서는 이전 output이 현재 input으로 사용된다.
이처럼 잘못된 output이 다음 input으로 주어지지 않고 ground truth로 주어지는 train과정을 Teacher Forcing라고 한다.
Teacher Forcing은 빠른 학습을 기대할 수 있지만 실제 Test환경과 다르기 때문에 괴리가 발생한다. 따라서 이 둘의 방법을 결합한 방법을 사용할 수 있는데 보통 Teacher Forcing을 사용하다 어느정도 성능이 상승한 후반부에는 Teacher Focing을 사용하지 않는 방법도 존재한다.
dot
general
concat
일반적인 dot product로 유사도를 구하게 되는 상황은 로 이해할 수 있다. 이처럼 항등행렬 를 조금씩 바꿔 선형변환을 하게 되는 방법을 general이라고 한다. concat은 두 벡터를 결합해 하나의 스칼라(유사도)를 나타내거나 layer를 여러개 쌓을 수도 있다. 위의 concat식은 를 통해 벡터의 값으로 표현되고 이 벡터를 스칼라로 표현하기 위해 라는 벡터와의 내적을 통한 계산이 이루어진다.
위의 이미지에서 Europ, Economy, Area가 역방향의 정보를 쓰고 있는것을 알 수 있듯이 attention mechanism을 통해 decoder(가로)는 encoder(세로)의 정보를 적절하게 활용하는 것을 확인할 수 있다.
또한 Syria가 여러개의 단어의 정보를 사용하는 경우도 존재한다.
attention summary
attention은 decoder의 time step마다 적절한 encoder의 정보를 사용할 수 있게 했다.
attention은 bottleneck problem(encoder의 마지막 hidden state만 사용하는 문제)를 해결했다.
attention 없이 decoder의 output이 encoder의 앞단의 time step에 전달해야 한다면 긴 time step으로 인해 발생하는 gradient vanishing 해결할 수 있다. decoder의 매 time step마다 어떠한 time step도 거치지 않고 attention을 통해 gradient가 전달되기 때문이다.