딥러닝, 논문 리뷰

[딥러닝, 논문리뷰] Attention Is All You Need 2 - Attention Mechanism

cheorish 2025. 2. 12. 23:16

https://arxiv.org/abs/1706.03762
 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

 

이전 시간 다음으로 Attention에 대해서 조금 더 심도 있게 들어가보도록 하겠습니다. 

 

트랜스포머 아키텍처

1.1  Attention

1. Attention Mechanism의 기본 개념

 

Attention(어텐션)은 입력(Query)이 주어졌을 때, Key-Value 쌍에서 어떤 정보에 집중할지를 결정하는 메커니즘

Query(쿼리), Key(키), Value(값) 간의 연관도를 계산하여 가중치를 부여하고 최종 출력을 생성

 

즉, 어텐션은 "입력에 따라 중요한 정보에 집중하도록 하는 메커니즘

 

2. 어텐션 함수 정의

 

어텐션 함수는 Query(쿼리), Key(키), Value(값) 세 가지 요소를 입력으로 받음
출력은 Value 값들의 가중합(Weighted Sum)으로 계산됨

✅ (1) Query(쿼리), Key(키), Value(값) 개념

 

요소 설명
Query (\(Q\)) 현재 입력이 어떤 정보를 찾고 싶은지를 나타내는 벡터
Key (\(K\)) 입력 데이터에서 각 항목이 가지는 특징을 표현하는 벡터
Value (\(V\)) Key에 대응하는 실제 데이터 값(출력의 후보)

 

Query와 Key의 유사도를 계산하여, Value 값의 중요도를 결정

 

 

이렇게 개념으로 보면 어려우니 약간의 예제로 정리하려고 한다.

 

1. 입력 문장과 벡터 표현

✔ 토큰(Token)으로 변환:

Token = ["나는","학교에","간다"]

 

✔ 각 단어를 벡터(Embedding)로 변환하여 입력 데이터로 사용

\(X = [x_1, x_2, x_3] = \)  ["나는","학교에","간다"]

 

각 단어는 고정된 크기의 임베딩 벡터로 변환됩니다.

예를 들어, 각 단어가 3차원 벡터라고 가정하면:

 

$$
X_1 = [0.1, 0.3, 0.5], X_2 =[0.4, 0.2, 0.6], X_3 = [0.7, 0.8, 0.9]
$$

 

2. Query, Key, Value 행렬 생성

✔ 각 단어마다 Query(Q), Key(K), Value(V) 벡터를 생성
✔ 행렬 형태로 변환하면 다음과 같음:

 

$$
Q = W_Q X, \quad K = W_K X, \quad V = W_V X
$$

 

 

Attention에서는 Query(Q), Key(K), Value(V) 벡터를 생성한 후, Query와 Key의 유사도를 계산하여 Value 값을 가중합(Weighted Sum)하는 방식으로 동작합니다.

 

각 단어를 벡터(차원=3)로 임베딩하여 Query, Key, Value 행렬을 생성
✔ 예제에서는 단순한 숫자로 표현하여 쉽게 설명

 

✔ 예제 값:

 

$$
Q =
\begin{bmatrix} 
0.1 & 0.3 & 0.5 \\ 
0.4 & 0.2 & 0.6 \\ 
0.7 & 0.8 & 0.9 
\end{bmatrix}, \quad
K =
\begin{bmatrix} 
0.2 & 0.1 & 0.3 \\ 
0.5 & 0.7 & 0.4 \\ 
0.9 & 0.2 & 0.8 
\end{bmatrix}
$$

 

✔ Value 벡터도 유사하게 설정:

 

$$
V =
\begin{bmatrix} 
0.3 & 0.7 & 0.5 \\ 
0.6 & 0.4 & 0.8 \\ 
0.9 & 0.5 & 0.2 
\end{bmatrix}
$$

 

 

3. Scaled Dot-Product Attention 계산 과정

"Query와 Key의 내적(Dot Product)을 계산하여 유사도를 구함"

 

✔ 내적 계산 공식:

\(S = QK^T\)

 

예제 계산 : 

 

$$
S = \begin{bmatrix}
(0.1 \cdot 0.2 + 0.3 \cdot 0.1 + 0.5 \cdot 0.3) & (0.1 \cdot 0.5 + 0.3 \cdot 0.7 + 0.5 \cdot 0.4) & (0.1 \cdot 0.9 + 0.3 \cdot 0.2 + 0.5 \cdot 0.8) \\
(0.4 \cdot 0.2 + 0.2 \cdot 0.1 + 0.6 \cdot 0.3) & (0.4 \cdot 0.5 + 0.2 \cdot 0.7 + 0.6 \cdot 0.4) & (0.4 \cdot 0.9 + 0.2 \cdot 0.2 + 0.6 \cdot 0.8) \\
(0.7 \cdot 0.2 + 0.8 \cdot 0.1 + 0.9 \cdot 0.3) & (0.7 \cdot 0.5 + 0.8 \cdot 0.7 + 0.9 \cdot 0.4) & (0.7 \cdot 0.9 + 0.8 \cdot 0.2 + 0.9 \cdot 0.8)
\end{bmatrix}
$$

 

✔ 실제 숫자로 계산하면:

 

$$
S =
\begin{bmatrix} 
0.26 & 0.41 & 0.65 \\ 
0.30 & 0.62 & 0.85 \\ 
0.49 & 0.78 & 1.20 
\end{bmatrix}
$$

 

4. Scaling 적용 (임베딩 차원의 제곱근으로 나누기)

"Dot Product의 값이 너무 커지는 것을 방지하기 위해, 임베딩 차원의 제곱근(\(\sqrt{d_k}\)) 으로 나눠 줌"

 

✔ 임베딩 차원 \(d_k=3\)이라면?

✔ \(\sqrt{3} \approx\)

 

제곱근 식 :

\((S' = S / \sqrt(d_k))\)

 

실제 적용 식: 

\(S' = \frac{S}{\sqrt{3}}\)

 

✔ 실제 숫자로 계산:


$$
S' =
\begin{bmatrix} 
0.15 & 0.24 & 0.38 \\ 
0.17 & 0.36 & 0.49 \\ 
0.28 & 0.45 & 0.69 
\end{bmatrix}
$$

 

5. Softmax 적용 (확률 분포로 변환)

"각 단어의 중요도를 확률값으로 변환하기 위해 Softmax 적용"

 

✔ Softmax 공식:

$$
A_{ij} = \frac{\exp(S'_{ij})}{\sum_k \exp(S'_{ik})}
$$

 

✔ Softmax 적용 후 어텐션 가중치 행렬
$$
A =
\begin{bmatrix} 
0.23 & 0.30 & 0.47 \\ 
0.18 & 0.34 & 0.48 \\ 
0.14 & 0.26 & 0.60 
\end{bmatrix}
$$

 

각 행의 합 = 1 → 확률값으로 변환됨

"Softmax로 얻은 가중치 행렬과 Value 행렬을 곱하여 최종 출력 계산"

 

계산 수식 :

$$
O = A V
$$

 

 

최종 출력 계산 (Weighted Sum)

$$
O =
\begin{bmatrix} 
0.63 & 0.52 & 0.44 \\ 
0.58 & 0.49 & 0.42 \\ 
0.53 & 0.45 & 0.41 
\end{bmatrix}
$$

 

4. 결론

"나는 학교에 간다" 문장에서 각 단어가 서로 어떤 관계를 가지는지를 Attention을 통해 계산함
Query와 Key의 Dot Product → Scaling → Softmax → Value의 Weighted Sum 계산 과정으로 수행
결과적으로, 문맥(Context)에 따라 중요한 단어에 더 높은 가중치를 부여하는 방식

 

 

 

 

그림으로 이해하는 Q, K, V 연산

 

** QK 연산은 그림에서 봐도 알겠지만 내적 계산을 할 때 곱셈 규칙에 의해서 K값이 트랜스포즈 되어야 하는 것을 잊지 말아야 하며, 이처럼 예제로 보여준 문맥의 Q값을 한 번의 직렬 계산이 아닌 문맥 내 존재 하는 여러 단어들을 병렬 계산을 하며 그 안에서 집중 해야 할 단어들의 정보를 전해주는 것이 어텐션 메커니즘의 가장 중요한 요소라고 생각하면 된다. 

 

연산 과정에서 특이한점은 Q, K, V에 각각 동일한 값을 부여하더라도, 디멘션에 따른 가중치 행렬의 값이 곱해지면서 단어별로 서로 다른 값이 나오게 된다.

 

이때, 디멘션(\(d_k\)) 값이 증가할수록 Dot Product의 결과값도 커지게 되는데, 이를 정규화하여 학습을 안정적으로 만드는 과정이 “Dot Product Scaling”이다.

 


1.2 Scaled Dot-Product Attention

Scaled Dot-Product Attention은 Transformer에서 가장 핵심적인 어텐션 메커니즘으로,

Query(\(Q\)), Key(\(K\)), Value(\(V\)) 행렬을 활용하여 가중치를 계산하는 방식입니다.

 

Dot Product(내적)를 사용하여 연관도를 측정한 후, 디멘션(\(d_k\)) 값에 따라 정규화(Scaling)를 적용하고 Softmax를 활용하여 최종 가중치를 계산하는 방식입니다.

 

Scaled Dot Product

 

1. Scaled Dot-Product Attention 연산 과정

 

✔ 입력 데이터는 Query(\(Q\)), Key(\(K\)), Value(\(V\)) 세 가지 행렬로 구성됩니다.

✔ Query와 Key는 차원(\(d_k\))을 공유하고, Value는 차원(\(d_v\))을 가집니다.

 

✔ Query와 Key의 Dot Product를 계산하여 연관도를 측정

✔ Dot Product 결과를 \(\sqrt {d_k}\) 로 나누어 정규화 (Scaling)

✔ Softmax를 적용하여 확률 값을 얻고, 이를 Value 행렬에 적용

 

수식 : 

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

 

 2. Query, Key, Value 행렬을 활용한 연산 과정

Query, Key, Value 행렬을 사용하여 연산을 수행

Query(\(Q\))와 Key(\(K\))의 내적(Dot Product)을 수행한 후, Scaling 적용

 

 

실제 연산 예제: 

(지속적으로 언급하면서 계산 메커니즘을 이해할 수 있도록 하기 위해 식을 다시 정리합니다.)

 

$$
Q =
\begin{bmatrix} 
0.1 & 0.3 & 0.5 \\ 
0.4 & 0.2 & 0.6 \\ 
0.7 & 0.8 & 0.9 
\end{bmatrix}

K =
\begin{bmatrix} 
0.2 & 0.1 & 0.3 \\ 
0.5 & 0.7 & 0.4 \\ 
0.9 & 0.2 & 0.8 
\end{bmatrix}

V =
\begin{bmatrix} 
0.3 & 0.7 & 0.5 \\ 
0.6 & 0.4 & 0.8 \\ 
0.9 & 0.5 & 0.2 
\end{bmatrix}
$$

 

✔ Query와 Key의 Dot Product 연산을 수행

 

수식:

$$
S = QK^T
$$

 

✔ 실제 계산 결과:

$$
S =
\begin{bmatrix} 
0.26 & 0.41 & 0.65 \\ 
0.30 & 0.62 & 0.85 \\ 
0.49 & 0.78 & 1.20 
\end{bmatrix}
$$

 

✔ Scaling 적용:

$$
S' = \frac{S}{\sqrt{d_k}}
$$

 

✔ Scaling 적용 후 결과:

$$
S' =
\begin{bmatrix} 
0.15 & 0.24 & 0.38 \\ 
0.17 & 0.36 & 0.49 \\ 
0.28 & 0.45 & 0.69 
\end{bmatrix}
$$

 

✔ Softmax 적용 후 가중치 행렬:

$$
A =
\begin{bmatrix} 
0.23 & 0.30 & 0.47 \\ 
0.18 & 0.34 & 0.48 \\ 
0.14 & 0.26 & 0.60 
\end{bmatrix}
$$

 

✔ 최종 Attention 결과 계산:

 

수식:

$$
O = A V
$$

 

✔ 최종 결과:

$$
O =
\begin{bmatrix} 
0.63 & 0.52 & 0.44 \\ 
0.58 & 0.49 & 0.42 \\ 
0.53 & 0.45 & 0.41 
\end{bmatrix}
$$

 

 3. Additive Attention vs Dot-Product Attention

 

Additive Attention: Feed-Forward 네트워크를 사용하여 Query와 Key의 연관성을 학습

Dot-Product Attention: Query와 Key의 Dot Product를 사용하여 연관성을 측정

 

Dot-Product Attention은 연산적으로 더 빠르고, 메모리 효율적

✔ 하지만, \(d_k\) 값에서는 Additive Attention이 더 나은 성능을 보일 수 있음

 

$$
\text{Dot-Product Attention}(Q, K, V) = \text{softmax} (QK^T) V
$$

 

$$
\text{Additive Attention}(Q, K, V) = \text{softmax} (\text{FFN}(Q, K)) V
$$

 

✔ Additive Attention은 계산 비용이 크지만, 성능이 더 좋을 수도 있음 ✅

 

4. Dot-Product Attention의 한계와 Scaling 필요성

 

✔ \(d_k\) 값이 커지면, Dot Product의 값이 너무 커지고 Softmax의 출력이 0 또는 1에 가까워짐

Gradient Vanishing(기울기 소실) 문제 발생 → 학습이 어려워짐

이를 방지하기 위해 \(\sqrt{d_k}\) 로 나누어 정규화 수행

 

$$
S' = \frac{S}{\sqrt{d_k}}
$$

 

결론: Scaled Dot-Product Attention의 핵심

 

Scaled Dot-Product Attention은 Dot Product 연산을 보완하여 안정적인 학습이 가능하도록 설계된 메커니즘!

 


1.3  Multi-Head Attention

 

Multi-Head Attention은 단일 Attention을 여러 개 병렬로 수행하는 방식으로,

각 Head가 서로 다른 부분 정보를 학습할 수 있도록 설계된 메커니즘입니다.

 

Query(\(Q\)), Key(\(K\)), Value(\(V\)) 행렬을 여러 개의 서로 다른 하위 공간(Subspace)으로 분할하여 병렬 연산 수행

여러 개의 Attention Head가 각각 다른 패턴을 학습할 수 있도록 하여 표현력을 향상

최종적으로 병렬 Attention 결과를 다시 하나로 합쳐(Concat) 원래 차원으로 변환

 

1. Multi-Head Attention 연산 과정

 

✔ 기존 단일 Attention에서는 Q, K, V를 직접 Scaled Dot-Product Attention에 입력

Multi-Head Attention에서는 Q, K, V를 여러 개로 분할하여 서로 다른 Projection을 적용

 

$$
\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h) W^O
$$

 

✔ 각 Head에서 수행되는 Attention 연산:

$$
\text{head}_i = \text{Attention}(QW^Q_i, KW^K_i, V W^V_i)
$$

 

✔ 여기서 각 \(W^Q_i, W^K_i, W^V_i\)는 학습 가능한 가중치 행렬 ✅

 

2. Multi-Head Attention을 수행하는 이유

 

✔ 단일 Attention Head를 사용할 경우, 모든 정보를 하나의 공간에서 학습하므로 세부적인 관계를 학습하기 어려움

✔ 여러 개의 Head를 사용하면 서로 다른 Subspace에서 다양한 Feature를 학습 가능

 

즉, Multi-Head Attention을 사용하면 모델이 문장 내에서 다양한 의미적 관계를 학습할 수 있음

 

 3. Multi-Head Attention의 수식

 

Projection 가중치 행렬

각 Head에서 Query, Key, Value를 다른 차원으로 변환하는 과정

 

$$
W^Q_i \in \mathbb{R}^{d_{model} \times d_k}, \quad
W^K_i \in \mathbb{R}^{d_{model} \times d_k}, \quad
W^V_i \in \mathbb{R}^{d_{model} \times d_v}
$$

 

최종 출력을 다시 원래 차원으로 변환하는 Projection

 

$$
W^O \in \mathbb{R}^{h d_v \times d_{model}}
$$

 

4. 예제 (행렬 크기 확인)

 

✔ \(h = 8\) 개의 Head 사용

✔ 각 Head의 차원: \(d_k = d_v = d_{model} / h = 512 / 8 = 64\)

 

✔ 입력 데이터 크기 예제:

$$
Q, K, V \in \mathbb{R}^{n \times d_{model}}
$$

 

✔ Head별 가중치 적용 후 차원 변환:

$$
QW^Q_i, KW^K_i, VW^V_i \in \mathbb{R}^{n \times d_k}
$$

 

✔ 각 Head에서 Scaled Dot-Product Attention 수행 후 결과:

$$
\text{head}_i \in \mathbb{R}^{n \times d_v}
$$

 

✔ 여러 개의 Head를 연결(Concat)한 후 최종 Projection 적용:

$$
\text{MultiHead}(Q, K, V) \in \mathbb{R}^{n \times d_{model}}
$$

 

5. Multi-Head Attention의 장점

단계 설명
1️⃣ Query(\(Q\)), Key(\(K\)), Value(\(V\)) 행렬 생성 문장 또는 이미지의 특성을 벡터로 변환
2️⃣ 각 Head에서 서로 다른 Projection 적용 Query, Key, Value를 \(d_k, d_k, d_v\) 차원으로 변환
3️⃣ 각 Head에서 Scaled Dot-Product Attention 수행
개별 Attention Head들이 서로 다른 특징을 학습
4️⃣ 여러 개의 Head를 병합하여 하나의 행렬로 결합
다양한 패턴을 학습한 정보를 결합
5️⃣ 최종 Projection을 적용하여 원래 차원으로 변환 원래 차원의 정보로 되돌려서 출력 

 


 

1.4  Applications of Attention in our Model

 

Transformer 모델에서는 Multi-Head Attention을 세 가지 방식으로 사용합니다.

 

Encoder-Decoder Attention

Encoder Self-Attention

Decoder Self-Attention

 

각각의 어텐션 방식이 어떻게 동작하는지 자세히 살펴보겠습니다.

 

 1. Encoder-Decoder Attention (인코더-디코더 어텐션)

 

Query (\(Q\)) → 디코더의 이전 레이어에서 가져옴

Key (\(K\)), Value (\(V\)) → 인코더의 최종 출력에서 가져옴

즉, 디코더는 인코더의 모든 위치를 참조(Attend)할 수 있음

 

기존 Seq2Seq 모델에서도 디코더가 인코더의 정보를 참조할 수 있도록 Attention을 사용함

✔ Transformer에서도 디코더가 인코더의 전체 정보를 활용할 수 있도록 설계됨

 

$$
\text{Encoder-Decoder Attention} = \text{Attention}(Q_{\text{decoder}}, K_{\text{encoder}}, V_{\text{encoder}})
$$

 

디코더는 인코더에서 나온 Key-Value를 이용하여 Context를 학습

이 어텐션을 통해 입력 문장을 기반으로 출력 문장을 생성할 수 있음

 

 2. Encoder Self-Attention 

 

Query (\(Q\)), Key (\(K\)), Value (\(V\)) 모두 인코더의 이전 레이어에서 가져옴

각 단어는 문장 내의 모든 단어를 참고(Attend)할 수 있음

 

💡 즉, 인코더는 입력 문장의 모든 단어가 서로를 참고하면서 문맥(Context)을 학습함

 

$$
\text{Encoder Self-Attention} = \text{Attention}(Q_{\text{encoder}}, K_{\text{encoder}}, V_{\text{encoder}})
$$

 

인코더의 각 단어는 문장 내의 모든 단어를 참고 가능 (병렬 연산 가능)

입력 문장의 의미를 보다 깊이 있게 학습 가능

 

3. Decoder Self-Attention 

Query (\(Q\)), Key (\(K\)), Value (\(V\)) 모두 디코더의 이전 레이어에서 가져옴

하지만, 현재 시점(\(t\))보다 미래 시점의 단어를 참조하면 안 됨 → “Masking” 필요

 

$$
\text{Masked Decoder Self-Attention} = \text{Masked-Attention}(Q_{\text{decoder}}, K_{\text{decoder}}, V_{\text{decoder}})
$$

 

출처 : https://python.plainenglish.io/teacher-forcing-and-masked-attention-fd4bf4cf0a80

 

더 쉽게 정리하자면, 1번 인코더-디코더 어텐션의 원리로 디코더에서는 인코더에서 계산 되었던 어텐션 스코어를 참조하면서 계산되기 때문에, 추후에 자세하게 정리하겠지만, 디코더는 단방향 학습 메커니즘으로 출력 문장을 한 단어 씩 예측 해야 하는 "Auto-Regressive" 모델이기에 인코더에서 넘어온 정보를 모두 알고 있으면 성능에 영향이 갈 수 있기 때문에 어텐션 값의 일부를 masked(마스킹) 처리를 하여 예측에 용이할 수 있도록 만들어줘야 함 

 

"예언가의 능력을 더욱 더 띄워주기 위해서 다가올 미래를 모든 것을 볼 수 있게 하는 것이 아닌 편린으로 볼 수 있게끔 한다"

라고 생각하는게 쉽다.

 

** Masking 적용 방식

 

Softmax 연산 전에, 참조하면 안 되는 값들을 -∞(음의 무한대)로 설정

Softmax가 0에 가까운 값으로 변환하여 영향을 제거

 

 


결론

Transformer의 Attention 메커니즘

 

1️⃣ Multi-Head Attention의 역할

✔ 여러 개의 Attention Head를 병렬로 사용하여 다양한 특징을 학습

✔ 각 Head가 **서로 다른 하위 공간(Subspace)**에서 정보를 추출

✔ 최종적으로 Concat 후 Projection을 적용하여 원래 차원으로 변환

 

2️⃣ Transformer에서 Attention의 활용 방식

 

Encoder Self-Attention → 입력 문장의 모든 단어가 서로를 참고하면서 문맥을 학습

Decoder Self-Attention → 미래 단어를 보지 않도록 Masking 적용

Encoder-Decoder Attention → 디코더가 인코더의 정보를 참고하여 최종 출력을 생성

 

3️⃣ Masking의 필요성

 

디코더에서 미래 단어를 보면 답을 미리 아는 문제가 발생 → Auto-Regressive 학습 불가능

✔ Softmax 적용 전에 미래 단어의 어텐션 값을 -∞로 설정하여 차단

이를 “Causal Masking” 또는 “Look-Ahead Masking”이라고 부름

 

4️⃣ Scaled Dot-Product Attention의 필요성

 

Dot Product 연산 후 값이 너무 커지는 문제 발생 → Softmax가 왜곡됨

디멘션 \(d_k\)의 제곱근 \sqrt{d_k}로 나누어 정규화하여 학습 안정화

 

결론: Transformer의 핵심 개념 요약

 

Multi-Head Attention을 활용하여 서로 다른 정보를 병렬로 학습

Encoder-Decoder Attention을 통해 디코더가 인코더 정보를 참고

Decoder에서는 Masking을 적용하여 미래 단어를 차단

Scaled Dot-Product Attention을 사용하여 학습을 안정화