어떤 문서를 주며 핵심어를 추출해야 한다고 할때, 컴퓨터는
를 기준으로 핵심어를 추출한다.
컴퓨터는 단어를 벡터로 변환하여 모델에 적용한다.
=> 차원을 낮추고 밀도를 높이는 방향의 방법을 고려해야 함!
mport numpy as np
point = np.array([120,30])
k = 10
# 각 그룹의 샘플 수와 차원 설정
group_A = np.zeros((15, 2)) # 앞의 값은 샘플의 수, 뒤의 값은 샘플의 차원
group_B = np.zeros((15, 2))
group_C = np.zeros((15, 2))
# 각 그룹마다 랜덤값을 부여
group_A = np.random.uniform(100,200,size=(15,2)) # 100~200 실수값
group_B = np.random.uniform(0,50,size=(15,2)) # 0~50 실수값
group_C[:,0] = np.random.uniform(100,200,size=15) # x축은 100~100 실수값
group_C[:,1] = np.random.uniform(0,50,size=15) # y축은 0~50 실수값
# 두 점 사이의 유클리드 거리 계산 함수 정의
def distance(p, s):
return np.sqrt(np.sum((p - s) ** 2))
distances = [] # 거리와 그룹 인덱스를 저장
# 각 그룹별로 거리 계산
for idx, group in enumerate([group_A, group_B, group_C]):
for sample in group:
distances.append((distance(point, sample), idx)) # (거리, 그룹 인덱스 ) 저장
# 거리에 따라 정렬
distances.sort(key=lambda x: x[0])
# k개의 가장 가까운 이웃 선택
nearest_neighbors = distances[:k]
# 각 그룹의 통계치를 나타내는 리스트
# 각 그룹에 해당하는 개수
stat = [0,0,0]
for neighbor in nearest_neighbors:
group_index = neighbor[1]
stat[group_index] += 1
# 이 stat 에서 최대로 큰 값의 위치를 구하면 그게 그룹이 됨
index = np.argmax(stat)
if index == 0:
print("group A")
elif index == 1:
print("group B")
else:
print("group C")
word Embedding 알고리즘
텍스트를 벡터로 변환
원 핫 인코딩 을 사용하면서도 단어 간 유사도를 반영할 수 있도록 단어의 의미를 벡터화하는 방법이다.
비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다는 분포 가설을 따르는 분산 표현 방법을 사용한다
단점 : 원핫인코딩은 유사도를 가질 수 X
위 예시처럼 통시자 속성을 부여하면 [,-1]을 하고, 여성 남성의 경우 [4,] 차이가 존재
ex)
import torch
x_train = torch.FloatTensor([[1,1],[2,2],[3,3]])
y_train = torch.FloatTensor([[10],[20],[30]])
W = torch.randn([2,1], requires_grad=True) # 정규분포에 따른 난수를 반환: 차원크기, 생성되는 텐서의 기울기를 계산할 지 여부
b = torch.randn([1], requires_grad=True)
optimizer = torch.optim.SGD([W,b], lr=0.01)
# [딥러닝 1단계] 모델을 만든다. Model Setup
def H(x):
model = torch.matmul(x,W)+b # matmul : 행렬 곱
return model
# [딥러닝 2단계] 학습을 시킨다. Training
for iter in range(2000):
cost = torch.mean((H(x_train)-y_train)**2) # 오차 제곱 평균 : 코스트 함수
optimizer.zero_grad() # 이전 학습 스텝에서 계산된 gradient를 0으로 초기화 : gradient가 누적되지 않도록 하기 위함
cost.backward() # w와 b에 대한 gradient를 계산
optimizer.step() # 저장된 gradient를 사용하여 w와 b를 업데이트
if iter%100 == 0 : print('[Iteration]',iter,'[Cost]',cost.detach().item())
# [딥러닝 3단계] 추론을 수행한다. Inference
x_test = torch.FloatTensor([4,4])
model_result=H(x_test)
print('Model Inference with [4,4]',model_result.detach().item())
import torch
x_train = torch.FloatTensor([[1,2],[2,3],[3,4],[4,4],[5,3],[6,2]])
y_train = torch.FloatTensor([[0],[0],[0],[1],[1],[1]])
W = torch.randn([2,1], requires_grad=True) # 정규분포에 따른 난수를 반환: 차원크기, 생성되는 텐서의 기울기를 계산할 지 여부
b = torch.randn([1], requires_grad=True)
optimizer = torch.optim.SGD([W,b], lr=0.01)
# [딥러닝 1단계] 모델을 만든다. Model Setup
def H(x):
model = torch.sigmoid(torch.matmul(x,W)+b) # matmul : 행렬 곱, sigmoid 함수로 0~1 값으로 변환
return model
# [딥러닝 2단계] 학습을 시킨다. Training
for iter in range(2000):
cost = torch.mean((-1)*y_train*torch.log(H(x_train))+(-1)*(1-y_train)*torch.log(1-H(x_train))) # 오차 제곱 평균 : 코스트 함수
optimizer.zero_grad() # 이전 학습 스텝에서 계산된 gradient를 0으로 초기화 : gradient가 누적되지 않도록 하기 위함
cost.backward() # w와 b에 대한 gradient를 계산
optimizer.step() # 저장된 gradient를 사용하여 w와 b를 업데이트
if iter%100 == 0 : print('[Iteration]',iter,'[Cost]',cost.detach().item())
# [딥러닝 3단계] 추론을 수행한다. Inference
x_test = torch.FloatTensor([7,1])
model_result=H(x_test)
print('Model Inference with [7,1]',model_result.detach().item())
if model_result.detach().item() >= 0.5 : print('Pass')
else : print('Fail')
다중 분류 모델
이진 분류를 여러번 반복하여 분류함
ex ) A야 아니야?, B야 아니야? , C야 아니야?
각 class일 확률이 저장되는데, argmax값을 구하면 된다.
softmax 에서 y값은 항상 one-hot-Encodding이 되어 있어야 한다.
# hidden layer O
import torch
x_train = torch.FloatTensor([[0,0],[0,1],[1,0],[1,1]])
y_train = torch.FloatTensor([[0],[1],[1],[0]])
W_h = torch.randn([2,3],requires_grad=True) #hidden
b_h = torch.randn([3],requires_grad=True) #hidden
W_o = torch.randn([3,1],requires_grad=True) #ouput
b_o = torch.randn([1], requires_grad=True) #ouput
optimizer = torch.optim.SGD([W_h,b_h,W_o,b_o], lr=0.01)
# [딥러닝 1단계] 모델을 만든다. Model Setup
def H(x):
HL1 = torch.sigmoid(torch.matmul(x,W_h)+b_h) # 히든 레이어 행렬 곱
Out = torch.sigmoid(torch.matmul(HL1,W_o)+b_o) # 아웃풋 레이어 행렬 곱
return Out
# [딥러닝 2단계] 학습을 시킨다. Training
for iter in range(200000):
cost = torch.mean((-1)*y_train*torch.log(H(x_train))+(-1)*(1-y_train)*torch.log(1-H(x_train))) # 오차 제곱 평균 : 코스트 함수
optimizer.zero_grad() # 이전 학습 스텝에서 계산된 gradient를 0으로 초기화 : gradient가 누적되지 않도록 하기 위함
cost.backward() # w와 b에 대한 gradient를 계산
optimizer.step() # 저장된 gradient를 사용하여 w와 b를 업데이트
if iter%10000 == 0 : print('[Iteration]',iter,'[Cost]',cost.detach().item())
# [딥러닝 3단계] 추론을 수행한다. Inference
model_result=H(x_train)
print(model_result)
tensor(
[[0.0011],
[0.9924],
[0.9915],
[0.0122]], grad_fn=<SigmoidBackward0>)
입력 값이 양수일때는 그대로, 음수일때는 0 출력
시그모이드 함수를 사용하면, layer을 깊이 쌓을 수록 기울기가 소실되는 문제가 발생
ReLU는 양수 구간에서는 기울기 값이 1로 유지되므로, 역전파 과정에서 기울기 소실 문제를 완화