import numpy as npimport matplotlib.pyplot as pltimport torchimport torch.nn as nnimport torch.optim as optimimport torch.nn.functional as F%matplotlib inline%config InlineBackend.figure_format='retina'print ("PyTorch version:[%s]."%(torch.__version__))device = torch.device('cuda:0'if torch.cuda.is_available()else'cpu')print ("device:[%s]."%(device))
PyTorch version:[1.9.0+cu102].
device:[cuda:0].
Scaled Dot-Product Attention (SDPA)
Scaled Dot Attention은 self(single)-attention이고, 이후에 multi attention이 나올 것임
2 : Q, K, V 벡터를 입력받는다. 정확히는 이것이 Batch가 되어서 들어오게 된다.
3 : Key dimension을 찾음. 왜? 점수를 square값으로 나눠야 하니까
4 : 점수를 계산
6 : softmax로 attention값 구하기
7 : Value벡터와 attention곱 구하기
3
n_batch : 단어의 개수
d_K : K벡터의 차원
d_V : V벡터의 차원
V벡터는 K벡터와 차원이 달라도 된다.
4: 각각의 벡터의 총 개수
쿼리벡터의 개수와 키벡터의 개수가 달라도 된다. 개수가 달라도 서로의 interaction을 계산할 수 있다.
멀티헤드에서는 각각의 벡터를 몇개할지가 2번째 인자자리에 추가되었다.
Multi-Headed Attention (MHA)
2 : dropout이 multihead 인자로 들어가게된다. 논문에는 설명이 안되어있는데 모든 코드에 쓴다
21-24 : Q, K ,V 벡터를 구하는 신경망을 구성하고 나오는 결과값을 가공해주는 Output도 정의해준다.
# It supports 'multi-headed' attention
n_batch,n_head,d_K,d_V = 3,5,128,256
n_Q,n_K,n_V = 30,50,50 # n_K and n_V should be the same
Q = torch.rand(n_batch,n_head,n_Q,d_K)
K = torch.rand(n_batch,n_head,n_K,d_K)
V = torch.rand(n_batch,n_head,n_V,d_V)
out,attention = SPDA.forward(Q,K,V,mask=None)
# out: [n_batch x n_head x n_Q x d_V]
# attention: [n_batch x n_head x n_Q x n_K]
def sh(x): return str(x.shape)[11:-1]
print ("(Multi-Headed) SDPA: Q%s K%s V%s => out%s attention%s"%
(sh(Q),sh(K),sh(V),sh(out),sh(attention)))