Linear Regression

학습 목표

오차가 줄어드는 과정과 얻은 예측식을 함께 보면 학습률이나 Bias가 왜 필요한지 판단할 수 있습니다.

Bias가 있는 센서 보정

시작 조건

제공 코드는 x∈{0,.5}x\in\{0,.5\},…,3.5에서 y=1.8x+.7에 작은 노이즈를 더한 합성 자료를 만듭니다. seed=7입니다.

진행 방법

  1. 제공한 200 epoch 기준 예제를 실행하고 Loss 곡선과 예측 직선을 그리세요.
  2. 학습된 w·b와 데이터 생성 계수를 나누어 표에 적으세요.
  3. 노이즈가 있으므로 학습 계수가 생성 계수와 완전히 같아야 하는지 설명하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import torch
from torch import nn
torch.manual_seed(7)
x=torch.arange(0,4,.5).reshape(-1,1)
y=1.8*x+.7+.15*torch.randn_like(x)
def fit_regression(lr=.05,bias=True,epochs=200):
    torch.manual_seed(7);model=nn.Linear(1,1,bias=bias);opt=torch.optim.SGD(model.parameters(),lr=lr);history=[]
    for _ in range(epochs):
        loss=((model(x)-y)**2).mean();opt.zero_grad();loss.backward();opt.step();history.append(loss.item())
    return model,history
model,history=fit_regression()
print('weight',model.weight.detach().numpy(),'bias',model.bias.detach().numpy())

결과 기록·자가 점검

모델:

w:

b:

Training MSE:

x=0x=0 예측:

확인할 점

같은 모델의 학습률 비교

시작 조건

bias=True와 epoch=200을 고정하고 lr=.01,.05,.1을 비교합니다.

진행 방법

  1. 모든 실행의 초기 seed와 데이터는 고정하세요.
  2. 마지막 MSE와 1·20·200 epoch의 Loss를 기록하세요.
  3. 가장 작은 마지막 Loss와 가장 빠른 초기 감소를 구분하세요.

남길 결과

for lr in [.01,.05,.1]:
    m,h=fit_regression(lr=lr)
    print(lr,h[0],h[19],((m(x)-y)**2).mean().item())
# TODO: 계수와 Loss 그림을 기록하세요.

결과 기록·자가 점검

lr:

Loss@1:

Loss@20:

최종 MSE:

w:

b:

확인할 점

Bias를 빼면 남는 오차

시작 조건

같은 자료에서 lr=.05, epoch=200을 유지하고 bias=True/False를 비교합니다.

진행 방법

  1. 두 예측 직선을 같은 그림에 표시하세요.
  2. x∈{0,.25,1.25,2.75}x\in\{0,.25,1.25,2.75\}에서 예측 값을 표에 적으세요.
  3. 학습 반복을 늘리는 것과 모델에 Bias를 허용하는 것의 차이를 설명하세요.

남길 결과

query=torch.tensor([[0.],[.25],[1.25],[2.75]])
for use_bias in [True,False]:
    m,h=fit_regression(bias=use_bias);print(use_bias,m(query).detach().reshape(-1))

결과 기록·자가 점검

bias 사용:

Training MSE:

x=0x=0:

x=.25x=.25:

x=1.25x=1.25:

x=2.75x=2.75:

확인할 점