예측 오차를 줄이며 직선 찾기
본인 사본을 만들어 실행·수정·기록하세요.
- 이름: ⟦여기에 직접 입력⟧
- 학번: ⟦여기에 직접 입력⟧
- Code Cell 실행: ▶ 또는
Shift+Enter, 위에서부터 순서대로. - Text Cell 작성: 더블클릭 →
직접 입력작성 →Shift+Enter. - 직접 작성 셀: 본인 코드 입력.
- 값 변경 후: 해당 셀과 뒤의 관련 셀 다시 실행.
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로 구성됩니다.
- 데이터 셀에서
A와A_prime을 나란히 출력하고, 어느 열이 선택되었는지 표시하세요. - 식 와 에서 상수 열의 역할을 설명하세요. 이번 모델의
bias=False에 해당하는 식을 고르세요. - 입력 인 표본의 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. 직접 수행
train_linear를 Learning Rate , 각각 1000 epoch로 호출하세요. 함수 안의 동일한 Seed와 모델 초기화를 유지하세요.- 세 Loss 곡선을 한 그래프에 그리고, Learning Rate별 마지막 Weight·MSE를 표로 기록하세요. Loss가 줄어드는 속도를 곡선과 연결해 설명하세요.
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. 직접 수행
A_prime.T @ A_prime의 값과 Determinant를 출력하고 Inverse가 존재하는지 판단하세요.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를 세 행의 표에 적으세요. 직접 계산한 해와 학습 결과의 절대 차이도 적으세요.- 에 대해 입력·Target·예측값·예측값−Target을 한 표로 기록하세요.
예상은 정확한 수치 대신 shape나 증가·감소 방향으로 적어도 됩니다. 코드는 위 예제를 참고해 작성하고, 설명만 묻는 항목은 아래 Text Cell에 답하세요.
# ✍ 직접 작성: 이 셀 아래에 본인의 코드를 추가하세요.
# 코드가 길어지면 Code Cell을 추가해도 됩니다.
C. 직접 기록 · 이 Text Cell을 더블클릭해서 수정
- 확인하거나 바꾼 조건: ⟦직접 입력⟧
- 실행 전 예상: ⟦직접 입력⟧
- 실제 출력/그래프에서 확인한 값: ⟦직접 입력⟧
- 예상과 차이 및 설명: ⟦직접 입력⟧
반복 숙달 · 실행 전에 판단하기
앞의 직접 수행에서 비교한 조건 세 가지를 이 표에 정리하세요. 이미 수행한 실험을 다시 추가할 필요는 없습니다. 비교가 부족하면 한 조건만 바꾸어 보충하세요.
| 변경 조건 | 예상 shape/수치/결과 | 실제 결과 | 오류가 있었다면 원인 |
|---|---|---|---|
| ⟦직접 입력 1⟧ | ⟦직접 입력⟧ | ⟦직접 입력⟧ | ⟦직접 입력⟧ |
| ⟦직접 입력 2⟧ | ⟦직접 입력⟧ | ⟦직접 입력⟧ | ⟦직접 입력⟧ |
| ⟦직접 입력 3⟧ | ⟦직접 입력⟧ | ⟦직접 입력⟧ | ⟦직접 입력⟧ |
# ✍ 반복 실험 코드
선택 실습 · 오류의 원인을 찾아 코드 고치기
모델과 입력의 dtype이 다른 경우
모델 학습까지 마친 뒤, 노트북 맨 아래에 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))Text Cell에 두 입력의 dtype과 실행 성공 여부를 표로 적고, 모델의 dtype과 연결해 원인을 한 문장으로 설명하세요. 입력의 값과 shape는 두 호출에서 같습니다.
저장 전 확인
- 작성란과 출력·그래프를 확인하고 새 런타임에서 전체 셀을 순서대로 실행하세요.
- 본인 Drive에 저장한 뒤
.ipynb로 내려받으세요.
코드, 실제 Output·그래프, 직접 작성한 해석을 포함하세요. 제출은 KLAS를 이용하며 기한은 학기 일정과 최신 공지를 확인합니다.
파일명: 이름_학번_6주차.ipynb.