[Do it 자연어] 2. 숫자 세계로 떠난 자연어
import torch
x = torch.tensor([
[1.0, 0.0, 1.0, 0.0],
[0.0, 2.0, 0.0, 2.0],
[1.0, 1.0, 1.0, 1.0],
])
w_query = torch.tensor([
[1.0, 0.0, 1.0],
[1.0, 0.0, 0.0],
[0.0, 0.0, 1.0],
[0.0, 1.0, 1.0],
])
w_key = torch.tensor([
[0.0, 0.0, 1.0],
[1.0, 1.0, 0.0],
[0.0, 1.0, 0.0],
[1.0, 1.0, 0.0],
])
w_value = torch.tensor([
[0.0, 2.0, 0.0],
[0.0, 3.0, 0.0],
[1.0, 0.0, 3.0],
[1.0, 1.0, 0.0],
])
변수를 정의합니다.
keys = torch.matmul(x, w_key)
querys = torch.matmul(x, w_query)
values = torch.matmul(x, w_value)
쿼리, 키, 벨류를 만듭니다.
attn_scores = torch.matmul(querys, keys.T)
attn_scores
어텐션 스코어를 만듭니다.
import numpy as np
from torch.nn.functional import softmax
key_dim_sqrt = np.sqrt(keys.shape[-1])
attn_probs = softmax(attn_scores / key_dim_sqrt, dim = -1)
attn_probs
소프트맥스 확률값을 만듭니다.
weighted_values = torch.matmul(attn_probs, values)
weighted_values
소프트맥스 확률과 밸류를 가중합 하였습니다. 셀프 어텐션에 최종 출력값 입니다.
셀프 어텐션은 가중치 행렬(w_..) 3개를 학습 대상으로 생각하고 태스크를 잘 수행하는 방향으로 업데이트 됩니다.
import torch
x = torch.tensor([2,1])
w1 = torch.tensor([[3,2,-4],[2,-3,1]])
b1 = 1
w2 = torch.tensor([[-1,1],[1,2],[3,1]])
b2 = -1
변수를 입력합니다.
h_preact = torch.matmul(x, w1) + b1
h = torch.nn.functional.relu(h_preact)
y = torch.matmul(h, w2) + b2
y
결과 값 입니다. 여기서 w1, w2, b1, b2가 학습 대상이 됩니다.
학습 대상은 태스크를 잘 수행하는 방향으로 업데이트 됩니다.
m = torch.nn.Dropout(p = 0.2)
input = torch.randn(1,10)
output = m(input)
print(input)
print(output)
간단한 드롭다웃 예제입니다. p 확률 만큼 뉴련을 0으로 대치해 계산에서 제외합니다.
!pip install ratsnlp
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(
'beomi/kcbert-base',
do_lower_case = False,
)
BERT(kcbert-base) 모델이 쓰는 토크나이저를 선언합니다.
from transformers import BertConfig, BertModel
pretrained_model_config = BertConfig.from_pretrained(
'beomi/kcbert-base'
)
model = BertModel.from_pretrained(
'beomi/kcbert-base',
config = pretrained_model_config,
)
BERT(kcbert-base) 모델을 읽어들입니다.
pretrained_model_config
pretrained_model_config은 BERT 모델을 프리트레인 할때 설정했던 내용이 있습니다.
블록 수는 12개, 헤드 수는 12개, 어휘 집합 크기는 3만개 입니다.
sentences = ['안녕하세요', '하이!']
features = tokenizer(
sentences,
max_length = 10,
padding = 'max_length',
truncation = True,
)
features
BERT 모델의 입력값을 만듭니다. 앞서 배운 BERT 모델과 같이 3개의 변수가 나옵니다.
features = {k : torch.tensor(v) for k, v in features.items()}
피처를 파이토치에 넣기 위해선 자료형이 텐서(tensor)이여야 하기 때문에 자료형을 변경했습니다.
outputs = model(**features)
outputs
BERT 모델에 features를 적용했습니다. 두 개의 출력물 last_hidden_state, pooler_output이 나옵니다.
전자를 단어수준 임베딩, 후자를 문장수준 임베딩이라고 부릅니다.