











Transformer은 기본적으로 Sequential data에서 활용




1) 하나의 단어가 주어졌을때 일반적으로 3개의 벡터(queries, keys, value)를 만들게 됨



2) 그 다음은 normalize해줌 : 8로 나눠줌(key vector의 demension에 dependency)
3) softmax 취해줌

4) 최종적으로 나오는 것은 위에 구한 값과 나머지 모든 단어의 value 벡터와 weighted sum을 해준 벡터







디코더










# 셀 A을 선언하는 과정
rnn = torch.nn.RNN(input_size, hidden_size)
# 셀 A에 인풋데이터를 넣어 결과를 추출하는 과정
outputs, _status = rnn(input_data) ## 3개의 차원을 가지고 텐서






import torch
import numpy as np
input_size = 4
hidden_size = 2
######### 인풋데이터를 텐서로 변환하는 과정
# 1-hot encoding
h = [1, 0, 0, 0]
e = [0, 1, 0, 0]
l = [0, 0, 1, 0]
o = [0, 0, 0, 1]
# batch:3, length:5
input_data_np = np.array([[h, e, l, l, o],
[e, o, l, l, l],
[l, l, e, e, l]], dtype=np.float32)
# transform as torch tensor
input_data = torch.Tensor(input_data_np) #넘파이로 만든 텐서를 토치에서 사용하는 텐서로 바꿔주는 것
#########
rnn = torch.nn.RNN(input_size, hidden_size)
outputs, _status = rnn(input_data) # (3,5,2) shape
hihello 예측하기


# loss & optimizer setting
criterion = torch.nn.CrossEntropyLoss()
…
loss = criterion(outputs.view(-1, input_size), Y.view(-1)) # 인수: 아웃풋 ,정답레이블
har_set = ['h', 'i', 'e', 'l', 'o']
# hyper parameters
input_size = len(char_set)
hidden_size = len(char_set) # 인풋 사이즈와 상관없음
learning_rate = 0.1
# data setting
x_data = [[0, 1, 0, 2, 3, 3]]
x_one_hot = [[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]]]
y_data = [[1, 0, 2, 3, 3, 4]]
# transform as torch tensor variable
X = torch.FloatTensor(x_one_hot)
Y = torch.LongTensor(y_data)
sample = " if you want you"
# make dictionary
char_set = list(set(sample)) # unique한 문자열만!
char_dic = {c: i for i, c in enumerate(char_set)}
# hyper parameters
dic_size = len(char_dic)
hidden_size = len(char_dic)
learning_rate = 0.1
# data setting
sample_idx = [char_dic[c] for c in sample]
x_data = [sample_idx[:-1]]
x_one_hot = [np.eye(dic_size)[x] for x in x_data]
y_data = [sample_idx[1:]]
# transform as torch tensor variable
X = torch.FloatTensor(x_one_hot)
Y = torch.LongTensor(y_data
# declare RNN
rnn = torch.nn.RNN(input_size, hidden_size, batch_first=True) # batch_first=True -> batch_first guarantees the order of output = (B, S, F)
# loss & optimizer setting
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(rnn.parameters(), learning_rate)
# start training
for i in range(100):
optimizer.zero_grad() # 매 스텝마다 새로운 그래디언트를 할 수 있음(하지 않으면 기존에 구했던 그래디언트에 축적이 됨)
outputs, _status = rnn(X)
loss = criterion(outputs.view(-1, input_size), Y.view(-1))
loss.backward() #백프로파겐 실행
optimizer.step() # optimizer의 파라미터가 업데이트 됨
# 모델이 실제로 어떻게 예측했는지를 알아보는 코드
result = outputs.data.numpy().argmax(axis=2) #argmax: 인덱스가 2인 디멘션에서 가장 큰 숫자를 가져오는것
result_str = ''.join([char_set[c] for c in np.squeeze(result)]) # squeeze:디멘션에서 1인 축을 없애줌
print(i, "loss: ", loss.item(), "prediction: ", result, "true Y: ", y_data, "prediction str: ", result_str)