akaSonny

완전 간단한 Linear model 만들기 본문

Study (Programming)/Pytorch

완전 간단한 Linear model 만들기

Jihyeoning 2022. 5. 20. 13:18

Linear regression 이란?

x(입력값)와 y(출력값)가 $y = x * w + b$ 라는 관계식을 갖고 있다고 가정하고 푸는 문제!

따라서 모델은 $\hat{y} = x * w$ 라는 예측값을 출력하기 위해 1차 계수인 $w$를 학습을 통해 훈련하게 된다.

 

 

이제 간단한 linear model을 만들어보자. 

1. (완전) 간단한 데이터셋 만들기

import torch
import torchvision
import numpy as np
import matplotlib.pyplot as plt

x_data = [1., 2., 3.]
y_data = [2., 4., 6.]

plt.plot(x_data, y_data)
plt.xlabel('Hours')
plt.ylabel('Points')
plt.show()

 

2. weight에 변화를 주면서 loss 값 (여기서는 MSE) 계산하기 

w = 1.0	# initial weight

def forward(x):
	return x * w
    
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2 # mean square error
    
# calculate loss (MSE) according to the change of weight
for w in np.arange(0.0, 4.1, 0.1):
    print("w = %.1f"%(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".join([str(x_val), str(y_val), "%.1f"%(y_pred_val), "%.2f"%(l)]))
        
    print("MSE = %.2f \n"%(l_sum / len(x_val)))

2-1. weight 변화에 따른 loss 값 도식화 (매 반복 실행마다 weight와 loss 값을 리스트에 저장하면 된다.) 

w_list = []
mse_list = []

for w in np.arange(0.0, 4.1, 0.1):
  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)      # loss 계산
    l_sum += l

  w_list.append(w)
  mse_list.append(l_sum / len(x_val))

plt.plot(w_list, mse_list)
plt.ylabel("Loss")
plt.xlabel("Weight")
plt.show()

 

이렇게 되면 weight가 2에서 loss가 최소가 나오는 것을 볼 수 있다.

이건 정말정말 간단하게 linear한 관계를 가지는 데이터들의 weight를 어떻게 찾을 수 있는지 확인하는 실습이었다.

딥러닝 모델의 훈련 목적은 저 loss값이 최소가 되는 weight를 찾는 것! 

다음 시간부터는 어떻게 loss를 찾는지에 대해 공부할 것이당