어텐션 메커니즘은 시퀀스 데이터를 처리할 때 모델이 입력 시퀀스의 특정 부분에 "주의를 기울이도록" 하는 신경망 구조입니다. 이는 2014년 Bahdanau 등이 제안했으며, 트랜스포머(Transformer) 아키텍처의 핵심 구성 요소가 되었습니다.
### 주요 특징
1. **선택적 집중**: 모델이 특정 입력에 더 많은 가중치를 부여할 수 있게 합니다.
2. **장거리 의존성 처리**: 긴 시퀀스에서도 멀리 떨어진 요소들 간의 관계를 포착할 수 있습니다.
3. **병렬 처리**: 특히 셀프 어텐션(Self-Attention)은 시퀀스 요소들을 병렬적으로 처리합니다.
### 어텐션의 종류
1. **셀프 어텐션(Self-Attention)**: 동일한 시퀀스 내에서 각 요소가 다른 요소와 어떻게 관련되는지 계산
2. **크로스 어텐션(Cross-Attention)**: 두 개의 다른 시퀀스 간의 관계 계산 (예: 인코더-디코더 구조)
### 간단한 코드 예시 (PyTorch)
```python
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleSelfAttention(nn.Module):
def __init__(self, embed_dim):
super(SimpleSelfAttention, self).__init__()
self.query = nn.Linear(embed_dim, embed_dim)
self.key = nn.Linear(embed_dim, embed_dim)
self.value = nn.Linear(embed_dim, embed_dim)
self.scale = torch.sqrt(torch.FloatTensor([embed_dim]))
def forward(self, x):
# x: [batch_size, seq_len, embed_dim]
batch_size, seq_len, embed_dim = x.shape
# 쿼리, 키, 값 계산
q = self.query(x) # [batch_size, seq_len, embed_dim]
k = self.key(x) # [batch_size, seq_len, embed_dim]
v = self.value(x) # [batch_size, seq_len, embed_dim]
# 어텐션 스코어 계산
# q @ k.transpose(-2, -1) -> [batch_size, seq_len, seq_len]
attention = torch.matmul(q, k.transpose(-2, -1)) / self.scale
# 소프트맥스 적용
attention = F.softmax(attention, dim=-1)
# 가중치 적용
# attention @ v -> [batch_size, seq_len, embed_dim]
output = torch.matmul(attention, v)
return output, attention
```
### 어텐션 메커니즘의 동작 원리
1. **쿼리(Query), 키(Key), 값(Value) 생성**: 입력 벡터에서 선형 변환을 통해 Q, K, V 벡터 생성
2. **유사도 계산**: 쿼리와 키 사이의 내적(dot product)으로 유사도 계산
3. **스케일링**: 유사도 점수를 차원의 제곱근으로 나누어 스케일링
4. **소프트맥스 적용**: 유사도 점수에 소프트맥스를 적용하여 확률 분포로 변환
5. **가중합 계산**: 확률을 값(Value) 벡터에 곱하여 가중합 계산
어텐션 메커니즘은 현대 자연어 처리와 컴퓨터 비전 등 다양한 딥러닝 분야에서 핵심 구성 요소로 사용되고 있습니다.
---
## 쿼리(Query), 키(Key), 값(Value) 벡터
### 쿼리(Query) 벡터
- **역할**: "무엇을 찾고 있는가?"를 나타냅니다.
- **기능**: 현재 위치(또는 토큰)가 다른 위치들과 얼마나 관련이 있는지 질문합니다.
- **비유**: 도서관에서 책을 찾을 때 사용하는 검색어와 유사합니다.
### 키(Key) 벡터
- **역할**: "나와 일치하는가?"를 나타냅니다.
- **기능**: 쿼리가 얼마나 자신(키)과 관련이 있는지에 대한 답변 역할을 합니다.
- **비유**: 도서관의 책 색인이나 태그와 같이 검색 가능한 정보를 제공합니다.
### 값(Value) 벡터
- **역할**: "내가 가진 정보는 이것이다"를 나타냅니다.
- **기능**: 실제로 전달되는 콘텐츠를 포함합니다.
- **비유**: 도서관에서 찾고자 하는 책의 실제 내용에 해당합니다.
### 동작 프로세스
1. **유사도 계산**: 쿼리(Q)와 키(K)의 내적(dot product)을 통해 얼마나 관련이 있는지 점수를 계산합니다.
```
Score = Q · K^T
```
2. **가중치 생성**: 이 점수에 소프트맥스를 적용하여 0~1 사이의 확률로 변환합니다.
```
Attention Weights = softmax(Score / sqrt(d_k))
```
여기서 d_k는 키 벡터의 차원이며, 스케일링 요소로 사용됩니다.
3. **가중합 계산**: 계산된 가중치를 값(V) 벡터에 곱하고 합산하여 최종 출력을 생성합니다.
```
Output = Attention Weights · V
```
### 실제 예시
자연어 처리에서 "나는 사과를 먹었다"라는 문장에서:
- "사과"라는 단어를 처리할 때, 이 단어의 쿼리 벡터는 다른 모든 단어의 키 벡터와 비교됩니다.
- "나는"과 "먹었다"가 "사과"와 관련이 있다고 판단되면 높은 어텐션 점수를 받습니다.
- 이 점수에 따라 "사과"의 문맥적 표현이 다른 단어들의 값 벡터의 가중합으로 업데이트됩니다.
이러한 메커니즘은 모델이 시퀀스 내의 중요한 관계를 포착하고 문맥을 이해하는 데 핵심적인 역할을 합니다.