Linear Regression
학습 목표
오차가 줄어드는 과정과 얻은 예측식을 함께 보면 학습률이나 Bias가 왜 필요한지 판단할 수 있습니다.
Bias가 있는 센서 보정
시작 조건
제공 코드는 ,…,3.5에서 y=1.8x+.7에 작은 노이즈를 더한 합성 자료를 만듭니다. seed=7입니다.
진행 방법
- 제공한 200 epoch 기준 예제를 실행하고 Loss 곡선과 예측 직선을 그리세요.
- 학습된 w·b와 데이터 생성 계수를 나누어 표에 적으세요.
- 노이즈가 있으므로 학습 계수가 생성 계수와 완전히 같아야 하는지 설명하세요.
남길 결과
- 데이터·예측 직선과 Loss 그림, 계수 표.
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:
예측:
확인할 점
- 예측식이 wx+b인지 확인했는가?
- 최종 Loss는 최종 모델로 다시 계산했는가?
같은 모델의 학습률 비교
시작 조건
bias=True와 epoch=200을 고정하고 lr=.01,.05,.1을 비교합니다.
진행 방법
- 모든 실행의 초기 seed와 데이터는 고정하세요.
- 마지막 MSE와 1·20·200 epoch의 Loss를 기록하세요.
- 가장 작은 마지막 Loss와 가장 빠른 초기 감소를 구분하세요.
남길 결과
- 3행 표와 Loss 곡선 1개.
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:
확인할 점
- 조건마다 모델을 새로 초기화했는가?
- Gradient 초기화가 반복마다 수행되는가?
Bias를 빼면 남는 오차
시작 조건
같은 자료에서 lr=.05, epoch=200을 유지하고 bias=True/False를 비교합니다.
진행 방법
- 두 예측 직선을 같은 그림에 표시하세요.
- 에서 예측 값을 표에 적으세요.
- 학습 반복을 늘리는 것과 모델에 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:
:
:
:
:
확인할 점
- 생성 자료를 Bias 없는 문제라고 오해하지 않았는가?
- 모델 가정과 최적화 조건을 구분했는가?