예측 오차를 줄이며 직선 찾기

본인 사본을 만들어 실행·수정·기록하세요.

1. 원점을 지나는 회귀 문제

A의 첫 열은 입력 x, 두 번째 열의 1은 Bias용 상수입니다. 이번 기본 문제는 Bias를 고정하므로 첫 열만 A_prime으로 사용합니다. Hypothesis는 model(A_prime), Cost는 MSE입니다.

A. 기준 예제 · 먼저 읽고 실행

import sys, numpy as np, matplotlib.pyplot as plt
import torch
from torch import nn
import torch.nn.functional as F
torch.manual_seed(42)
torch.set_num_threads(2)
print('Python:', sys.version.split()[0], '| PyTorch:', torch.__version__)
A=torch.tensor([[0.,1.],[1.,1.],[2.,1.],[3.,1.]])
B=torch.tensor([[-1.],[0.2],[0.9],[2.1]])
A_prime=A[:,0:1]; B_prime=B
print(A_prime.shape,B_prime.shape)
plt.scatter(A_prime.numpy(),B_prime.numpy());plt.xlabel('x');plt.ylabel('y');plt.show()

B. 직접 수행

A의 각 행은 입력값과 상수 1로 구성됩니다.

  1. 데이터 셀에서 A와 A_prime을 나란히 출력하고, 어느 열이 선택되었는지 표시하세요.
  2. 식 ŷ=wx\hat y=wx와 ŷ=wx+b\hat y=wx+b에서 상수 열의 역할을 설명하세요. 이번 모델의 bias=False에 해당하는 식을 고르세요.
  3. 입력 x=0x=0인 표본의 Target과 모델이 낼 수 있는 값을 비교해, 학습으로 없앨 수 없는 오차가 있는지 적으세요.

예상은 정확한 수치 대신 shape나 증가·감소 방향으로 적어도 됩니다. 코드는 위 예제를 참고해 작성하고, 설명만 묻는 항목은 아래 Text Cell에 답하세요.

# ✍ 직접 작성: 이 셀 아래에 본인의 코드를 추가하세요.
# 코드가 길어지면 Code Cell을 추가해도 됩니다.

C. 직접 기록 · 이 Text Cell을 더블클릭해서 수정

2. 학습과 기록

train_linear(lr=0.01, epochs=1000)은 새 모델을 같은 Seed로 만들어 학습합니다. Learning Rate 비교에서는 lr만 바꾸고 epochs는 고정하세요. Gradient는 Loss가 증가하는 방향이며 SGD는 반대 방향으로 Weight를 갱신합니다.

A. 기준 예제 · 먼저 읽고 실행

def train_linear(lr=0.01,epochs=1000):
    torch.manual_seed(42);model=nn.Linear(1,1,bias=False)
    opt=torch.optim.SGD(model.parameters(),lr=lr);history=[]
    for _ in range(epochs):
        pred=model(A_prime);loss=F.mse_loss(pred,B_prime)
        opt.zero_grad();loss.backward();opt.step();history.append(loss.item())
    return model,history
model,history=train_linear()
print('w:',model.weight.detach(),'MSE:',F.mse_loss(model(A_prime),B_prime).item())
plt.plot(history);plt.xlabel('Epoch');plt.ylabel('MSE');plt.grid();plt.show()

B. 직접 수행

  1. train_linear를 Learning Rate η∈{0.001,0.01,0.1}\eta\in\{0.001,0.01,0.1\}, 각각 1000 epoch로 호출하세요. 함수 안의 동일한 Seed와 모델 초기화를 유지하세요.
  2. 세 Loss 곡선을 한 그래프에 그리고, Learning Rate별 마지막 Weight·MSE를 표로 기록하세요. Loss가 줄어드는 속도를 곡선과 연결해 설명하세요.
  3. train_linear의 loss.backward() 바로 다음 줄에 첫 epoch에서만 model.weight.grad를 출력하는 코드를 추가하세요. Gradient의 부호와 Weight 갱신 방향을 연결하고, 다음 epoch 전에 zero_grad()가 필요한 이유를 설명하세요.

예상은 정확한 수치 대신 shape나 증가·감소 방향으로 적어도 됩니다. 코드는 위 예제를 참고해 작성하고, 설명만 묻는 항목은 아래 Text Cell에 답하세요.

# ✍ 직접 작성: 이 셀 아래에 본인의 코드를 추가하세요.
# 코드가 길어지면 Code Cell을 추가해도 됩니다.

C. 직접 기록 · 이 Text Cell을 더블클릭해서 수정

3. 직접 해와 대조

pinv는 일반적인 Pseudoinverse(의사역행렬) 계산입니다.

A. 기준 예제 · 먼저 읽고 실행

w_pseudo=torch.linalg.pinv(A_prime)@B_prime
w_gradient=model.weight.detach().T
print('pinv:',w_pseudo,'gradient:',w_gradient,'difference:',(w_pseudo-w_gradient).abs())
plt.scatter(A_prime.numpy(),B_prime.numpy(),label='data')
plt.plot(A_prime.numpy(),model(A_prime).detach().numpy(),label='fitted');plt.legend();plt.show()
assert torch.allclose(w_pseudo,w_gradient,atol=1e-3)

B. 직접 수행

  1. A_prime.T @ A_prime의 값과 Determinant를 출력하고 Inverse가 존재하는지 판단하세요.
  2. torch.linalg.inv(A_prime.T @ A_prime) @ A_prime.T @ B_prime, torch.linalg.pinv(A_prime) @ B_prime, Learning Rate 0.01·1000 epoch로 학습한 Weight를 세 행의 표에 적으세요. 직접 계산한 해와 학습 결과의 절대 차이도 적으세요.
  3. x∈{0,1,2,3}x\in\{0,1,2,3\}에 대해 입력·Target·예측값·예측값−Target을 한 표로 기록하세요.

예상은 정확한 수치 대신 shape나 증가·감소 방향으로 적어도 됩니다. 코드는 위 예제를 참고해 작성하고, 설명만 묻는 항목은 아래 Text Cell에 답하세요.

# ✍ 직접 작성: 이 셀 아래에 본인의 코드를 추가하세요.
# 코드가 길어지면 Code Cell을 추가해도 됩니다.

C. 직접 기록 · 이 Text Cell을 더블클릭해서 수정

반복 숙달 · 실행 전에 판단하기

앞의 직접 수행에서 비교한 조건 세 가지를 이 표에 정리하세요. 이미 수행한 실험을 다시 추가할 필요는 없습니다. 비교가 부족하면 한 조건만 바꾸어 보충하세요.

변경 조건 예상 shape/수치/결과 실제 결과 오류가 있었다면 원인
⟦직접 입력 1⟧ ⟦직접 입력⟧ ⟦직접 입력⟧ ⟦직접 입력⟧
⟦직접 입력 2⟧ ⟦직접 입력⟧ ⟦직접 입력⟧ ⟦직접 입력⟧
⟦직접 입력 3⟧ ⟦직접 입력⟧ ⟦직접 입력⟧ ⟦직접 입력⟧
# ✍ 반복 실험 코드

선택 실습 · 오류의 원인을 찾아 코드 고치기

모델과 입력의 dtype이 다른 경우

  1. 모델 학습까지 마친 뒤, 노트북 맨 아래에 Code Cell을 추가하고 다음 코드를 실행하세요.

    print("model:", model.weight.dtype)
    for debug_input in [A_prime.double(), A_prime.float()]:
        print("Input:", debug_input.shape, debug_input.dtype)
        try:
            with torch.no_grad():
                print("Output:", model(debug_input).shape)
        except (RuntimeError, ValueError) as error:
            print(type(error).__name__, str(error))
  2. Text Cell에 두 입력의 dtype과 실행 성공 여부를 표로 적고, 모델의 dtype과 연결해 원인을 한 문장으로 설명하세요. 입력의 값과 shape는 두 호출에서 같습니다.

저장 전 확인

  1. 작성란과 출력·그래프를 확인하고 새 런타임에서 전체 셀을 순서대로 실행하세요.
  2. 본인 Drive에 저장한 뒤 .ipynb로 내려받으세요.

코드, 실제 Output·그래프, 직접 작성한 해석을 포함하세요. 제출은 KLAS를 이용하며 기한은 학기 일정과 최신 공지를 확인합니다.

파일명: 이름_학번_6주차.ipynb.