(05강) Sequence to Sequence with Attention

  • Sequence를 Encoding, Decoding 할 수 있는 sequence to sequence(Seq2Seq)

  • Seq2Seq에 Attention 로직을 추가한 모델

Further Reading

1. Seq2Seq (Sequence to Sequence)

Many to Many에 속하는 모델로 아래와 같은 Task에서 활용된다.

  • 기계 번역 (Machine Translation)

  • 챗봇 (Chatbot)

  • 내용요약 (Text Summarization)

  • STT (Speech to Text)

1.1. Basic Structure

  • 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 함수를 통해 출력 시퀸스의 각 단어별 확률값을 반환하고, 디코더는 출력 단어를 결정한다.

1.2. Teacher Forcing (교사강요)

Seq to Seq 모델에서 Train에 사용하는 기법이다. 만약 초기에 예측한 값이 틀린 값이라면 그 이후로도 계속 잘못된 정보를 가지고 예측하게 될 가능성이 높고 연쇄작용으로 디코더 전체의 예측을 어렵게 한다. 이를 방지하기 위해 모든 시점에 대해서 예측값이 아닌 실제값을 입력해 주는 방법이다.

1.3. 한계점

  • 하나의 고정된 크기의 벡터(Context Vector)에 모든 정보를 압축하다보니 정보손실이 발생한다.

  • RNN의 고질적인 문제인 기울기 소실(Vanishing Gradient) 문제가 발생한다.

위와 같은 문제를 보완하기 위해 Attention이란 기법이 등장하였다.

2. Attention (어텐션 메커니즘)

어텐션의 기본 아이디어는 디코더에서 출력단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고 한다는 점이다. 단, 전체 입력문장을 동일 비율이 아닌 가중치를 줌으로서 연관이 있는 입력 단어부분을 좀 더 집중(Attention) 한다.

  • $Attention(Q, K, V) = Attention Value$

  • 어텐션 함수는 주어진 쿼리(Q) 에 대해서 모든 키(K) 와의 유사도를 각각 구합니다.

  • 구해낸 유사도를 키와 매핑되어있는 각각의 값(V) 에 반영해줍니다.

  • 유사도가 반영된 값(V)를 모두 더해서 리턴하며 이를 'Attention Value' 라고 한다.

2.1. Basic Structure

  • h1,h2,...,hNh_1, h_2, ..., h_N : 인코더의 hidden state

  • sts_t : t에서의 디코더의 hidden state

  • score(st,hi)=stThiscore(s_t, h_i) = s_t^T h_i : hNh_Nsts_t Transpose 의 내적 값을 score로 정한다.(score 함수는 다양한 기법으로 사용가능, 여기서는 dot-product)

  • et=[stTh1,...,stThN]e^t = [s_t^Th_1, ..., s_t^Th_N] : sts_t의 모든 hh와의 scorescore의 모음

  • ete^t에 소프트맥스 함수를 적용하여 확률분포를 얻어낸다. 이를 어텐션 분포(Attention Distribution)라고 한다.

  • 어텐션 분포의 각각의 값을 어텐션 가중치 (Attention Weight)라고 한다.

  • αt=softmax(et)\alpha^t = softmax(e^t)

  • 어텐션의 최종 결과값을 구하기 위해 각 인코더의 hidden state와 어텐션 가중치값을 곱하고, 최종적으로 모두 더합니다.

    at=i=1Nαithiat = \sum_{i=1}^{N}{\alpha_i^th_i}

  • 이러한 어텐션 값 ata_t를 Context Vector 라고도 불립니다. (seq2seq와 같은 개념은 아님.)

  • 어텐션 값(ata_t)과 디코더의 hidden state (sts_t)의 결합(Concatenate)하여 하나의 벡터로 생성한다.

  • vt=concat(st,at)v_t = concat(s_t, a_t)

  • 논문에서는 vtv_t를 바로 출력층으로 보내기 전에 신경망 연산을 한번 더 추가하였습니다.

  • 가중치 행렬과 곱한후 tanh함수를 씌워 새로운 벡터 st~\widetilde{s_t}를 얻습니다.

  • seq2seq에서는 출력층의 입력이 sts_t였다면, 여기서는 st~\widetilde{s_t}이 되는 것이다.

  • 즉, st~=tanh(Wc[at;st]+bc)\widetilde{s_t} = tanh(W_c[a_t;s_t] +b_c)로 볼 수 있다.(위 그림)

  • 출력 : yt^=Softmax(Wyst~+by)\hat{y_t} = Softmax(W_y\widetilde{s_t} + b_y)

2.2. 요약

  1. 인코더의 hidden state(h)와 디코더의 hidden state(s)를 활용하여 score를 구한다.(다양한 기법의 score함수 존재)

  2. 위에서 구한 score 집합 $e^t$를 소프트맥스 함수를 적용하여 attention 분포와 가중치값을 구한다.

  3. 각 인코더의 hidden state(h)와 어텐션 가중치를 각각 곱하고, 이를 모두 더해 어텐션 값($a_t$)을 구한다.

  4. 어텐션 값과 디코더의 hidden state(s)를 결합(Concat)하여 하나의 벡터로 생성한다,

  5. 위 concat값을 output layer의 입력값으로 입력되어 결과를 얻게 된다.

2.3. 장점

  • 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

Sequence to Sequence

Reference

Last updated