어텐션 메커니즘 (Attention Mechanism)이란?

1. Attention Mechanism란?

 

seq2seq 모델은 기존의 RNN 모델과 같이 고정된 길이의 벡터를 입력으로 받아 고정된 길이의 벡터를 출력하는 구조를 가지고 있습니다. 그러나 이 구조는 고정된 길이의 벡터 압축으로 시퀀스의 길이가 길어질수록 정보의 손실이 발생할 수 있습니다. (seq2seq의 자세한 설명은 링크를 통해 확인할 수 있습니다.)



이러한 한계를 보완하기 위해 Attention mechanism이 도입되었습니다. Attention mechanism은 입력 문장의 모든 단어를 동일한 가중치로 취급하지 않고, 출력 문장에서 특정 위치에 대응하는 입력 단어들에 더 많은 가중치를 부여합니다. 이를 통해 입력과 출력의 길이가 다른 경우에도 모델이 더욱 정확하고 유연하게 작동할 수 있게됩니다. 

 


2. Attention Function

 

Attention Function은 입력 시퀀스의 각 단어들에 대한 가중치를 계산하는 함수입니다. 이 함수는 각 단어의 중요도를 측정하여 출력 결과에 반영합니다. Attention Function은 크게 세 가지 요소로 구성됩니다. 첫 번째 요소는 Query, 두 번째 요소는 Key, 세 번째 요소는 Value입니다. Query는 현재 출력 단어를 나타내는 벡터(t 시점의 디코더 셀에서의 은닉 상태)이고, Key와 Value는 입력 시퀀스의 각 단어에 대응하는 벡터(모든 시점의 인코더 셀의 은닉 상태들)입니다.

 

 

Attention Function, Query,Key,Value 설명 이미지

 


Attention Function은 먼저 Query 벡터와 Key 벡터 간의 유사도를 측정합니다. 이 유사도는 내적, 외적 등 다양한 방법으로 계산될 수 있습니다. 이후 유사도를 정규화하여 각 단어의 가중치를 계산합니다. 이 가중치는 Value 벡터와 곱해져 최종 출력 벡터가 생성됩니다.

 

Attention Function은 다양한 방법으로 구현될 수 있습니다. 예를 들어, Dot-Product Attention, Multi-Head Attention 등이 있습니다. Dot-Product Attention은 내적 연산을 사용하여 유사도를 계산하고, Multi-Head Attention은 여러 개의 Query, Key, Value 벡터를 사용하여 각각의 가중치를 계산한 후 이를 결합하는 방법입니다.



딥러닝 모델에서 Attention Function은 주로 softmax 함수, sigmoid 함수, ReLU 함수 등과 같은 활성화 함수와 함께 사용되어 입력 시퀀스의 각 단어들에 대한 가중치를 계산하고, 모델의 성능을 향상시키는 데 활용됩니다.

 


3. Scaled Dot-Product Attention

 

아래 이미지는 Scaled Dot-Product Attention Function의 계산 이미지 입니다. 계산은 다음과 같은 수식으로 나타낼 수 있습니다.



 $$\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$



여기서, \(Q\), \(K\), \(V\)는 각각 Query, Key, Value 벡터를 나타내며, \(d_k\)는 Key 벡터의 차원 수를 의미합니다.  \(\frac{QK^T}{\sqrt{d_k}}\)는 query 벡터와 key벡터 간의 유사도를 계산하는 것입니다. 이를 통해 어텐션 매커니즘이 입력 시퀀스 내에서 특정 토큰에 집중할 수 있도록 도와줍니다.  \(\sqrt{d_k}\)로 나눠주는 이유는 key 벡터의 차원 수가 증가할수록 내적 값이 커지기 때문입니다. 이를 방지하기 위해 softmax 함수를 통해 정규화를 하여 어텐션 분포를 조절하고, 어텐션 가중치를 균등하게 분배할 수 있도록 도와줍니다. 그리고 \(V\)를 곱해 최종 값을 구합니다. \(V\)곱하는 이유는 어텐션 가중치를 이용하여 입력 시퀀스에서 해당 토큰의 정보를 추출하기 위해서입니다.

 

 

Scaled Dot-Product Attention 이미지

 


1단계 : Attention Score 계산

 

어텐션 스코어는 쿼리(Query)와 키(Key)사이의 유사도를 나타내는 값입니다. 여기서 쿼리는 디코더의 t시점의 은닉 상태, 키는 인코더의 모든 시점의 은닉 상태를 의미합니다. 쿼리와 키의 내적을 통해 얻은 값은 유사도를 나타내며, 이 값을 키 벡터의 차원 수의 제곱근  \(\sqrt{d_k}\)으로 나눠 스케일링합니다. 결과적으로 각 인코더 시점의 은닉 상태와 디코더의 t 시점의 은닉 상태간의 어텐션 스코어가 계산됩니다.

 

 $$Score(Q,K)=\left(\frac{QK^T}{\sqrt{d_k}}\right)$$

 

Scaled Dot-Product Attention 1단계 이미지

 


2단계 : Attention Distribution 계산

 

어텐션 스코어를 소프트맥스 함수에 적용하면, 각 인코더 시점의 은닉 상태에 대한 가중치(확률 분포)를 얻을 수 있습니다. 이 가중치는 디코더의 t시점에 인코더의 각 시점의 정보가 얼마나 중요한지를 나타냅니다. 소프트맥스 함수를 통해 얻은 값은 모든 인코더 시점에 대해 합이 1이되는 확률 분포를 가집니다.

 

 $$Attention Distribution=softmax(Score(Q,K))$$

 

Scaled Dot-Product Attention 2단계 이미지


3단계 Atteuntion Value 계산

 

어텐션 가중치와 인코더의 값(Value) 벡터를 곱한 후, 모든 인코더 시점에 대해 합산하여 어텐션 값(Attention Value)을 구합니다. 여기서 값(Value)벡터는 인코더의 각 시점의 은닉 상태를 의미합니다. 어텐션 값은 인코더의 정보를 디코더에 전달하는 역할을 하며, 가중치를 고려해 각 인코더 시점의 정보를 조합한 결과물입니다.

 

$$Attention Value=Attention Distribution × V$$

 

Scaled Dot-Product Attention 3단계 이미지

 


4단계 : Atteuntion Value과 디코더의 은닉 상태 concatenate

 

마지막으로 어텐션 값과 디코더의 t시점의 은닉상태를 연결(concatenate)하여, 새로운 입력으로 사용합니다. 이렇게 어텐션 메커니즘을 통해 인코더와 디코더가 상호 작용하며, 입력 문장의 정보를 공유하게 됩니다. 

 

디코더의 현재 시점의 은닉 상태를 ht라고 하고, 어텐션 매커니즘의 결과를 ct라고 하면, 두 벡터를 Concatenate한 후 출력을 생성하는 방식은 아래 수식과 같습니다. 여기서 f는 디코더의 출력을 생성하기 위해 사용되는 활성화 함수입니다. 활성화 함수는 tanh일 수도 있고, 다른 활성화 함수일 수도 있습니다. 최종적으로 소프트맥스 함수를 적용하여 출력 활률 분포를 얻게 됩니다.

 

  • 두 벡터를 Concatenate : [ht : ct]
  • 연결된 벡터를 적절한 크기의 출력 벡터로 변환한다. ot = f([ht; ct])
  • 출력 벡터를 소프트 맥스 함수에 적용하여 최종확률 분포를 얻음 : pt = sotmax(ot)

 

Scaled Dot-Product Attention 4단계 이미지

 


4. Scaled Dot-Product Attention의 특징



첫째, 계산이 빠릅니다. 내적 연산은 고속으로 처리할 수 있기 때문에, 다른 Attention 방법보다 계산 속도가 빠릅니다.



둘째, 정규화를 위해 스케일링이 사용됩니다. 내적 연산을 통해 계산된 유사도를 정규화하는 데, 이때 내적 연산 결과의 차원 수를 나누어 스케일링을 수행합니다. 이를 통해 가중치의 분산을 조절하여 학습을 안정화시키고, Attention mechanism의 성능을 향상시킵니다.



셋째, 병렬 처리가 가능합니다. Scaled Dot-Product Attention은 입력 시퀀스의 각 단어 간에 독립적으로 계산이 가능하므로, 병렬 처리에 용이합니다. 이를 통해 더 빠른 학습 속도를 달성할 수 있습니다.



넷째, 다양한 입력 시퀀스 길이를 처리할 수 있습니다. Scaled Dot-Product Attention은 입력 시퀀스의 길이에 대해 제한이 없기 때문에, 다양한 길이의 입력 시퀀스를 처리할 수 있습니다.


5. 다양한 종류의 어텐션

1. Dot-Product Attention 

 

Dot-Product Attention은  쿼리(Query)와 키(key)의 내적을 사용하여 어텐션 스코어를 계산합니다.

 

$$Score(Q, K) = QK^T$$

 


2. Scaled Dot-Product Attention 

 

Scaled Dor-Product Attention은 Dot-Product Attention의 변형으로, 내적 값을 키 벡터의 차원 수의 제곱근 \(\sqrt{d_k}\)으로 나누어 스케일링합니다. 이는 각 차원에 대한 영향력이 과도하게 커지는 것을 방지하고 학습의 안정성을 향상시킵니다.

 

$$Score(Q, K) = QK^T / √dk$$

 


3. Additive Attention 

 

Additive Attention은 쿼리와 키를 결합한 후, 학습 가능한 가중치 행렬을 적용하여 어텐션 스코어를 계산하는 방식입니다. 이후 활성화 함수를 적용한 결과를 가지고 어텐션 스코어를 구합니다.

 

$$Score(Q, K) = v^T * tanh(W1 * Q + W2 * K)$$

 


4. Multi-Head Attention

 

Multi-Head Attention은 여러개의 독립적인 어텐션을 병렬로 수행한 후, 결과를 결합하는 방식입니다. 각 어텐션 헤드는 서로 다른 가중치를 사용하여 입력에 대한 다양한 관점을 학습할 수 있습니다. 일반적으로 Scaled Dot-Product Attention을 기반으로 합니다.

 

$$MultiHead(Q, K, V) = Concat(head_1, ..., head_h) * W^O$$

$$head_i = Attention(Q * W_i^Q, K * W_i^K, V * W_i^V)$$