본문 바로가기

Programming Project/Pytorch Tutorials

Pytorch 머신러닝 튜토리얼 강의 2 (Linear Model)


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

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

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




이번 글에서는 Linear Model에 대해서 다뤄 볼 것입니다.



저번 글에서 우리는 머신러닝이란 무엇인가에 대해서 배워 보았습니다.




위 그림은 몇 시간 공부한 친구는 몇점을 받을까를 머신러닝이 예측하는 것에 대한 그림입니다.


머신러닝 모델에 x Hours 를 공부한 친구는 y Points를 받았다 라는 Dataset을 주어서 모델이 다른 데이터를 예측할 수 있도록 하는 과정을 거칩니다.




우리가 집중해서 봐야 할 부분중에 하나는 어떤 데이터를 주느냐인데, 이 데이터의 종류가 x라는 input을 넣으면 y라는 output을 가져야 한다는 (다른말로는 x시간 공부하면 y점수를 얻는다는) '정답'을 제공해 주기 때문에 우리는 이러한 머신러닝 모델을 지도학습(Supervised Learning)이라고 부릅니다.








Model design


그렇다면 이 예측 모델을 어떻게 만들 수 있을까요?


공부하는 시간이 증가할수록, 점수가 증가할 것 같다는 예측이 됩니다.


그렇다면 우리는 다음 식과 같은 Linear model을 사용할 수 있을 것 같습니다.



x라는 공부시간에 따른 y라는 점수를 이 식을통해 유추하는 모델입니다.



예측한 정답은 x를 입력받아서 y를 내보내는


x -> Linear Model -> y 의 형태를 띄고 있습니다



참고로

... 수식 입력엔 한글이 안 쳐지는군요. y hat과 y predict 은 같다는 점 미리 말씀드립니다. y hat은 수학적으로 예측한 y라는 의미를 가지게 됩니다.








하지만 우리가 만든 모델은 w 와 b가 아직 정해져 있지 않습니다.


그렇기 때문에 우리는 선의 형태만 정해주었을 뿐, 위의 여러 line들 중 어떤 line이 우리의 예측 모델이 될 지는 알 수 없습니다.



그렇기 때문에 일단은 random한 w,b로 부터 시작하고, 점점 w와 b를 우리의 데이터와 더욱 알맞게 조금씩 변경시켜가는 방법을 쓰려고 합니다.


그러기 위해서는 어떤 line이 더욱 좋은 line인지 평가해야 합니다.


가장 쉬운 방법중 하나는 우리의 예측값과 정답을 비교해서 그 차이의 제곱을 하는 것입니다.



식으로 쓰자면 다음과 같습니다.


이 때, 우리가 오차를 계산하기로 정한 식을 error , 혹은 loss 라고 부릅니다.



그리고 아까 우리가 오차를 구한 방식(원본과의 차이를 제곱하여 에러를 구하는 것)은 mean square error이라고 부릅니다.


우리가 가진 데이터 전부가 각각 발생시키는 에러의 평균을 구한 것 입니다.


그렇다면 여러 파라미터(미정인 수 . 여기서는 w,b 들)들 중 가장 이득인 파라미터를 구하면 짜잔~ 


그 찾아내는 과정을 '학습시킨다(training)'라고 합니다.


보편적으로는 미분을 이용합니다.


loss 값을 w에 대해서 그려보면 그 그래프는 다음과 같이 보일 것입니다.




그러면 미분해서 기울기가 낮은 쪽으로 내려가면 모든 파라미터에 대해서 정답을 찾을 수 있게 되는데, 그것은 다음 글에서 제대로 다뤄보도록 합시다.





In Code


그럼 모델을 y = wx 로 조금 단순화 시켜서 기울기를 찾아서 낮은 쪽으로 내려가는 것 말고, 일정 범위 내의 모든 w를 찾아보는 식으로 프로그래밍 해봅시다.


보통, 예측 모델을 사용해서 결과값을 찾아내는 과정을 forward라고 부릅니다.


forward함수는 다음과 같이 정의될 수 있을 것입니다.


w = 1.0
# our model for the forward pass
def forward(x):
    return x * w


그리고 loss 함수 또한 한번 만들어보죠.




# Loss function
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)


이 두 함수를 통해서 우리는 w값이 정해지면, 그 w값이 얼마나 올바른지 알 수 있을 겁니다.


한번 0~4까지 w를 조절해가면서 그 변화를 화면에 보여주는 code를 작성해 보도록 합시다.


그래프를 찍기 위해서 pyplot을 사용할 것인데, 모른다면 그냥 이렇게 쓸 수 있구나 라고 생각하고 넘겨도 무관합니다.



import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]


# our model for the forward pass
def forward(x):
    return x * w


# Loss function
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)


w_list = []
mse_list = []

for w in np.arange(0.0, 4.1, 0.1):
    print("w=", w)
    l_sum = 0
    for x_val, y_val in zip(x_data, y_data):
        y_pred_val = forward(x_val)
        l = loss(x_val, y_val)
        l_sum += l
        print("\t", x_val, y_val, y_pred_val, l)
    print("MSE=", l_sum / 3)
    w_list.append(w)
    mse_list.append(l_sum / 3)

plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()


다른 데이터에 대해서도 한번 구해보는 것도 좋은 실습이 될 것입니다.


다음은 gradient descent에 대해서 배워 볼 것인데, 다음 글에서 이어가겠습니다.