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

실습 전에

01 식에서 데이터로

직선의 식으로 값을 계산하는 것과, 측정값에서 직선의 식을 찾는 것은 무엇이 다를까요?

설명
  • 앞에서는 기울기를 알고 결과를 계산했다면, 이번에는 데이터의 경향을 설명할 기울기를 찾습니다.
  • 실습에서는 절편을 0으로 고정하고 기울기 하나를 조절합니다. 모델이 허용하는 직선의 범위를 단순하게 정한 것입니다.

관련 개념 복습 ↗

02 학습과 가정

기울기를 계속 조절하면 어떤 데이터든 오차 없이 설명할 수 있을까요?

설명
  • 원점을 지나는 직선만 허용하면, 원점을 지나지 않는 관계나 곡선 형태의 데이터를 정확하게 표현하기 어렵습니다.
  • Loss와 Gradient로 선택한 모델 안에서 오차를 줄입니다. 반복 횟수를 늘리는 것과 모델의 가정을 바꾸는 것은 다릅니다.

실습

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

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

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

2. 학습과 기록

  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()가 필요한 이유를 설명하세요.

3. 직접 해와 대조

  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을 한 표로 기록하세요.

제출·저장

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

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

실행 환경을 다시 시작하고 전체 코드를 위에서부터 실행한 뒤 저장하세요.

선택 실습

모델과 입력의 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는 두 호출에서 같습니다.