콘텐츠로 이동

모델·학습·예측이란 (Model, Training, Prediction)

난이도: 초급
선수 지식: 머신러닝이란 무엇인가
관련 문서: 훈련·검증·테스트 | 선형 모델 | 손실 함수

핵심 요약: 모델은 입력을 출력으로 바꾸는 함수이고, 학습은 그 함수 안의 숫자(파라미터)를 데이터에 맞게 정하는 과정이며, 예측은 정해진 함수에 새 입력을 넣는 것이다. “가격 = a × 평수 + b”에서 모델은 이 식의 모양, 학습은 aabb정하는 일, 예측은 정해진 a,ba, b계산하는 일이다. 학습은 오래 걸리고 한 번만 하지만, 예측은 빠르고 수없이 반복된다.

  • 모델(Model): 입력을 받아 출력을 내놓는 함수. “어떤 모양의 식을 쓸 것인가”를 정하는 것이 모델 선택이다.
  • 파라미터(Parameter): 모델 안에서 학습으로 정해지는 숫자. 선형 모델의 기울기와 절편이 그렇다.
  • 하이퍼파라미터(Hyperparameter): 학습으로 정해지지 않고 사람이 미리 정하는 숫자. 학습률, 트리 깊이 등.
  • 학습(Training / Fitting): 데이터를 보고 파라미터를 정하는 과정. 코드에서는 대개 .fit()이다.
  • 예측(Prediction / Inference): 학습된 파라미터로 새 입력의 답을 계산하는 것. 코드에서는 .predict()다.
  • 손실(Loss): 예측이 정답과 얼마나 다른지를 하나의 숫자로 만든 값. 학습이란 이 숫자를 줄이는 일이다.

머신러닝 코드는 대부분 두 줄로 요약된다.

model.fit(X, y) # 학습 - 데이터를 보고 파라미터를 정한다
model.predict(X_new) # 예측 - 정해진 파라미터로 답을 계산한다

이 두 줄 안에서 실제로 무슨 일이 벌어지는지 아는 것이 머신러닝 이해의 절반이다. 나머지 절반은 “그 결과를 믿어도 되는가”이고, 그것은 훈련·검증·테스트에서 다룬다.

비유: 모델은 빈칸이 뚫린 계산식이다. “가격 = ⬜ × 평수 + ⬜“라는 식의 모양이 모델이고, 과거 거래 기록을 보며 빈칸에 들어갈 숫자를 정하는 것이 학습이며, 완성된 식에 “35평”을 넣어 값을 얻는 것이 예측이다. 식의 모양을 바꾸는 것(직선이냐 곡선이냐)은 학습이 아니라 모델 선택이다.


“데이터에 맞는 선을 긋는다”는 발상은 머신러닝보다 200년 이상 앞선다.

1801년, 카를 프리드리히 가우스는 소행성 세레스가 태양 뒤로 사라졌다가 다시 나타날 위치를 예측해야 했다. 관측 데이터는 40일치뿐이었고 오차가 섞여 있었다. 그는 관측값과 예측값의 제곱 오차 합이 최소가 되는 궤도를 찾는 방법(최소제곱법)을 고안했고, 예측한 위치에서 세레스가 실제로 발견되었다.

이 사건에 오늘날 머신러닝의 뼈대가 전부 들어 있다.

  • 모델: 궤도를 나타내는 방정식의 형태
  • 파라미터: 그 방정식의 계수들
  • 손실: 관측값과의 제곱 오차 합
  • 학습: 손실을 최소화하는 계수 찾기
  • 예측: 찾은 궤도로 미래 위치 계산

달라진 것은 규모와 모델의 복잡도뿐이다. 현대 신경망은 파라미터가 수십억 개지만, “손실을 줄이는 방향으로 파라미터를 조정한다”는 원리는 같다.


모델을 고른다는 것은 입력과 출력을 잇는 식의 형태를 정한다는 뜻이다.

모델함수의 모양파라미터
선형 회귀y=wx+by = w x + bw,bw, b
다항 회귀y=w2x2+w1x+by = w_2 x^2 + w_1 x + bw2,w1,bw_2, w_1, b
결정 트리예/아니오 질문의 연쇄각 분기의 기준값
신경망행렬 곱 + 비선형의 반복모든 층의 가중치

모델이 표현할 수 없는 관계는 아무리 학습해도 배울 수 없다. 직선 모델로는 곡선을 절대 맞힐 수 없다 — 이것이 과소적합의 근본 원인이다.

2. 학습 = 손실을 줄이는 방향으로 파라미터 조정

섹션 제목: “2. 학습 = 손실을 줄이는 방향으로 파라미터 조정”

학습은 세 가지가 있어야 성립한다.

  1. 모델 — 파라미터를 담을 그릇
  2. 손실 함수 — 지금 얼마나 틀렸는지 재는 자
  3. 최적화 방법 — 손실을 줄이는 방향으로 파라미터를 옮기는 절차

학습=argmin파라미터  손실(예측,정답)\text{학습} = \arg\min_{\text{파라미터}} \; \text{손실}(\text{예측}, \text{정답})

선형 회귀처럼 수식으로 한 번에 정답을 구할 수 있는 경우도 있고, 신경망처럼 조금씩 반복해 접근해야 하는 경우도 있다. 후자가 경사 하강법이다.

초보자가 가장 자주 혼동하는 구분이다.

누가 정하는가예시
파라미터학습이 데이터를 보고선형 모델의 기울기, 신경망 가중치
하이퍼파라미터사람이 학습 전에학습률, 트리 깊이, 정규화 강도

하이퍼파라미터는 학습으로 정해지지 않으므로 따로 고르는 절차가 필요하다 — 그것이 검증셋의 역할이다.

집 5채의 평수와 가격으로 모델을 학습시켜 보자.

평수가격(억)
102.1
204.3
305.9
408.2
509.8

1단계 — 모델 선택: “가격 = ww × 평수 + bb“라는 직선을 쓰기로 한다. 아직 w,bw, b는 정해지지 않았다.

2단계 — 학습: 5개 점과의 제곱 오차 합이 최소가 되는 w,bw, b를 찾는다. 결과는 w0.193w \approx 0.193, b0.270b \approx 0.270.

가격=0.193×평수+0.270\text{가격} = 0.193 \times \text{평수} + 0.270

여기서 0.1930.193이 갖는 의미가 중요하다 — “평수가 1 늘면 가격이 약 0.193억 오른다”는 데이터가 알려준 규칙이다. 사람이 정하지 않았다.

3단계 — 예측: 35평짜리 새 집은?

0.193×35+0.2707.030.193 \times 35 + 0.270 \approx 7.03\text{억}

학습 데이터에 35평은 없었다. 그런데도 답을 낼 수 있는 것 — 이것이 일반화다.


머신러닝을 쓰는 경제적 이유가 여기 있다.

학습예측
횟수한 번(또는 주기적 재학습)요청마다
비용크다 (GPU·시간)작다
필요한 것전체 데이터 + 정답입력 하나

한 번 학습해 두면 예측은 거의 공짜로 무한히 반복할 수 있다. 사람 전문가를 고용하는 것과의 결정적 차이다.

다만 이 구조 때문에 생기는 문제도 있다 — 세상이 변하면 학습 시점의 규칙이 낡는다. 그래서 모니터링과 재학습이 필요하다.


이 장의 개념은 모든 머신러닝 작업에 예외 없이 적용된다. 다만 상황에 따라 어디에 집중할지가 다르다.

상황집중할 것
성능이 안 나온다모델의 표현력이 부족한가, 데이터가 부족한가
학습이 발산한다하이퍼파라미터(특히 학습률)
예측이 느리다모델 크기배포 최적화
결과를 설명해야 한다파라미터를 읽을 수 있는 모델(선형, 트리)

한 팀이 이미지 분류 모델을 학습시키는데, 며칠을 들여도 성능이 오르지 않았다. 코드를 뜯어보니 학습 루프가 이랬다.

for epoch in range(50):
model.fit(X_train, y_train) # <- 매 에폭마다 fit

문제는 scikit-learn의 fit()이전 학습 결과를 이어받지 않고 처음부터 다시 학습한다는 점이었다. 50번을 돌렸지만 실제로는 1번 학습한 것과 같았다. 겉으로는 50에폭이 도는 것처럼 보였기에 며칠간 아무도 눈치채지 못했다.

같은 팀에서 얼마 뒤 반대 방향의 실수도 나왔다. 하이퍼파라미터를 바꿔가며 실험하는데 매번 같은 모델 객체를 재사용해, 이전 설정의 흔적이 남아 결과가 재현되지 않았다.

교훈: fit이 “이어서 학습”인지 “처음부터 다시”인지는 라이브러리마다 다르다. scikit-learn은 기본이 “처음부터”이고(일부 모델의 warm_start=True는 예외), PyTorch의 학습 루프는 “이어서”다. 학습이 실제로 일어나고 있는지는 손실이 실제로 줄고 있는지로 확인해야 한다.


from sklearn.linear_model import LinearRegression
import numpy as np
# "모델"이란 입력을 출력으로 바꾸는 함수다. 그 함수의 계수를 데이터로 정하는 것이 "학습"이다.
평수 = np.array([[10], [20], [30], [40], [50]])
가격 = np.array([2.1, 4.3, 5.9, 8.2, 9.8]) # 억 원
model = LinearRegression()
print(f"학습 전 계수: {getattr(model, 'coef_', '아직 없음')}")
model.fit(평수, 가격) # <- 이것이 '학습'
print(f"학습 후 계수: 기울기 {model.coef_[0]:.3f}, 절편 {model.intercept_:.3f}")
print(f"즉 모델이 찾아낸 규칙: 가격 = {model.coef_[0]:.3f} x 평수 + {model.intercept_:.3f}")
새집 = np.array([[35]])
print(f"\n예측: 35평 -> {model.predict(새집)[0]:.2f}억 원") # <- 이것이 '예측'
# 실행 결과:
# 학습 전 계수: 아직 없음
# 학습 후 계수: 기울기 0.193, 절편 0.270
# 즉 모델이 찾아낸 규칙: 가격 = 0.193 x 평수 + 0.270
#
# 예측: 35평 -> 7.03억 원

fit() 이전에는 coef_가 아예 존재하지 않는다. 모델은 “식의 모양”만 가지고 있을 뿐 빈칸이 비어 있는 상태다. fit()이 데이터를 보고 그 빈칸을 채우고 나서야 predict()가 가능해진다.

그리고 학습 데이터에 35평은 없었는데도 답이 나온다 — 모델이 개별 사례를 외운 것이 아니라 규칙을 찾았기 때문이다.


  1. “모델이 데이터를 저장한다” — 대부분의 모델은 데이터를 버리고 파라미터만 남긴다. 위 예제도 5개 점 대신 숫자 두 개(w,bw, b)만 갖는다. (예외: k-NN은 실제로 데이터를 들고 있다.)

  2. “학습을 오래 할수록 좋다” — 어느 지점을 넘으면 훈련 데이터를 외우기 시작해 새 데이터 성능이 떨어진다(과적합).

  3. “파라미터가 많을수록 좋은 모델이다” — 표현력은 커지지만 더 많은 데이터가 필요하고 과적합 위험도 커진다.

  4. fit()을 여러 번 부르면 더 학습된다” — 라이브러리에 따라 처음부터 다시 학습한다. scikit-learn이 그렇다.

  5. “예측값이 나왔으니 맞는 것이다” — 모델은 항상 무언가를 출력한다. 학습 범위를 크게 벗어난 입력(위 예제에 500평을 넣으면)에도 태연히 숫자를 내놓지만 그 값은 신뢰할 수 없다.


1. 파라미터와 하이퍼파라미터의 차이는?

정답 보기

누가 정하는가가 다르다. 파라미터는 학습이 데이터를 보고 정한다(선형 모델의 기울기, 신경망 가중치). 하이퍼파라미터는 사람이 학습 전에 정한다(학습률, 트리 깊이). 하이퍼파라미터는 학습으로 정해지지 않으므로 검증셋으로 따로 골라야 한다.

2. 직선 모델로 곡선 관계를 학습시키면 어떻게 되는가?

정답 보기

아무리 학습해도 맞힐 수 없다. 모델이 표현할 수 없는 관계는 데이터를 아무리 많이 줘도 배울 수 없다. 이것이 과소적합이며, 해법은 더 많은 데이터가 아니라 더 표현력 있는 모델이다.

3. 학습 데이터에 없던 35평 집의 가격을 예측할 수 있는 이유는?

정답 보기

모델이 개별 사례를 외운 것이 아니라 “평수 1당 약 0.193억”이라는 규칙을 찾았기 때문이다. 이것이 일반화다. 단, 학습 범위(10~50평)를 크게 벗어나면 그 규칙이 여전히 성립한다는 보장이 없다.