※ KAIST 주재걸 교수님 강의 및 자료를 바탕으로 작성한 글입니다.
Seq2seq
Sequence-to-sequence는 many to many 문제로 encoder를 통해 input sequence를 모두 읽은 후 decoder로 output sequence를 생성 및 예측하는 문제이다.
Sequence-to-sequence는 sequence of words를 input으로 받아 sequence of words를 output으로 주며, 크게 encoder와 decoder로 구성되어있다.
encoder와 decoder는 parameter를 share하지 않으며 encoder의 마지막 time step의 hidden state vector는 decoder의 첫 번째 time step에 들어오는 h0가 된다.
문장을 생성할 때, 문장의 첫 부분이라는 정보를 주기 위해 <sos>라는 start of sentence token을 vocabulary에 저장하여 decoder의 첫번째 time step의 x로 넣는다.
마찬가지로 문장의 마지막 부분이라는 정보를 주기 위해 <eos>라는 end of sentence token을 vocabulary에 저장하여 decoder의 마지막 output이 <eos>토큰이면 더 이상 생성하지 않는다.
Seq2seq with Attention
Seq2seq의 hidden size가 고정되어 있다는 특징때문에 short sentece든 long sentence든 정해진 size에 모든 정보를 압축해야 하며, LSTM이더라도 오래전 과거의 정보는 왜곡되거나 손실될 수 있다. 그럼에도 불구하고 Seq2seq의 decoder는 encoder 마지막 time step의 hidden state vector 하나에만 의존을 한다.
이러한 문제를 해결하기 위한 방법으로 Attention모듈을 사용하는데, Attention의 기본 아이디어는 encoder의 매 time step의 hidden state vector 모두를 decoder에 전달하고 decoder의 각 time step에서 필요한 hidden state vector를 선별적으로 사용하는 것이다.
위의 자료를 보면 decoder의 특정 time step에서 필요한 hidden state vector들만 가져와서 활용을 하는 것을 확인할 수 있다.
Attention의 동작 방식을 자세하게 알아보자.
위의 그림은 불어를 영어로 번역하는 task이고, 하단의 빨간색 vector는 encoder의 매 time step마다의 hidden state들이다. 마지막 hidden state vector는 decoder의 h0이 되어 x와 곱셈을 하며 이것이 하단의 초록색 vector이다. 여기까지는 Seq2seq의 방식이며 이제부터 Attention이 시작된다. encoder의 모든 hidden state vector를 고려하기 위해 초록색 vector와 빨간색 vectore들의 내적을 각각 구한다. 내적으로 부터 얻은 유사도에 softmax를 취하여 각 hidden state를 얼마나 반영할 것인지를 의미하는 weight를 구한다. 이 weight들을 Attention vector라 부른다. Attention모듈의 output은 encoder hidden state들의 가중 평균 vector가 되며, 이는 context vector라고도 부른다.
따라서 Attention모듈의 input은 초록색 vector와 빨간색 vector들이고, output은 가장 상단의 vector가 된다. 초록색 decoder hidden state vector와 Attention output vector를 concatenate하여 output layer의 input으로 넣으면 output으로 다음 단어를 예측한다.
decoder hidden state vector와 Attention output vector는 h1이 되어 다음 단계의 hidden state로 전달되며 이는 새로운 x와 곱셈을 하여 하단의 두번쨰 초록색 vector가 된다. 마찬가지로 이 vector로 encoder의 빨간색 hidden state vector들과 내적을 통해 유사도를 계산한 후 가중 평균 벡터를 구한 후, 이 가중 평균 벡터와 concatenate하여 output layer의 input으로 들어가 output을 예측하게 된다.
Teacher forcing
decoder의 학습 과정을 보면, 이전 time step의 output과 별개로 ground truth가 다음 time step의 input으로 들어간다. 아래 그림에서 input으로 the가 들어갔을 때 poor이 아닌 단어를 예측하더라도 ground truth인 poor이라는 단어를 다음 input으로 넣게 된다. 이러한 방식을 Teacher forcing이라 한다. 이와 달리 추론할 때처럼 학습을 할 때도 예측한 결과를 다음 time step의 input으로 넣는 경우가 있는데, 그런 경우는 추론 상황과 비슷하므로 더 좋은 결과를 낼 수 있지만 학습 과정이 더 복잡하고 예측 결과가 도출된 후에 다음 input을 넣을 수 있으므로 시간이 많이 걸린다.
Attention에서 유사도를 구하는 다양한 방법
decoder hidden state vector와 encoder hidden state vector들 간의 유사도를 구할 때 기본적인 dot product를 수행했다. 이 방법 이외 다른 방법을 제시하였는데 바로 general과 concat 방법이다.
■ general 방식
기본적인 dot product는 곱셈 사이에 단위행렬(I)이 곱해졌다고 볼 수도 있다. 여기서 주대각선에 1이 아닌 다른 숫자를 넣으면 아래와 같은 일이 일어난다.
기존의 [1, 3], [2, -5]를 dot product하면 1x2 + 3x(-5)인데, 그 사이에 주 대각선이 [1, 4]이고 나머지는 0인 행렬을 추가로 곱하면 [1x1, 3x4], [2, -5]를 dot product하게 되어 1x1x2 + 4x3x(-5)가 된다. 비교를 해보면, 후자의 경우 각 원소에 1배, 4배 weight를 주게 됨을 알 수 있다.
나아가서, 0으로 채워진 반대 대각선에도 새로운 숫자를 넣고 곱셈을 하면 아래와 같은 일이 일어난다.
[1, 3], [2, -5]사이에 [[1, 7], [-8, 4]] 행렬을 곱하면, [1x1+3x(-8), 1x1+3x4], [2, -5]를 dot product하여
(-8)x3x2 + 7x1x(-5)가 된다. 이는 [1, 3], [2, -5]에서 첫번째 벡터의 첫번째 원소와 두번째 벡터의 두번째 원소끼리 곱한것에 7배의 weight를 주고, 첫번째 벡터의 두번째 원소와 두번째 벡터의 첫번째두번째 원소끼리 곱한 것에 -8배의 weight를 주는 것이 된다.
이처럼 두 개의 벡터간 유사도를 구하기 위해 가운데에 학습가능한 행렬을 두어 원소에 weight를 부여함으로써 더 합당한 내적을 수행하는 방식을 general방식이라고 한다.
■ concat 방식
이는 유사도를 구하고자하는 두 벡터를 multi-layer neural network의 input으로 넣어 학습하여 유사도를 나타내는 scalar output을 도출하는 방식이다.
concat 방식의 수식을 보면 ht와 hs를 concat(;)하여 Wa라는 가중치를 곱한 후 tanh activation function을 거치며 위의 그림에서는 W1이 Wa로 볼 수 있다. 그 후 va를 transpose한 것을 곱하는데, 이 때 va가 대문자 볼드체가 아닌 이유는 최종적으로 scalar값을 도출하기 위해서는 va의 형상이 1차원 벡터가 되어야 하기 때문이다. 두 벡터를 input으로 넣을 때 concat을 하여 이 방식을 concat방식이라 한다.
general방식과 concat방식의 경우, 학습가능한 파라미터가 포함되므로 아래 그림의 Attention scores부분에서 계산을 할 때 단순 dot product가 아닌 trainable parameter가 포함된 연산이 수행된다.
Attention의 장점
'AI > 딥러닝' 카테고리의 다른 글
[NLP] Transformer (0) | 2021.09.19 |
---|---|
[NLP] Beam search decoding , BLEU score (2) | 2021.09.12 |
[NLP] NLP Tasks , Bag of Words , Word Embedding , GloVe (0) | 2021.09.09 |
[이미지 분류] Modeling (0) | 2021.08.27 |
[이미지 분류] Data Processing (0) | 2021.08.24 |
댓글