우리가 이 때까지 쓴 모델들은 real number를 입력으로 받고 real number를 결과로 내 놓는 Linear model 이었다.
하지만 실생활에서, Binary prediction(0 or 1)이 유용할 수 있다.

모델에 사용했던 예제를 보면, 공부한 시간을 입력으로 넣으면 점수가 나왔다. 그 걸 PASS / FAIL 여부로 구분(Binary prediction)하는 모델을 만드려고 한다.
이를 위해서 sigmoid함수를 사용한다.

real number를 0~1 사이의 값으로 변환할 수 있다.
예를 들어 예측 값이 0.5보다 크면 참이라고 예측할 수 있다.

이를 위해서 새로운 loss를 적용할 필요가 있다. sigmoid함수는 예측값이 1에 가까울 수록 참이라고 예측한 것이고, 0에 가까울 수록 거짓이라고 예측한 것이다.
위의 식을 보면 +를 기준으로 각각이 참일 때 참이라고 예측하는 경우와 거짓일 때 거짓이라고 예측하는 경우를 나타낼 수 있게 loss함수를 만들어놨다.
y가 참이면, (1-y)는 0이 된다. 그러면 log y^는 y^이 1에 가까울 수록 작은 값을 가진다.
y가 거짓이면, y는 0이고, log 1-y^가 작아지려면 y^은 0에 가까운 값이어야 한다.
loss가 작다는 말은 예측값이 실제 값과 가깝다는 말이다.
5강에서 배웠던 Pytorch rhythm에 따라 코드를 짜보자.
class Model(torch.nn.Module):
def __init__(self):
super().__init__()
self.linear = torch.nn.Linear(1,1)
def forward(self,x):
y_pred=sigmoid(self.linear(x))
return y_pred
달라진 점은 sigmoid함수를 사용해 Binary prediction이 가능하게 했다는 거다.
criterion=torch.nn.BCELoss(reduction='mean')
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
for epoch in range(500):
y_pred=model(x_data)
loss=criterion(y_pred,y_data)
print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
import torch
from torch import sigmoid
from torch.autograd import Variable
x_data=Variable(torch.Tensor([[1.0],[2.0],[3.0],[4.0]]))
y_data=Variable(torch.Tensor([[0.],[0.],[1.],[1.]]))
class Model(torch.nn.Module):
def __init__(self):
super().__init__()
self.linear = torch.nn.Linear(1,1)
def forward(self,x):
y_pred=sigmoid(self.linear(x))
return y_pred
model=Model()
criterion=torch.nn.BCELoss(reduction='mean')
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
for epoch in range(500):
y_pred=model(x_data)
loss=criterion(y_pred,y_data)
print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
res=Variable(torch.Tensor([[1.0]]))
print ("predict 1 hour",1.0,model(res).data[0].item()>0.5)
res=Variable(torch.Tensor([[7.0]]))
print ("predict 1 hour",7.0,model(res).data[0].item()>0.5)