Published on

πŸ“PyTorch Zero to All - Lecture02 Overview

Model Design

λ¨Έμ‹ λŸ¬λ‹μ˜ λͺ¨λΈμ—λŠ” 3가지 μ’…λ₯˜κ°€ μžˆλ‹€.

  • Supervised Learning(μ§€λ„ν•™μŠ΅)
  • Unsupervised Learning(λΉ„μ§€λ„ν•™μŠ΅)
  • Reinforcement Learning(κ°•ν™”ν•™μŠ΅)

κ΅μˆ˜λ‹˜μ˜ κ°•μ˜μ—μ„œ μ‚¬μš©λ  λ¨Έμ‹ λŸ¬λ‹μ˜ μ’…λ₯˜λŠ” Supervised Learning(μ§€λ„ν•™μŠ΅) νƒ€μž…μ΄λ‹€.

κ°•μ˜ μ˜μƒμ—μ„œλŠ” μ‹œκ°„μ— λ”°λ₯Έ 점수λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” λͺ¨λΈμ„ μ˜ˆμ œμ‚Όμ•„ 섀계λ₯Ό μ§„ν–‰ν•œλ‹€.

μš°μ„ , μ§€λ„ν•™μŠ΅μ„ ν•˜κΈ° μœ„ν•΄ 주어진 λ°μ΄ν„°λ“€μ˜ λΆ„λ₯˜κ°€ ν•„μš”ν•˜λ‹€. 크게 Training dataset κ³Ό Test dataset으둜 λ‚˜λ‰œλ‹€. 예제 속 두 데이터셋은 λ‹€μŒκ³Ό κ°™λ‹€.

Hours(x)Points(y)
12Train
24Train
36Train
4?Test

λ§ˆμ§€λ§‰ "?"의 값을 μ˜ˆμΈ‘ν•˜λŠ” λ¨Έμ‹ λŸ¬λ‹ λͺ¨λΈμ„ μ„€κ³„ν•˜λŠ” 것이 ν˜„μž¬μ˜ λͺ©ν‘œμ΄λ‹€.

λ‹€μŒκ³Ό 같은 데이터λ₯Ό κ°€μž₯ 잘 정리할 수 μžˆλŠ” λͺ¨λΈμ€ μ„ ν˜•(Linear)λͺ¨λΈμ΄λΌκ³  λ³Ό 수 μžˆλ‹€. 기초적인 μ„ ν˜• 방정식을 ν† λŒ€λ‘œ λ‚˜μ€‘μ— 좔가될 κ°€μ€‘μΉ˜(weight)κ°œλ…κ³Ό λ°”μ΄μ–΄μŠ€(bias) κ°œλ…κΉŒμ§€ ν™œμš©ν•˜μ—¬ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

y^=xβˆ—w+b\hat{y} = x * w + b
x→Linear→y^x\rightarrow Linear \rightarrow \hat{y}

두 식쀑, μœ„μ˜ 식 y^=xβˆ—w+b\hat{y} = x * w + b μ—μ„œ bλŠ” λ”μš± κ°„λ‹¨ν•œ μ‹μ˜ ν‘œν˜„μ„ μœ„ν•΄ μƒλž΅ν•˜κ³  κ·Έλž˜ν”„λ₯Ό μž‘μ„±ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

μœ„μ˜ κ·Έλž˜ν”„μ˜ 선은 μž…λ ₯에 λŒ€ν•œ 정닡을 μ •ν™•νžˆ μ˜ˆμΈ‘ν•˜λŠ” True Line이닀. μ§€κΈˆλΆ€ν„° μš°λ¦¬κ°€ μ„€κ³„ν•œ λͺ¨λΈμ€ ν•΄λ‹Ή True Line에 κ°€μž₯ κ·Όμ ‘ν•  수 μžˆλŠ” ww값을 random guessingν•œλ‹€. λ¬΄μž‘μœ„ 예츑이기 λ•Œλ¬Έμ—, True Lineμ—μ„œλŠ” λΉ—κ»΄κ°„ λ‹€μ–‘ν•œ 예츑 λͺ¨λΈλ“€μ΄ λ“±μž₯ν•œλ‹€. κ·Έλž˜ν”„ μœ„μ— ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

μ§€κΈˆ λΆ€ν„° μš°λ¦¬κ°€ ν•΄μ•Ό ν•  일은, 예츑된 λ‹€μ–‘ν•œ κ·Έλž˜ν”„λ“€μ΄ μ΅œλŒ€ν•œ True Line에 가깝도둝 ν•˜λŠ” 것이닀. 그러기 μœ„ν•΄μ„œλŠ” κ·Έλž˜ν”„ λ³„λ‘œ True Line과의 거리λ₯Ό μΈ‘μ •ν•˜μ—¬ μ€„μ΄λŠ” 것이닀. True Line을 yy, μš°λ¦¬κ°€ λ§Œλ“  κ·Έλž˜ν”„λ₯Ό y^\hat{y}둜 λ³΄μ•˜μ„ λ•Œ, 두 κ·Έλž˜ν”„μ˜ κ±°λ¦¬λŠ” yβˆ’y^y - \hat{y} 이닀. μš°λ¦¬μ—κ²ŒλŠ” λΆ€ν˜Έμ˜ μ˜λ―Έκ°€ ν•„μš”μ—†κ³  거리의 크기가 ν•„μš”ν•˜κΈ°μ— μ œκ³±μ„ μ”Œμ–΄μ€€λ‹€. μ΄λ ‡κ²Œ λ‚˜μ˜¨ 값을 error(였λ₯˜) 라고 λΆ€λ₯΄κ³ , μ΄λŸ¬ν•œ 값을 μ–»λŠ” ν•¨μˆ˜λ₯Ό Loss Function(μ†μ‹€ν•¨μˆ˜) 이라고 λΆ€λ₯Έλ‹€. μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό μ€„μ΄λŠ” 것이 μ΅œμ„ μ˜ 값을 μ‚°μΆœν•΄ λ‚Ό 해법이닀.μ‹μœΌλ‘œ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

loss=(y^βˆ’y)2=(xβˆ—wβˆ’y)2loss = (\hat{y} - y)^2 = (x * w - y) ^ 2

λ‹€μŒμ€ ww κ°’μ˜ 변화에 λ”°λ₯Έ μ†μ‹€μ˜ λ³€ν™”λ₯Ό μ •λ¦¬ν•œ ν‘œμ΄λ‹€.

MSE = Mean Square Error, 손싀 제곱 평균
=> loss=loss = 1N1\over N βˆ‘n=1N(yn^βˆ’yn)2\sum_{n=1}^N (\hat{y_n} - y_n)^2

Hours, xxLoss(ww = 0)Loss(ww = 1)Loss(ww = 2)Loss(ww = 3)Loss(ww = 4)
141014
21640416
33690936
MSE = 56/3 = 18.7MSE = 14/3 = 4.7MSE = 0MSE = 14/3 = 4.7MSE = 56/3 = 18.7

κ·Έλž˜ν”„λ‘œ λ‚˜νƒ€λ‚˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

Let's code

sungkim κ΅μˆ˜λ‹˜μ˜ λͺ¨λ“  μ½”λ“œλŠ” ν•΄λ‹Ή git-hub에 정리 λ˜μ–΄ μ˜¬λΌμ™€ μžˆλ‹€. κ·Έ 쀑 가독성과 정리λ₯Ό μœ„ν•΄ μΌλΆ„μ”©λ§Œ λ°œμ·Œν•˜μ—¬ μ„€λͺ…κ³Ό ν•¨κ»˜ μ½”λ“œλ₯Ό 정리해 보겠닀.

μš°μ„ , 예제둜 삼은 μ‹œκ°„μ— λ”°λ₯Έ 점수 예츑 λͺ¨λΈ 연산을 μœ„ν•΄ ν•„μš”ν•œ 기초적인 νŒ¨ν‚€μ§€λ“€μ„ 뢈러였고 μš°λ¦¬κ°€ μ„€μ •ν•œ 데이터 값을 λ„£μ–΄μ€€λ‹€.

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]

λ‹€μŒμœΌλ‘œ y^=xβˆ—w\hat{y} = x * w에 ν•΄λ‹Ήν•˜λŠ” 파트인 λͺ¨λΈ 섀계 ν•¨μˆ˜λ₯Ό μ„€μ •ν•˜μž.

w = 1.0

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

μ†μ‹€ν•¨μˆ˜loss=(y^βˆ’y)2loss = (\hat{y} - y)^2도 μ½”λ“œλ‘œ μž‘μ„±ν•˜μž

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

ww에 λ”°λ₯Έ 손싀 계산을 μœ„ν•œ 반볡문 뢀뢄도 μžˆλ‹€.

for w in np.arange(0.0, 4.1, 0.1):
    # Print the weights and initialize the lost
    print("w=", w)
    l_sum = 0

    for x_val, y_val in zip(x_data, y_data):
        # For each input and output, calculate y_hat
        # Compute the total loss and add to the total error
        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)
    # Now compute the Mean squared error (mse) of each
    # Aggregate the weight/mse from this run
    print("MSE=", l_sum / len(x_data))

ww에 λ”°λ₯Έ 손싀 λ³€ν™”λ₯Ό 잘 ν™•μΈν•˜κΈ°μœ„ν•΄ κ·Έλž˜ν”„λ₯Ό κ·Έλ €μ„œ 확인할 μˆ˜λ„ μžˆλ‹€. κ·Έλž˜ν”„λ₯Ό 그리기 μœ„ν•΄μ„œλŠ” λ‹€μŒ μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ κ°€λŠ₯ν•˜λ‹€.

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

# Plot it all
plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

μœ„ μ½”λ“œμ—μ„œ 두쀄은, 이전 손싀 계산을 μœ„ν•œ 반볡문 μ•ˆμ— λ„£μ–΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ μ™ΈλΆ€μ˜ λ¦¬μŠ€νŠΈμ— λ‹΄μ•„μ„œ ν•œλ²ˆμ— κ°€κ³΅ν•˜μ—¬ κ·Έλž˜ν”„λ₯Ό κ·Έλ¦°λ‹€. 그렀진 κ·Έλž˜ν”„λŠ” λ‹€μŒκ³Ό κ°™λ‹€.


참고자료 : Youtube Link

pytorchzerotoall_github