본문 바로가기
DL/NLP

[DL][NLP] Attention Mechanism(어텐션 메커니즘)

by 어떻게든 되겠지~ 2024. 10. 28.

1. Attention Mechanism 등장 배경

Seq2Seq 모델은 Encoder에서 Input Sequence를 Context Vector라는 하나의 고정된 크기의 벡터 표현으로 압축하고, Decoder는 이 Context Vector를 통해 Output Sequence를 만들어낸다.     

 

하지만 이러한 RNN에 기반한 Seq2Seq 모델에는 크게 두 가지 문제가 있다.

  • 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하니 정보 손실이 발생
  • RNN의 고질적인 문제인 Vanishing Gradient 문제

결국 기계 번역 분야에서 입력 문장이 길어지면 성능이 떨어지는 현상이 나타났고, 이를 위한 대안으로 Input Sequence가 길어지면 출력 Sequence의 정확도가 떨어지는 것을 보정해주기 위한 기법인 Attention이 등장하였다.

 

2. Attention Mechanism의 Idea

Attention의 기본 아이디어는 Decoder에서 출력 단어를 예측하는 매 시점마다, Encoder에서의 전체 입력 문장을 다시 한 번 참고한다는 점이다.      
단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(Attention)해서 보게 된다.    

 

Attention에서는 Encoder 부분에서 Input Sequence 길이에 맞는 Output(Hidden State)이 나오게 되는데 이걸 이용한다.

각각의 Input 단어를 거치면서 갱신되는 Hidden State 값($h_1, h_2, ... h_n$)들을 매번 가지고 있고, 이 값들을 참고해서 Decoder에서 출력 단어가 생성될 때마다 이를 Decoder의 출력에 반영한다.

 

3. Attention Function

Attention Function은 Input Sequence의 각 요소와 다른 요소들과의 관계를 고려하여, 중요한 정보에 집중하도록 가중치를 부여하는 함수이다.         
주로 Query, Key, Value라는 세 가지 벡터를 활용하여 각 입력 요소 간의 유사도를 계산하고, 유사도에 따라 가중치를 조정해 Sequence에서 중요한 정보에 집중할 수 있도록 한다. 

 

Attention Funtion을 식으로 표현하면 다음과 같이 표현된다        
$$Attention(Q, K, V) = Attention\;Value$$

Attention Function은 주어진 "Query Q"에 대해서 모든 "Key K"와의 유사도를 각각 구한다. 그리고 구한 유사도를 Key와 Mapping 되어있는 각각의 "Value V"에 반영해준다               
그리고 유사도가 반영된 값을 모두 더해서 리턴하고 이 값을 Attention Value라고한다        

  • Q : t 시점의 Decoder Cell에서의 Hidden State
  • K : Encoder Cell에서의 모든 시점에서의 Hidden State
    • Query와 비교하여 유사도를 계산
    • Query와 Key 간의 내적을 통해 얼마나 관련성이 있는지 판단하는 기준으로 작용
  • V : Encoder Cell에서의 모든 시점에서의 Hidden State
    • 계산된 유사도에 따라 가중치가 적용되어 실제로 Decoder에 전달될 정보

4. Attention 동작 과정

Attention에 많은 종류가 있는데 그 중에서도 가장 이해하기 쉬운 Dot Product Attention으로 예시를 들어보겠다.

 

 

 

위 그림에서 Decoder의 세번째 LSTM Cell에서 출력 단어를 예측할 때, Attention 메커니즘을 이용하는 모습을 보여준다.        
Decoder의 첫번째, 두번째 LSTM Cell은 이미 Attention 메커니즘을 통해 je, suis를 예측하는 과정을 거쳤다고 가정한다. Decoder의 세번째 LSTM Cell은 출력 단어를 예측하기 위해 Encoder의 모든 입력 단어 정보를 다시 한번 참고하고자 한다. 여기서 Encoder의 Output에 Softmax를 적용하여 "I", "am", "a", "student" 단어 각각이 Decoder의 세번째 출력 단어를 예측할 때 얼마나 도움이 되는지를 수치화한다.
각 입력 단어가 Decoder에 예측에 도움이 되는 정도를 수치화하여 이를 하나의 정보로 담아 Decoder로 전송한다. 결과적으로 Decoder는 출력 단어를 더 정확하게 예측할 확률이 높아진다 

 

Attention Score

Attention ScoreQuery와 Key 벡터 간의 유사도를 측정한 값으로, Encoder 입력 시퀀스의 각 요소가 얼마나 중요한지(유사한지)를 나타낸다. Decoder가 특정 시점에서 어느 Encoder의 Hidden State에 주목해야 하는지 결정하는 데 도움을 준다.

  

 

Encoder의 각 시점을 1, 2, ..., N이라고 하였을 때, Encoder의 Hidden State를 각각 $h_1, h_2, \cdots, h_N$이라고 하자. 또한, Decoder의 현재 시점 t에서의 Hidden State를 $s_t$라고 하자.(Encoder, Decoder의 Hidden State의 차원이 같다고 가정)
여기서 Decoder의 현재 시점 t에서 필요한 값은 이전 시점 t-1에서의 Hidden State($s_{t-1}$) 이전 시점 t-1에서 나온 출력 단어이다.         
그런데 Attention Mechanism에서는 Decoder 출력 단어의 예측에 Attention Value라는 새로운 값을 더 필요로 한다. 이 때 t번째 단어를 예측하기 위한 Attention Value를 $a_t$라 하자      

 

Attention Value $a_t$를 구하기 위해  Attention Score를 구해야한다.
Attention Score란 Decoder의 시점 t에서의 단어를 예측하기 위해, Encoder의 모든 Hidden State 각각이 Decoder 현 시점의 Hidden State $s_t$와 얼마나 유사한지를 판단하는 값이다.

Dot Product Attention은 Score 값을 구하기 위해 $s_t$의 Transpose ${s_t$}^T와 Encoder의 각 Hidden State $h_i$와 Dot Product를 수행한다.(결과가 스칼라값)

 

즉, 함수로 정의해보면 아래와 같다.   
$$Attention\;Score(s_t, h_i) = {s_t}^T h_i$$
여기서 $s_t$와 Encoder의 모든 Hidden State와의 계산을 통해 구한 Attention Score 값들을 $e_t$라 하면 아래의 식과 같다.
$$e_t = [{s_t}^T h_1, {s_t}^T h_2, \cdots, {s_t}^T h_N]$$

 

Softmax를 통해 Attention Distribution 구하기

위에서 구한 $e_t$에 $softmax$를 적용하게되면, 모든 값의 합이 1인 확률 분포를 얻게된다. 이를 Attention Distribution이라 하며, 각각의 값은 Attention Weight라고 한다.    

여기서 Decoder의 시점 t에서의 Attention Weight의 모음값인 Attention Distribution을 ${\alpha}^t$라고 할때 ${\alpha}^t$는 아래와 같이 정의된다. 

$${\alpha}^t = softmax(e_t)$$  

 

Attention Weight와 각 Encoder의 Hidden State를 가중합하여 Attention Value 구하기

 

이제 지금까지 구한 정보들을 하나로 합쳐 Attention Value를 구하는 단계이다   
Attention Value를 얻기 위해 각 Encoder의 Hidden State($h_i$)와 Attention Weight(${\alpht_i}^t$)를 곱하고, 최종적으로 모두 더한다.즉, Weighted Sum(가중합)을 진행한다.    
Attention Mechanism의 최종 결과, 즉 Attention Function의 출력 값인 Attention Value $a_t$에 대한 식은 아래와 같다    
$$a_t = \sum \limits_{t=1}^{N} \alpha_i^t h_i$$
이 Attention Value $a_t$는 종종 Encoder의 문맥을 포함하고 있다고 하여 Context Vector라고도 불린다.    

 

Attention Value와 Decoder의 t 시점의 Hidden State와 연결

구한 Attention Value $a_t$와 $s_t$를 결합(concatenate)하여 하나의 벡터로 만든다. 이 벡터를 $v_t$라고 하자   
이 $v_t$를 $\hat{y}$ 예측 연산의 입력으로 사용하므로서 Encoder로부터 얻은 정보를 활용하여 $\hat{y}$를 좀 더 잘 예측할 수 있게 된다.

출력층 연산이 입력이 되는 $\tilde{s_t}$ 계산

$v_t$를 바로 출력층으로 보내기 전에 신경망 연산을 한번 더 추가하였다.   
가중치 행렬 $W_c$와 곱한 후 $tanh$ 함수를 지나도록하여 출력층 연산을 위한 새로운 벡터인 $\tilde{s_t}$를 얻는다.
이를 식으로 표현하면 아래와 같다($W_c$: 학습 가능한 가중치 행렬, $b_c$ : bias)
$$\tilde{s_t} = tanh(W_c[a_t;s_t] + b_c)$$

$\tilde{s_t}$를 출력층의 입력으로 사용

$\tilde{s_t}를 출력층의 입력으로 사용하여 예측 벡터를 얻는다.    
$$\hat{y_t} = softmax(W_y \tilde{s_t} + b_y)$$


지금까지 Attention Mechanism에 대해서 알아보았습니다.

예제에서는 Dot Product Attention을 사용하였는데 더 다양한 연산 방법을 아래에서 소개하겠습니다.

 

- Dot Product Attention
  - $score(s_t, h_i) = {s_t}^T h_i$
- Scaled Dot Product Attention
  - $score(s_t, h_i) = \frac{{s_t}^T h_i}{\sqrt{n}}$
- General Attention
  - $ score(s_t, h_i) = {s_t}^T W_a h_i$
- Concat Attention(Bahdanau Attention)
  - $score(s_t, h_i) = {W_a}^t tanh(W_b[s_t;h_i])$
  - $score(s_t, h_i) = {W_a}^t tanh(W_b s_t W_c h_i)$
- Location-base Attention
  - $\alpha_t = softmax(W_a s_t)$

반응형