2021.05.24 - [Study/NLP] - [NLP/자연어처리] Seq2Seq(1) - RNN을 이용한 시퀀스 투 시퀀스
해당 글은 딥러닝을 이용한 자연어 처리 입문 의 내용을 바탕으로 정리한 내용이며, 시각적인 자료로 Jay Alammar의 블로그를 첨부했습니다.
0. 기본 Seq2Seq 에서의 단점
앞의 글에서 배운 seq2seq 모델은 인코더를 통해 나온 마지막 hidden state값을 context 벡터로 두고 해당 벡터를 디코더에 입력함으로 출력 시퀀스를 만들어내는 과정이었다. 이러한 RNN에 기반한 seq2seq모델에는 문제점이 두가지가 있었는데, 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하니 정보 손실이 발생한다는 점, RNN의 고질적인 문제인 기울기 소실(Vanishing Gradient) 문제였다.
즉, 기계번역 분야에서 입력 문장이 길어지면 번역 품질이 떨어지는 현상을 나타냈다. 이를 위한 대안으로 어텐션(Attention) 매커니즘이 발표되었다.
1. 어텐션(Attention)함수
어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점(time step)마다, 인코더에서 전체 입력 문장을 다시 한번 참고한다는 점이다. 그러나 전체 입력 문장을 동일한 중요도로 참고하는 것이 아니라 해당 시점에서 예측할 단어랑 연관있는 입력 단어 부분에 더 가중치를 주어 참고할 수 있는 것이다.
어텐션에는 Q(Query), K(Key), V(Value)를 기준으로 설명을 하게 되는데, 그림으로 표현하면 다음과 같다.
어텐션을 함수로 표현하면 Attention(Q, K, V) = Attention Value로 표현할 수 있다. 오늘 배우는 seq2seq + 어텐션 모델에서 Q, K, V의 정의는 다음과 같다.
- Q(Query) : t시점의 디코더 셀에서의 은닉상태
- K(Keys) : 모든 시점의 인코더 셀의 은닉 상태
- V(Values) : 모든 시점의 인코더 셀의 은닉 상태'
어텐션 함수도 다양한 종류가 있는데, 오늘은 가장 유명하고 널리 알려져 있는 루옹 어텐션 함수에 대해서 알아보고자 한다. 우선 간단한 시각화 영상을 보면 아래와 같다.
위의 동영상의 내용처럼 인코더 블럭에 나온 hidden state가 다음 encoder cell에만 전해지는게 아니라 전체 hidden state가 context vector로 decoer에 입력으로 들어간다. 디코더의 매 시점마다 비슷한 과정이 이루어져 결과값을 예측힌다. 전체적인 어텐션 메커니즘에 대해 상세히 알아보자
2. Attention 매커니즘 방법
어텐션 매커니즘에 대해 상세히 알아보도록 하자.
1. 어텐션 스코어(Attention Score)를 구한다.
동영상을 기준으로 인코더의 시점이 각각 1, 2, 3이라고 했을 때 인코더의 hidden state를 각각 $h_1, h_2, h_3$이라고 하자. 디코더의 현재 시점 $t_4$에서 나오는 hidden state가 있다고 하자. 둘의 은닉 상태의 차원은 동일함을 가정하자.
decoder hidden state로 나온 값의 transpose한 값과, encoder의 각 시점의 hidden state를 곱해서 Attention Score를 구한다. 어텐션 스코어 함수를 정의해보면 다음과 같다.
$$ attention score(s_t, h_i) = s_t^Th_i $$
$s_t$ 와 인코더의 모든 은닉 상태의 어텐션 스코어의 모음값을 $e^t$라고 정의하면 $e^t$의 수식은 다음과 같다.
$$e^4 = [s_4^T, h_1, s_4^T, h_2, s_4^T, h_3] $$
2. 소프트 맥스(softmax) 함수를 통해 어텐션 분포를 구한다.
$e^4$ 벡터에 소프트 맥스 함수를 적용해서, 모든 값을 합하면 1이 되는 확률분포를 얻어낸다. 이를 어텐션 분포(Attention Distribution)이라고 하며, 각 값을 Attention Weight 이라고 한다. 이를 수식으로 나타내면 아래와 같다.
$$ \alpha^t = softmax(e^t)$$
3. 각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값을 구한다.
각 어텐션의 Encoder hidden state의 값과 sofmax를 거친 어텐션 가중치값들을 곱하고, 최종적으로 모두 더해 context vector를 생성한다. 요약하면 가중합을 한다고 할 수 있다. 그러면 최종적인 Attention Value가 된다. Context Vector라고도 한다. (앞에서 말했던 seq2seq의 인코더 마지막 은닉상태를 말하는 context vector랑은 의미가 다르다.)
4. 어텐션 값과 디코더 t시점의 은닉 상태를 concatenate한다.
어텐션 값, 즉 context vector를 구해 디코더 t시점의 hidden state와 concat하여 하나의 벡터로 만든다. 이를 다음 시점(또는 최종 출력값) 연산의 입력으로 사용함으로써 인코더로부터 얻은 정보를 활용하여 다음 시점을 더 잘 예측할 수 있게된다. 그 다음으로 fully connected 함수를 사용하여 입력할 때의 차원 수와 맞춰주어야 한다.
초반 어텐션 매커니즘은 RNN기반의 seq2seq성능을 보장하기 위한 목적으로 소개되었지만, 현재는 어텐션 스스로가 기존의 seq2seq를 대체하는 방법이 되어가고 있다. 그걸 self-attention이라고 하는데, transformer 부분에서 자세히 다룰 예정이다.
'Study > NLP' 카테고리의 다른 글
[NLP/자연어처리] Seq2Seq4 - 트랜스포머(Transformer)_Decoder (0) | 2021.05.26 |
---|---|
[NLP/자연어처리] Seq2Seq(3) - 트랜스포머(Transformer)_Encoder (0) | 2021.05.26 |
[NLP/자연어처리] Seq2Seq(1) - RNN을 이용한 시퀀스 투 시퀀스 (0) | 2021.05.24 |
[NLP/자연어처리] LSTM(Long Short-Term Memory), GRU(Gated Recurrent Unit) (0) | 2021.05.21 |
[NLP/자연어처리] 순환신경망 (Recurrent Neural Network, RNN) (0) | 2021.05.20 |