이 모듈의 도달 목표

손실을 줄이며 모델 학습시키기

여러 오차를 평균 제곱 손실로 모으고 기울기와 학습률을 사용해 가중치·편향을 반복해서 개선합니다.

결과물 · 선형 모델 학습 시뮬레이터
약 5~7시간
  • 개별 오차와 전체 손실의 역할을 구분한다
  • MSE와 가중치·편향 기울기를 NumPy로 계산한다
  • 학습률을 적용해 매개변수를 경사하강 방향으로 갱신한다
  • 학습 전후 손실을 비교해 모델이 개선됐는지 판단한다
01

손실은 여러 예측의 틀린 정도를 숫자 하나로 모은다

샘플마다 오차가 하나씩 생기지만 모델 전체를 개선하려면 모든 샘플을 대표하는 기준이 필요합니다. 손실 함수는 오차 배열을 하나의 숫자로 줄여 현재 모델이 얼마나 나쁜지 나타냅니다.

일상에서 보면학생별 오답 개수를 모아 반 전체의 평균 성취도를 하나의 숫자로 보는 것과 같습니다.
import numpy as np
errors = np.array([-1.0, 1.0, 3.0])
loss = np.mean(errors ** 2)
print(loss)
실행 결과
3.6666666666666665
한 줄씩 보기
  1. 샘플별 부호 있는 오차를 준비합니다.
  2. 오차를 제곱해 모두 0 이상으로 만듭니다.
  3. 평균을 내 모델 전체 손실을 구합니다.
직접 값 바꾸기마지막 오차 3을 6으로 바꾸고 손실이 얼마나 커지는지 확인하세요.
흔한 실수부호 있는 오차를 그대로 평균내면 과대와 과소가 상쇄될 수 있습니다.

짧은 확인손실 함수의 출력은 샘플 수만큼의 배열일까요, 모델을 대표하는 숫자 하나일까요?

02

MSE는 큰 오차를 더 강하게 벌점 준다

평균 제곱 오차 MSE는 각 오차를 제곱한 뒤 평균냅니다. 오차가 두 배가 되면 제곱 오차는 네 배가 되어 큰 실패가 손실에 더 큰 영향을 줍니다.

일상에서 보면작은 지각보다 매우 긴 지각에 더 큰 벌점을 주는 규칙과 같습니다.
import numpy as np
errors = np.array([1.0, 2.0, 4.0])
print((errors ** 2).tolist())
print(np.mean(errors ** 2))
실행 결과
[1.0, 4.0, 16.0]
7.0
한 줄씩 보기
  1. 크기가 다른 오차를 준비합니다.
  2. 제곱하면 큰 오차의 차이가 확대됩니다.
  3. 세 제곱 오차의 평균이 MSE입니다.
직접 값 바꾸기오차 4를 제거했을 때 MSE가 얼마나 낮아지는지 확인하세요.
흔한 실수MSE의 단위는 원래 정답 단위의 제곱이므로 MAE와 숫자를 직접 같은 의미로 비교하지 않습니다.

짧은 확인오차 2와 4의 제곱 벌점은 몇 배 차이일까요?

03

기울기는 매개변수를 움직였을 때 손실이 변하는 방향

기울기가 양수면 매개변수를 키울수록 손실이 커지는 방향이고, 음수면 매개변수를 키울수록 손실이 작아지는 방향입니다. MSE 선형 모델에서 가중치 기울기는 2×mean(error×x)로 계산할 수 있습니다.

일상에서 보면언덕에서 발밑 경사가 올라가는 방향을 알려 주는 화살표와 같습니다.
import numpy as np
x = np.array([-1.0, 1.0])
y = np.array([-2.0, 2.0])
weight = 0.0
errors = weight * x - y
dw = 2 * np.mean(errors * x)
print(errors.tolist(), dw)
실행 결과
[2.0, -2.0] -4.0
한 줄씩 보기
  1. 현재 가중치 0의 예측 오차를 구합니다.
  2. 각 오차에 입력 x의 영향을 곱합니다.
  3. 평균과 2를 곱해 가중치 기울기를 구합니다.
  4. 음수 기울기는 가중치를 키우는 쪽이 손실을 줄인다는 뜻입니다.
직접 값 바꾸기weight를 2로 바꾸면 오차와 기울기가 0이 되는지 확인하세요.
흔한 실수기울기는 손실 자체가 아니라 매개변수 변화에 따른 손실의 방향과 민감도입니다.

짧은 확인기울기가 음수라면 손실을 줄이기 위해 가중치를 키워야 할까요, 줄여야 할까요?

04

경사하강법은 기울기의 반대 방향으로 이동한다

기울기는 손실이 커지는 방향이므로 경사하강법은 weight = weight - learning_rate × gradient로 반대 방향에 작은 걸음을 내딛습니다. 이 계산을 반복하면 손실이 낮은 매개변수에 가까워집니다.

일상에서 보면안개 낀 산에서 발밑 오르막의 반대쪽으로 한 걸음씩 내려가는 것과 같습니다.
weight = 0.0
gradient = -4.0
learning_rate = 0.5
weight = weight - learning_rate * gradient
print(weight)
실행 결과
2.0
한 줄씩 보기
  1. 현재 가중치는 0입니다.
  2. 기울기 -4는 증가 방향으로 내려가야 함을 뜻합니다.
  3. 학습률 0.5만큼 반대 방향으로 이동합니다.
  4. 새 가중치 2가 됩니다.
직접 값 바꾸기업데이트의 빼기를 더하기로 바꾸면 가중치가 어느 방향으로 가는지 확인하세요.
흔한 실수gradient를 더하면 손실이 커지는 경사상승이 될 수 있습니다.

짧은 확인경사하강법 업데이트 식에서 기울기 앞에 빼기가 붙는 이유는 무엇일까요?

05

학습률은 한 번에 움직이는 보폭

학습률이 너무 작으면 손실이 천천히 줄고, 너무 크면 최솟값을 지나쳐 손실이 흔들리거나 커질 수 있습니다. 같은 시작점에서 여러 학습률의 손실 변화를 비교해 적절한 크기를 판단합니다.

일상에서 보면가파른 내리막에서 너무 작은 걸음은 느리고 너무 큰 점프는 반대편 비탈로 넘어갈 수 있는 것과 같습니다.
weight = 0.0
gradient = -4.0
for learning_rate in [0.1, 0.5, 1.0]:
    new_weight = weight - learning_rate * gradient
    print(learning_rate, new_weight)
실행 결과
0.1 0.4
0.5 2.0
1.0 4.0
한 줄씩 보기
  1. 같은 시작 가중치와 기울기를 사용합니다.
  2. 학습률만 세 가지로 바꿉니다.
  3. 학습률이 클수록 한 단계 이동 거리가 커집니다.
직접 값 바꾸기각 새 가중치에서 y=2x 데이터의 MSE를 계산해 가장 낮은 값을 찾으세요.
흔한 실수학습률이 클수록 항상 빨리 정답에 도달하는 것은 아닙니다.

짧은 확인학습 중 손실이 계속 크게 오르내리면 학습률을 높여야 할까요, 낮춰야 할까요?

평균 제곱 손실 계산하기

  1. 예측과 정답의 shape를 맞춥니다.
  2. 오차와 제곱 오차를 구분합니다.
  3. 샘플 전체 평균으로 하나의 손실을 만듭니다.
  4. 큰 오차가 손실에 미치는 영향을 확인합니다.
import numpy as np

predictions = np.array(input().split(), dtype=np.float64)
targets = np.array(input().split(), dtype=np.float64)
errors = predictions - targets
squared_errors = errors ** 2
mse = squared_errors.mean()
print(f'오차: {np.round(errors, 2).tolist()}')
print(f'제곱 오차: {np.round(squared_errors, 2).tolist()}')
print(f'MSE: {mse:.2f}')

핵심을 확인해 볼까요?

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

1손실 함수가 하는 일은?
2오차가 2배가 되면 제곱 오차는 몇 배가 되는가?
3기울기가 알려 주는 것은?
4경사하강법의 올바른 업데이트는?
5학습률이 지나치게 클 때 생길 수 있는 문제는?