본문 바로가기

Programming Project/Pytorch Tutorials

Pytorch 머신러닝 튜토리얼 강의 6 (Logistic Regression)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

2018/07/02 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 1 (Overview)

2018/07/02 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 2 (Linear Model)

2018/07/03 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 3 (Gradient Descent)

2018/07/03 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 4 (Back-propagation and Autograd)

2018/07/07 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 5 (Linear Regression in the PyTorch way)




이전 강의에서는 Linear model에 대해서 배워 보았습니다.


이 모델은 어떤 실수를 데이터로 받아서, 실수의 값을 예측하는 모델이었습니다.


그러나 우리 실세계에서는 Binary prediction (0 이나 1을 예측하는 것)이 굉장히 유용할 수 있습니다.


예를 들어, 시험에 통과 할 것인지, 떨어질 것인지에 대한 것.

한국이 축구에 이길것인지, 질 것인지.


등등 양쪽으로 나뉘는 것에 대한 것을 의미합니다.


이것을 해결 할 수 있는 방법은 간단합니다.


Linear layer의 output에 sigmoid 식을 추가로 넣어주는 것입니다.







Sigmoid (로지스틱 함수)



Sigmoid함수는 아래 그림의 오른쪽 식을 말합니다.


input을 적당히 넣어주면 0~1 사이의 output을 반환하는 함수인데, 


input이 0일때는 0.5가 나오고 0으로부터 음수가 될 수록 0으로 근접해가고, 양수가 될 수록 1로 근접해가는 함수입니다.





기존의 모델에 그림과 같이 기존 linear model의 output 결과를 sigmoid함수의 input으로 넣어주게되면 우리는 0~1 사이의 결과값을 얻을 수 있게 됩니다.


이제, 우리는 output y를 가지고 0.5를 기준으로 0.5 이상인지 이하인지를 확인하면서 양쪽으로 결과를 나누면 됩니다.





linear model의 output을 sigmoid로 통과시킨다는 말은 위의 식으로도 표현할 수 있습니다.


linear model의 식을 sigmoid 함수로 감싼거죠.


이런 sigmoid 함수를 사용하면, 기존의 우리가 만들었던 식의 결과를 0~1 사이로 나오게 할 수 있습니다.



또한 기존에 배웠던 MSE Loss는 이런 식에는 잘 맞지 않기 때문에, 우리는 새로 배운 식에 알맞은 새로운 Loss function에 대해서 생각해보아야 합니다.








Cross Entropy Loss


이번에 다루어 볼 Loss 는 Cross Entropy Loss 입니다.


우선 기본적으로, 정답이 되는 y값은 0 혹은 1이고, 우리는 0~1 사이의 결과를 도출한다는 상태에서 Loss function을 만들게 되었다는 것을 알고 아래의 식을 봅시다.


이 loss 함수가 나오게 된 이론적인 배경이 꽤나 심오하게 있지만 복잡하니 넘어가도록 하구요.



기본적인 아이디어는 우리 model이 correct일 때눈 loss가 작고, model이 wrong일 때는 loss가 높으면 됩니다.


여기서 보면 정답인 y가 1일경우  을 더해주고 있고,


정답인 y가 0일경우에는 1에서 뺀 값을 더해주고 있는것을 볼 수 있습니다.



Log함수를 보면 아시겠지만, 0에 가까울수록 음의 무한으로 가고 1일 경우 값이 0이 됩니다.


그렇기에 -log(1)을 향해 가도록 loss함수는 열심히 시도하게 되는 것이죠.





주어진 데이터에 대해서 계산을 해보면, 올바를 때 낮고 , 틀릴 때 높은 결과가 나오는 것을 확인할 수 있습니다.







그러면 이제, Sigmoid 함수 (logistic 함수) 를 코드로 구현 해 봅시다.









Logistic Regression with PyTorch



import torch
import torch.nn.functional as F

class MyModel(torch.nn.Module):
    
    def __init__(self):
        super(MyModel,self).__init__()
        self.linear = torch.nn.Linear(1,1)
        
    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred



일단 모델을 만들고, forward쪽에 

self.linear(x) 로 그냥 예측했던 것에서 F.sigmoid( self.linear(x) )의 식으로 모델을 만들어서 예측해봅시다.


이렇게만 하면 sigmoid가 적용된 PyTorch Model 코드를 구현할 수 있습니다.


그 후 , criterion을 BCE Loss 로 바꿔줍시다. (Binary Cross Entropy Loss)


x_data = torch.Tensor( [ [1.0],[2.0],[3.0],[4.0] ])
y_data = torch.Tensor( [ [0.],[0.],[1.],[1.] ])

model = MyModel()
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

for epoch in range(1000):
    
    y_pred = model(x_data)
    
    loss = criterion(y_pred,y_data)
    if(epoch%100==0):
        print(epoch, loss.data[0])
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
hour_var = torch.Tensor([[1.0]])
print("1hour : ",1.0, model(hour_var).data[0][0]>0.5)
hour_var = torch.Tensor([[7.0]])
print("7hour : ",7.0, model(hour_var).data[0][0]>0.5)


자 이제 이 코드로 예전같이 쭉 돌려보면, 제대로 결과가 나오는 것을 확인 하실 수 있을 것입니다.


error가 0이 안되는것이 정상입니다.


0 tensor(1.7668)
100 tensor(0.5496)
200 tensor(0.4994)
300 tensor(0.4824)
400 tensor(0.4673)
500 tensor(0.4532)
600 tensor(0.4400)
700 tensor(0.4276)
800 tensor(0.4159)
900 tensor(0.4049)
1hour :  1.0 tensor(0, dtype=torch.uint8)
7hour :  7.0 tensor(1, dtype=torch.uint8)


참고로

0 -> false

1 -> true

를 의미합니다.










숙제




보통 Linear 의 output을 받아서 새로 가공하는 함수들이 많이 있고,


그런 Non-linear Activation 함수들의 예시가 사진에 많이 있습니다.


각각의 특징을 찾아보고 이것 저것 골라서 써봅시다.