(05강) Sequence to Sequence with Attention
Last updated
Last updated
Sequence를 Encoding, Decoding 할 수 있는 sequence to sequence(Seq2Seq)
Seq2Seq에 Attention 로직을 추가한 모델
Further Reading
Many to Many에 속하는 모델로 아래와 같은 Task에서 활용된다.
기계 번역 (Machine Translation)
챗봇 (Chatbot)
내용요약 (Text Summarization)
STT (Speech to Text)
Encoder와 Decoder 영역으로 나뉘며 각각이 RNN모델로 구성되어 있다.
인코더에서 입력 문장의 모든 단어들을 순차적으로 입력 받은 뒤 이를 Context Vector로 만들고, Decoder는 이 Context Vector를 받아 번역된 단어를 순차적으로 출력하게 된다.
위의 내용을 다시 정리해보면 문장의 단어(토큰) 단위를 순차적 인코더에 입력하게 되고 인코더 RNN의 마지막 셀에서 Hidden State (은닉상태)를 디코더 RNN에게 넘겨주게 되는데 이를 Context Vector라고 한다.
디코더는 초기 입력으로 <sos>(start of sentence)로 시작하게 되고, 마지막은 <eos> (end of sentence)로 마침으로써 문장의 시작과 끝에 대해 알 수 있도록 하였다.
디코더 과정은 <sos>를 디코더 RNN에 입력하여 다음에 올 단어를 예측하고 -> 예측한 단어를 그 다음 RNN 셀에 입력하는 식으로 <eos>가 예측값으로 나올때까지 반복된다.
출력 단어로 나올 수 있는 단어들은 다양한 단어들이 있다. 여기서 한 단어를 선택하기 위해 Softmax 함수를 사용하게 된다.
디코더는 각 시점(time step)의 RNN 셀에서 출력 벡터가 나오면, 해당 벡터는 softmax 함수를 통해 출력 시퀸스의 각 단어별 확률값을 반환하고, 디코더는 출력 단어를 결정한다.
Seq to Seq 모델에서 Train에 사용하는 기법이다. 만약 초기에 예측한 값이 틀린 값이라면 그 이후로도 계속 잘못된 정보를 가지고 예측하게 될 가능성이 높고 연쇄작용으로 디코더 전체의 예측을 어렵게 한다. 이를 방지하기 위해 모든 시점에 대해서 예측값이 아닌 실제값을 입력해 주는 방법이다.
하나의 고정된 크기의 벡터(Context Vector)에 모든 정보를 압축하다보니 정보손실이 발생한다.
RNN의 고질적인 문제인 기울기 소실(Vanishing Gradient) 문제가 발생한다.
위와 같은 문제를 보완하기 위해 Attention이란 기법이 등장하였다.
어텐션의 기본 아이디어는 디코더에서 출력단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고 한다는 점이다. 단, 전체 입력문장을 동일 비율이 아닌 가중치를 줌으로서 연관이 있는 입력 단어부분을 좀 더 집중(Attention) 한다.
$Attention(Q, K, V) = Attention Value$
어텐션 함수는 주어진 쿼리(Q) 에 대해서 모든 키(K) 와의 유사도를 각각 구합니다.
구해낸 유사도를 키와 매핑되어있는 각각의 값(V) 에 반영해줍니다.
유사도가 반영된 값(V)를 모두 더해서 리턴하며 이를 'Attention Value' 라고 한다.
: 인코더의 hidden state
: t에서의 디코더의 hidden state
: 과 Transpose 의 내적 값을 score로 정한다.(score 함수는 다양한 기법으로 사용가능, 여기서는 dot-product)
: 의 모든 와의 의 모음
에 소프트맥스 함수를 적용하여 확률분포를 얻어낸다. 이를 어텐션 분포(Attention Distribution)라고 한다.
어텐션 분포의 각각의 값을 어텐션 가중치 (Attention Weight)라고 한다.
어텐션의 최종 결과값을 구하기 위해 각 인코더의 hidden state와 어텐션 가중치값을 곱하고, 최종적으로 모두 더합니다.
이러한 어텐션 값 를 Context Vector 라고도 불립니다. (seq2seq와 같은 개념은 아님.)
어텐션 값()과 디코더의 hidden state ()의 결합(Concatenate)하여 하나의 벡터로 생성한다.
논문에서는 를 바로 출력층으로 보내기 전에 신경망 연산을 한번 더 추가하였습니다.
가중치 행렬과 곱한후 tanh함수를 씌워 새로운 벡터 를 얻습니다.
seq2seq에서는 출력층의 입력이 였다면, 여기서는 이 되는 것이다.
즉, 로 볼 수 있다.(위 그림)
출력 :
인코더의 hidden state(h)와 디코더의 hidden state(s)를 활용하여 score를 구한다.(다양한 기법의 score함수 존재)
위에서 구한 score 집합 $e^t$를 소프트맥스 함수를 적용하여 attention 분포와 가중치값을 구한다.
각 인코더의 hidden state(h)와 어텐션 가중치를 각각 곱하고, 이를 모두 더해 어텐션 값($a_t$)을 구한다.
어텐션 값과 디코더의 hidden state(s)를 결합(Concat)하여 하나의 벡터로 생성한다,
위 concat값을 output layer의 입력값으로 입력되어 결과를 얻게 된다.
Attention significantly improves NMT performance
It is useful to allow the decoder to focus on particular parts of the source
Attention solves the bottleneck problem
Attention allows the decoder to look directly at source; bypass the bottleneck
Attention helps with vanishing gradient problem
Provides a shortcut to far-away states
Attention provides some interpretability
By inspecting attention distribution, we can see what the decoder was focusing on
The network just learned alignment by itself