어텐션 메커니즘에 대해서 알아보자
Attention
어텐션 메커니즘이란 시퀸스 데이터 즉 순차적인 관계를 가진 데이터셋에 중요한 부분에 좀더 많은 가중치를
할당하여 정보를 효율적으로 처리하는 기법이다.
예시로 자기소개를 시퀸스 데이터라고 친다면, 이름에 좀더 중요도를 넣고 싶으면 어텐션 메커니즘을 사용할 수 있다.
주로 자연어 처리와 시계열 데이터에서 사용된다. 기계 번역, 요약, 질의응답과 같이 매우 다양한 분야에서 좋은 성능을
보여주고 있다.
동작 방식
어텐션 메커니즘은 시퀸스의 각 요소에 중요도를 계산하여 가중치를 부여하는 방식으로 작동한다.
이를 통하여 중요한 정보는 집중하고, 불피요한 정보는 드랍시킨다.
Attention score는 Query*와 key*간의 유사정도를 측정하여 중요도를 계산하는 것이다.
이 유사도는 내적*등을 이용해서 계산할 수 있다.
#디코더 스텝:
Query: [0.1, 0.2, 0.3]
Key1 ("I"): [1, 0, 1]
Key2 ("am"): [0, 1, 0]
Key3 ("a"): [1, 1, 0]
Key4 ("student"): [0, 0, 1]
#내적 계산:
Score1 = 0.11 + 0.20 + 0.31 = 0.4
Score2 = 0.10 + 0.21 + 0.30 = 0.2
Score3 = 0.11 + 0.21 + 0.30 = 0.3
Score4 = 0.10 + 0.20 + 0.31 = 0.3
계산이 완료된 Attention score에 softmax* 함수를 통해 확률 분포로 변환된다.
이를 통하여서 가중치의 합이 1이 되게 한다.
#소프트 맥스 함수
exp(0.4) = 1.49
exp(0.2) = 1.22
exp(0.3) = 1.35
exp(0.3) = 1.35
#합계 = 1.49 + 1.22 + 1.35 + 1.35 = 5.41
소프트맥스 결과:
"I": 1.49 / 5.41 ≈ 0.28
"am": 1.22 / 5.41 ≈ 0.23
"a": 1.35 / 5.41 ≈ 0.25
"student": 1.35 / 5.41 ≈ 0.25
Softmax를 통해 얻은 가중치를 각 value*에 곱하여 context vector*이라는 것을 만드는데 이는 다음 단어를 예측 하거나
다른 작업을 수행하는데 쓰인다.
#소프트맥스로 얻은 확률을 각 단어의 Value 벡터에 곱합니다.
"I": 0.28 * [1, 0, 1]
"am": 0.23 * [0, 1, 0]
"a": 0.25 * [1, 1, 0]
"student": 0.25 * [0, 0, 1]
가중치가 적용된 Value 벡터들을 모두 더해 Context Vector를 만듭니다.
Context Vector = [0.281 + 0.230 + 0.251 + 0.250,
0.280 + 0.231 + 0.251 + 0.250,
0.281 + 0.230 + 0.250 + 0.251]
>> [0.53, 0.48, 0.53]
*Query 내가 원하는 데이터를 의미한다. 위의 예시에서의 쿼리는 각 단어를 인덱싱한 결과이다.
*Key는 키는 쿼리를 포함한 각 단어들을 말한다. 위의 예시에서는 인덱싱하여 보여주고 있다.
*Value는 각 키의 실제 정보를 담고 있는 것이다. 즉 키와는 같지만 다르게 사용된다. (결과)
*내적은 쿼리와 키를 계산을 하는것을 의미한다.
*Softmax 함수는 내적을 사용하여 확률로 만드는 것이며 이 모든 값의 합은 1이 되게 한다.
*Context vector란 value와 softmax함수의 가중치를 더한 값으로 이를 이용하여 각 쿼리의 중요도를 확인 할 수 있다.
Self - Attention
self-attention이란 시퀸스 내의 각 요소 즉 모든 데이터가 서로를 참조하는 메커니즘이다.
입력 시퀸스의 모든 요소가 query, key 그리고 value로 사용된다.
입력 시퀸스의 문장 데이터 뿐만이 아니다 다른 종류의 즉 시계열 과같은 시퀸스 데이터에도 적용된다.
각 요소가 시퀸스 내 다른 요소들과의 관계 또한 학습한다.
이는 문장의 데이터가 들어가게 된다면, 문장의 단어만을 참조하는것이 아닌
단어, 순서, 문맥 등과 같이 모든 요소의 종합적인 관계자체를 학습한다.
이로인하여 번역이나 요약 그리고 생성에 활용 할 수 있다.
Multi - Head Attention
Multi - Head Attention은 Self-Attention을 병렬로 수행하는 매커니즘이다.
입력 데이터를 여러 부분으로 나누어 각 헤드에 독립적으로 나눈 데이터에서 self - attention을 실행하고
결과로 나온 값들은 연결되어 선형 변환하여 출력을 생성한다.
매커니즘의 구현
어텐션 매커니즘을 직접 구현하는 일은 굉장히 적다.
이에 코드를 한번 훑어보기만 하자.
아래의 코드들은 모델 안에서 사용해야하므로 따로는 실행이 되지 않을 것이다.
import torch
import torch.nn.functional as F
def scaled_dot_product_attention(Q, K, V):
d_k = Q.size(-1) # Key의 차원 수
# 유사도 계산 및 스케일링
scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
attn_weights = F.softmax(scores, dim=-1) # Softmax를 통한 가중치 계산
output = torch.matmul(attn_weights, V) # 가중합을 통한 최종 출력 계산
return output, attn_weights
class MultiHeadAttention(nn.Module):
def __init__(self, embed_size, heads):
super(MultiHeadAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
self.head_dim = embed_size // heads
assert (
self.head_dim * heads == embed_size
), "Embedding size needs to be divisible by heads"
self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)
self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)
self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)
self.fc_out = nn.Linear(heads * self.head_dim, embed_size)
def forward(self, values, keys, query, mask=None):
N = query.shape[0]
value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]
# Linear transformations
values = self.values(values).view(N, value_len, self.heads, self.head_dim)
keys = self.keys(keys).view(N, key_len, self.heads, self.head_dim)
queries = self.queries(query).view(N, query_len, self.heads, self.head_dim)
# Scaled dot-product attention
out, _ = scaled_dot_product_attention(queries, keys, values)
out = out.view(N, query_len, self.heads * self.head_dim)
out = self.fc_out(out)
return out
'용어정리 > Deep-Learning' 카테고리의 다른 글
Deep-Learning 용어정리 (ResNet) (0) | 2024.10.30 |
---|---|
Deep-Learning 용어정리 (NLP) (0) | 2024.10.30 |
Deep-Learning 용어정리 (RNN) (1) | 2024.10.29 |
Deep-Learning 용어정리 (CNN) (0) | 2024.10.29 |
Deep-Learning 용어정리 (인공 신경망) (0) | 2024.10.28 |