이 모듈의 도달 목표

학습 원리 마일스톤 프로젝트

데이터 준비부터 예측, 손실 계산, 경사하강 학습과 오류 평가까지 하나의 재현 가능한 NumPy 실험으로 완성합니다.

결과물 · NumPy 모델 학습 실험 보고서
약 7~10시간
  • 모델 실험의 입력·학습·평가 단계를 구분해 설계한다
  • 예측·손실·기울기·업데이트를 역할별 함수로 구현한다
  • 같은 초기 조건에서 학습률 실험을 공정하게 비교한다
  • 학습 전후 지표와 실패 사례로 모델 개선 여부를 설명한다
01

모델 실험은 질문과 성공 기준에서 시작한다

코드를 쓰기 전에 무엇을 예측할지, 어떤 데이터로 확인할지, 어느 지표가 얼마나 좋아져야 성공인지 정합니다. 이번 실험의 질문은 선형 모델이 주어진 x와 y 관계를 학습할 수 있는가이며, 최종 MSE가 초기 MSE보다 낮아지는지를 기본 성공 기준으로 삼습니다.

일상에서 보면달리기 전에 출발점과 결승선, 기록 측정 방법을 정하는 것과 같습니다.
question = '선형 관계를 학습할 수 있는가?'
success_rule = 'final_mse <= initial_mse'
print(question)
print(success_rule)
실행 결과
선형 관계를 학습할 수 있는가?
final_mse <= initial_mse
한 줄씩 보기
  1. 검증할 질문을 한 문장으로 정합니다.
  2. 측정 가능한 성공 규칙을 정합니다.
  3. 실험 결과는 이 규칙으로 판단합니다.
직접 값 바꾸기성공 기준에 MAE 조건도 추가한다면 어떤 식으로 쓸지 적어 보세요.
흔한 실수학습을 실행한 뒤 결과에 맞춰 성공 기준을 바꾸면 공정한 실험이 아닙니다.

짧은 확인모델이 좋아졌다는 말을 검증 가능하게 만들려면 무엇이 필요할까요?

02

데이터 shape는 실험의 입력 계약이다

각 x 샘플은 같은 위치의 y 정답과 한 쌍입니다. 따라서 두 배열의 shape가 같아야 하며, 학습 전에 샘플 수와 자료형을 검사하면 뒤늦은 계산 오류와 잘못된 평가를 막을 수 있습니다.

일상에서 보면시험지 번호와 답안지 번호가 정확히 짝지어졌는지 채점 전에 확인하는 것과 같습니다.
import numpy as np
x = np.array([-1.0, 0.0, 1.0])
y = np.array([-2.0, 0.0, 2.0])
print(x.shape, y.shape, x.shape == y.shape)
실행 결과
(3,) (3,) True
한 줄씩 보기
  1. 입력 샘플 세 개를 준비합니다.
  2. 각 입력의 정답 세 개를 준비합니다.
  3. shape 비교로 모든 쌍이 정렬됐는지 확인합니다.
직접 값 바꾸기y의 마지막 값을 지우고 정렬 검사 결과가 False인지 확인하세요.
흔한 실수값의 개수만 보고 같은 위치의 입력과 정답이 실제로 같은 샘플인지 확인하지 않는 경우가 있습니다.

짧은 확인x가 5개이고 y가 4개라면 학습을 시작해도 될까요?

03

역할별 함수가 학습 흐름을 검사 가능하게 만든다

predict는 예측, mse_loss는 손실, gradients는 변화 방향, train은 반복 업데이트만 담당하게 나눕니다. 함수의 책임이 작으면 중간값을 따로 시험할 수 있고 오류가 어느 단계에서 생겼는지 좁히기 쉽습니다.

일상에서 보면주방에서 재료 손질·조리·간 보기 담당을 나누면 문제가 생긴 공정을 빨리 찾는 것과 같습니다.
def predict(x, weight, bias):
    return weight * x + bias

def mse_loss(predictions, targets):
    return ((predictions - targets) ** 2).mean()
실행 결과
predict와 mse_loss가 서로 다른 책임을 가집니다.
한 줄씩 보기
  1. predict는 모델 계산만 수행합니다.
  2. mse_loss는 이미 만들어진 예측을 평가합니다.
  3. 각 함수를 독립적으로 확인할 수 있습니다.
직접 값 바꾸기절대 오차 평균을 반환하는 mae_loss 함수를 별도로 작성하세요.
흔한 실수입력 처리부터 출력까지 한 함수에 모두 넣으면 작은 오류도 전체 코드를 읽어야 찾을 수 있습니다.

짧은 확인기울기 계산이 의심될 때 어떤 함수를 따로 검사하면 될까요?

04

공정한 비교는 한 가지 조건만 바꾼다

두 학습률을 비교하려면 데이터, 초기 weight와 bias, 반복 횟수를 모두 같게 두고 학습률만 바꿔야 합니다. 무작위 초기값을 쓴다면 같은 seed가 필요하지만 이번 실험은 초기값을 직접 입력받아 완전히 재현합니다.

일상에서 보면두 운동법을 비교하면서 한쪽만 더 오래 연습하면 운동법 자체의 차이를 알 수 없는 것과 같습니다.
initial_weight = 0.0
for learning_rate in [0.1, 0.5]:
    weight = initial_weight
    print(learning_rate, weight)
실행 결과
0.1 0.0
0.5 0.0
한 줄씩 보기
  1. 공통 시작 가중치를 정합니다.
  2. 학습률만 두 값으로 바꿉니다.
  3. 각 실험은 같은 초기 가중치에서 시작합니다.
직접 값 바꾸기두 번째 실험이 첫 번째 실험의 최종 weight에서 시작하면 왜 불공정한지 설명하세요.
흔한 실수한 실험이 바꾼 매개변수를 다음 실험에서 그대로 재사용하면 시작 조건이 달라집니다.

짧은 확인학습률 효과만 보려면 어떤 조건들을 같게 유지해야 할까요?

05

평균 지표와 가장 큰 실패를 함께 보고 결론 낸다

MSE는 학습 목표와 큰 오차에 민감한 정도를, MAE는 보통 얼마나 벗어나는지를 원래 단위로 보여 줍니다. 여기에 최대 절대 오차를 함께 보면 평균에 가려진 실패가 없는지 확인할 수 있습니다. 손실 감소만으로 모든 데이터에서 잘 작동한다고 결론 내리지는 않습니다.

일상에서 보면학급 평균 점수와 가장 낮은 점수를 함께 봐야 뒤처진 학생이 있는지 알 수 있는 것과 같습니다.
import numpy as np
errors = np.array([0.1, -0.2, 2.0])
print(np.mean(errors ** 2))
print(np.mean(np.abs(errors)))
print(np.max(np.abs(errors)))
실행 결과
1.3499999999999999
0.7666666666666666
2.0
한 줄씩 보기
  1. 샘플별 부호 있는 오차를 준비합니다.
  2. MSE로 큰 실패를 강하게 반영합니다.
  3. MAE로 평균적인 오차 크기를 봅니다.
  4. 최대 절대 오차로 최악의 사례를 확인합니다.
직접 값 바꾸기마지막 오차 2를 0.3으로 줄였을 때 세 지표가 어떻게 변하는지 비교하세요.
흔한 실수학습에 사용한 데이터의 낮은 손실이 새로운 데이터에서도 같은 성능을 보장하지는 않습니다.

짧은 확인MAE가 낮아도 최대 절대 오차를 따로 확인하는 이유는 무엇일까요?

학습 데이터 계약 검사하기

  1. x와 y의 역할을 구분합니다.
  2. 샘플 수와 shape를 각각 확인합니다.
  3. 입력·정답의 위치별 대응 조건을 검사합니다.
  4. 불일치 데이터로 False 결과도 확인합니다.
import numpy as np

def inspect_dataset(x, targets):
    return len(x), x.shape == targets.shape

x = np.array(input().split(), dtype=np.float64)
targets = np.array(input().split(), dtype=np.float64)
samples, aligned = inspect_dataset(x, targets)
print(f'샘플: {samples}개')
print(f'x shape: {x.shape}')
print(f'y shape: {targets.shape}')
print(f'정렬됨: {aligned}')

핵심을 확인해 볼까요?

5문항 중 4문항 이상 정답이면 완료됩니다. 오답 후에도 다시 제출할 수 있습니다.

1모델 실험을 시작하기 전에 가장 먼저 정할 것은?
2x와 y의 shape를 학습 전에 비교하는 이유는?
3weight와 bias 기울기를 같은 predictions에서 계산해야 하는 이유는?
4두 학습률을 공정하게 비교하는 방법은?
5MSE와 함께 최대 절대 오차를 확인하는 이유는?