관리 메뉴

ComputerVision Jack

PyTorch Lecture 02 : Linear Model 본문

DeepLearning/Pytorch_ZeroToAll

PyTorch Lecture 02 : Linear Model

JackYoon 2020. 9. 15. 16:01
반응형

김성훈 교수님의 모두의 딥러닝 수업에 이어 PyTorch ZeroToAll (in English) 강의를 듣고 스스로 정리해보는 시간을

가져보려고 합니다.  영문 버전이지만 교수님께서 쉽운 영어로 편안하게 가르쳐 주셨습니다.

 

강의 링크

www.youtube.com/playlist?list=PLlMkM4tgfjnJ3I-dbhO9JTw7gNty6o_2m

 

PyTorchZeroToAll (in English)

Basic ML/DL lectures using PyTorch in English.

www.youtube.com

 

Lecture 01 은 기본적인 딥러닝에 관한 개요를 설명해주시는 부분이기 때문에 강의를 듣고 따로 정리하진 않았습니다. 강의 정리는 Lecture02 : Linear Model 부터 정리를 시작했습니다.

Linear Model

모두의 딥러닝 수업처럼 처음은 Linear Model(선형 모델)로 시작하셨습니다. 선형 모델은 말 그대로 입력 데이터셋에 대해 선형으로 출력 데이터를 예측할 수 있는 모델을 뜻합니다.

보통은 y = x * w + b 의 식의 형태로 나타낼 수 있습니다. 여기서 w는 weight(가중치)를 뜻하고 b는 bias(편향)을 나타냅니다. 하지만 b에 대해선 나중에 언급하겠다 하시고 간단한 y = x * w 모델에 대해서 살펴보았습니다.

 

x_data y_data
1 2
2 4
3 6
4 ?

양의 상관 관계가 존재하는 데이터 셋이 존재한다고 생각해봅니다. 1시간 공부하면 2 points를 얻고 2시간 공부하면 4 points를 얻게 됩니다. 그랬을 경우 4에대한 points를 예측하는 것입니다.

 

우선 우린 규칙성을 토대로 4에대한 결과 값을 생각할 수 있습니다. 

y_data는 x_data에 대해 2배씩 증가함을 알 수 있습니다. 따라서 x_data가 4인 경우 y_data는 8이 결과로 출력됩니다.

 

다음은 이러한 규칙성에 대해 수식으로 접근해보겠습니다.

y_data = x_data * w 로 생각해봅니다.  네 쉽게 w의 값은 2라고 예측이 가능하게됩니다. 그럼 이러한 w의 값을 오차를 통해서 접근해보겠습니다.

 

기본적으로 오차 = 예측값 - 실제값 으로 오차를 표기할 수 있습니다. 하지만 실제값이 예측값 보다 큰 경우 음수가 발생할 수 있기 때문에 (예측값 - 실제값)^2 제곱을 취합니다. 그럼 간단하게 예제를 통해서 MSE 오차를 알아보겠습니다.

 

실습 - w 값이 1인 경우

x_data y_data (y_pred - y_data)^2
1 2 1
2 4 4
3 6 9

따라서 해당 x_data에 대한 MSE 오차의 값은 (y_pred - y_data) ^2 를 전체 경우의 갯수 3으로 나눠주면 됩니다.

MSE = (1 + 4 + 9) / 3 = 4.66666  이됩니다.

따라서 우린 MSE를 최소화 하는 값의 w를 찾아야합니다.

[01.basic.py]

import numpy as np

import matplotlib.pyplot as plt

# 수치해석 라이브러리 numpy와 그래프 시각화에 필요한 matplotlib 라이브러리를 import합니다.

 

x_data = [1.0, 2.0, 3.0]

y_data = [2.0, 4.0, 6.0]

#해당 실습에 필요한 데이터셋을 정의합니다.

 

def forward(x):

    return x * w

# forward라는 이름의 선형 함수를 정의합니다. x_data와 w(weight)을 곱하는 함수입니다.

 

def loss(x, y):

    y_pred = forward(x)

    return (y_pred - y) * (y_pred - y)

# 다음은 오차를 계산하는 함수를 정의합니다. y_pred 변수를 통해 w값에 대한 예측 값을 알수 있습니다.

 

w_list = [ ] 

mse_list = [ ]

#나중에 그래프를 그리기 위해 특정 w값에 매칭되는 mse값을 알수 있도록 서로 공백리스트를 만들고

해당 값을 append함수를 이용하여 append합니다.

 

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 += 1

        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)

# w의 값을 0부터 4까지 0.1 씩 증가하면해 해당 w에 대한 MSE값을 구하고 각각 리스트에 해당 값을 추가합니다. MSE경우 오차의 합을 경우의 수로 나누기 때문에 l_sum에 대해 경우의 수 3으로 나눠줍니다.

 

실행 결과

실행 결과를 보면 w = 2.0 인 경우 MSE 값이 0으로 이상적인 것을 알 수 있습니다.

 

plt.plot(w_list, mse_list)

plt.ylabel('Loss')

plt.xlabel('w')

plt.show()

# 해당 리스트를 그래프로 출력해도 w = 2.0인 경우 최소 값을 갖는 것을 확인할 수 있습니다.

반응형
Comments