PyTorch Lecture 06: Logistic Regression

조병근·2020년 9월 18일

우리가 이 때까지 쓴 모델들은 real number를 입력으로 받고 real number를 결과로 내 놓는 Linear model 이었다.

하지만 실생활에서, Binary prediction(0 or 1)이 유용할 수 있다.

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

이를 위해서 sigmoid함수를 사용한다.

real number를 0~1 사이의 값으로 변환할 수 있다.

예를 들어 예측 값이 0.5보다 크면 참이라고 예측할 수 있다.

BCEloss

이를 위해서 새로운 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에 따라 코드를 짜보자.

Exercise

1. Design model using class


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이 가능하게 했다는 거다.

2. Construct loss and optimizer


criterion=torch.nn.BCELoss(reduction='mean')
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)

3. Training cycle

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()

🚀 Exercise

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)
profile
I'm always chobo

0개의 댓글