Skip to content

2장. 첫 번째 학습 기계

이 장의 질문: 기계는 구체적으로 "어떻게" 배우는가? 가장 단순한 예제 하나를 뼛속까지 해부해서, 이후 모든 학습의 공통 뼈대를 손에 넣는다.

전제: 1장. 수학은 중학교 수준(직선의 방정식)이면 충분하다. 미분이 나오지만 그 자리에서 설명한다.

문제: 집값을 예측하라

아주 작은 데이터로 시작하자. 어느 동네 집 다섯 채의 크기와 가격이다.

크기 (평)가격 (억)
103.2
154.1
205.5
256.1
307.4

질문: 18평짜리 집은 얼마쯤 하겠는가?

당신은 이미 머릿속으로 답했을 것이다. "크기가 클수록 비싸네. 대충 비례하는 것 같으니… 5억 안팎?" 축하한다. 방금 당신의 뇌가 한 일 — 데이터에서 경향을 뽑아 새로운 경우에 적용하는 일 — 을 이제 기계에게 시킬 것이다. 그리고 기계에게 시키려면, 그 두루뭉술한 과정을 세 개의 명확한 부품으로 쪼개야 한다.

부품 1: 모델 — 답의 "모양"을 정한다

기계는 "대충 비례하는 것 같다" 같은 직감이 없다. 그래서 우리가 먼저 답이 어떤 모양일지를 정해 준다. 크기와 가격이 대체로 비례해 보이니, 직선 관계라고 가정하자.

y^=wx+b

읽는 법: 예측 가격(y^, "와이 햇" — 모자는 '예측값'이라는 표시다)은 크기(x)에 어떤 수(w)를 곱하고 어떤 수(b)를 더한 것이다. w는 기울기 — "한 평 넓어질 때 가격이 얼마나 오르는가". b는 절편 — 기본값이다.

여기서 결정적인 관점 전환이 일어난다. wb에 어떤 숫자를 넣느냐에 따라 무수히 많은 직선이 생긴다. w=0.2,b=1인 직선, w=0.5,b=2인 직선… 즉 우리는 가능한 답들의 후보 집합(모든 직선)을 정의한 것이고, 학습이란 이 후보들 중에서 데이터에 가장 잘 맞는 하나를 고르는 일이 된다. wb처럼 학습이 골라야 할 숫자들을 파라미터라고 부른다.

이 그림을 기억하라. 앞으로 만날 모든 모델이 정확히 이 구조다. GPT도 "가능한 답들의 후보 집합"을 정의하는 하나의 수식이며, 다만 파라미터가 2개가 아니라 수천억 개일 뿐이다. 파라미터가 많다는 것은 후보 집합이 어마어마하게 크고 표현력이 풍부하다는 뜻이다 — 직선만이 아니라 훨씬 구불구불하고 정교한 관계까지 후보에 들어간다.

부품 2: 손실 — "잘 맞는다"를 숫자로 만든다

"데이터에 가장 잘 맞는 직선"을 고르려면, "잘 맞는다"를 잴 수 있어야 한다. 기계에게 애매함은 없다 — 숫자로 만들어야 한다.

자연스러운 방법: 직선이 각 데이터 점을 얼마나 빗나갔는지(오차)를 재서 합친다. 시험 삼아 w=0.2,b=1인 직선을 채점해 보자. 10평 집의 예측은 0.2×10+1=3억. 실제는 3.2억이니 오차는 0.2. 같은 식으로 다섯 채 전부의 오차를 구하고, 각 오차를 제곱해서 평균낸다.

L(w,b)=1Ni=1N(y^iyi)2

읽는 법: 손실(L)은, 각 데이터(i번째)에 대해 예측(y^i)과 실제(yi)의 차이를 제곱한 것을, 전체 N개에 대해 평균낸 값이다. 이를 평균제곱오차(MSE)라고 한다. 왜 제곱하는가? 두 가지 실용적 이유다. 오차 +0.20.2가 상쇄되어 "오차 0"으로 보이는 사태를 막고(제곱하면 둘 다 0.04), 큰 오차에 훨씬 큰 벌점을 주기 위해서다(오차 2는 오차 1보다 4배 벌점).

이런 채점 함수를 손실 함수(loss function)라고 부른다. 손실이 작을수록 좋은 직선이다. 이제 학습 문제가 완전히 수학 문제로 번역되었다:

손실 L(w,b)을 최소로 만드는 w,b를 찾아라.

애매했던 "배운다"가, "함수를 최소화하는 숫자 찾기"라는 명료한 문제가 되었다. 이 번역이 머신러닝 전체의 심장이다.

부품 3: 최적화 — 안개 속에서 골짜기 내려가기

이제 최소화를 어떻게 하느냐가 남았다. wb의 모든 조합을 다 넣어 볼 수는 없다 — 후보가 무한하다. (사실 이 단순한 문제는 공식 한 방으로 풀리지만, 파라미터가 수천억 개가 되면 그런 공식은 없다. 처음부터 큰 문제에도 통하는 방법을 배우자.)

상상하라. 손실 L(w,b)w,b를 좌표로 하는 지형이다. 좋은 파라미터는 낮은 골짜기, 나쁜 파라미터는 높은 봉우리. 우리는 이 지형 어딘가에 떨어진 등산객인데, 짙은 안개 때문에 골짜기가 어디인지 보이지 않는다. 보이는 것은 오직 발밑의 경사뿐이다.

그렇다면 전략은 자명하다. 발밑에서 가장 가파른 내리막 방향으로 한 걸음. 그리고 반복.

발밑의 경사를 알려주는 도구가 미분이다. 겁먹지 말자 — 미분이란 그저 "이 자리에서 w를 아주 조금 키우면 L이 얼마나 변하는가"라는 질문의 답, 즉 민감도다. 그 값을 Lw라고 쓴다(“w에 대한 L의 기울기”라고 읽으면 된다). 이 값이 양수면 w를 키울 때 손실이 커진다는 뜻이니 w를 줄여야 하고, 음수면 키워야 한다. 요컨대 기울기의 반대 방향으로 움직이면 손실이 줄어든다. 이를 갱신 규칙으로 쓰면:

wwηLw,bbηLb

읽는 법: 새 w는, 지금 w에서 기울기에 보폭(η, "에타"라고 읽는다. 학습률이라 부른다)을 곱한 만큼을 뺀 것이다. 이 단순한 반복이 경사하강법(gradient descent)이며 — 미리 말해 두는데 — GPT를 훈련시킨 방법도 본질적으로 이것이다.

학습률은 첫 번째로 만나는 하이퍼파라미터(사람이 정해 주는 다이얼)다. 너무 작으면 골짜기까지 십만 걸음이 걸리고, 너무 크면 골짜기를 훌쩍 뛰어넘어 반대편 벽으로, 다시 더 높은 곳으로 — 발산한다. 잠시 후 직접 확인할 것이다.

세 부품을 조립하다: 전체 코드

이제 조립하자. 스무 줄이면 된다. 반드시 직접 실행해 보라.

python
import numpy as np

x = np.array([10, 15, 20, 25, 30], dtype=float)   # 크기 (평)
y = np.array([3.2, 4.1, 5.5, 6.1, 7.4])          # 가격 (억)

w, b = 0.0, 0.0        # 아무 직선에서나 출발 (여기선 바닥에 깔린 직선)
lr = 0.001             # 학습률

for step in range(200_000):
    y_hat = w * x + b                     # ① 모델: 현재 직선의 예측
    loss = np.mean((y_hat - y) ** 2)      # ② 손실: 채점

    grad_w = np.mean(2 * (y_hat - y) * x) # ③ 기울기: 손실의 w에 대한 민감도
    grad_b = np.mean(2 * (y_hat - y))     #    (미분 계산 과정은 3장에서 손에 익힌다)

    w -= lr * grad_w                      # ④ 갱신: 내리막으로 한 걸음
    b -= lr * grad_b

    if step % 40_000 == 0:
        print(f"step {step:6d}  loss {loss:.4f}  w {w:.3f}  b {b:.3f}")

print(f"\n18평 예측: {w * 18 + b:.2f}억")

실행하면 손실이 뚝뚝 떨어지다가 어느 값 근처에서 잠잠해지고, w0.21, b1.1 근처에 도달한다. 18평의 예측은 약 4.8억 — 당신의 직감과 비슷하다. 기계가 데이터로부터 "한 평에 약 2100만 원씩 오르더라"라는 규칙을 스스로 찾아낸 것이다.

이 네 줄짜리 루프 — 예측하고, 채점하고, 기울기를 구하고, 한 걸음 내려간다 — 를 몸에 새겨라. 이 책 끝까지, 그리고 최전선 연구까지, 학습 루프는 이 네 박자에서 벗어나지 않는다.

직접 부숴 보기

코드를 실행했다면 이제 부숴 볼 차례다. 이해는 부술 때 깊어진다.

학습률을 키워 보라. lr = 0.01로 바꾸면? 손실이 inf를 지나 nan(숫자가 아님)이 된다 — 발산이다. 골짜기를 매번 건너뛰며 점점 높이 튀어 오른 것이다. 딥러닝 실무에서 가장 흔한 사고를 방금 가장 안전한 곳에서 경험했다. 학습이 발산하면 첫 용의자는 학습률이다. 반대로 lr = 0.00001로 줄이면 발산은 않지만 20만 걸음으로도 골짜기에 못 미친다.

출발점을 바꿔 보라. w, b = 5.0, -3.0에서 시작해도 같은 곳에 도착한다. 이 문제의 손실 지형은 골짜기가 하나뿐인 매끈한 밥그릇 모양(볼록 함수라고 한다)이라 어디서 출발하든 같은 바닥에 닿는다. 미리 귀띔하자면 — 신경망의 지형은 밥그릇이 아니라 험준한 산맥이라 출발점이 문제가 된다. 그 이야기는 11장에서.

모델의 모양이 틀렸다면? 데이터가 사실 곡선 관계인데 직선을 가정했다면, 어떤 w,b를 골라도 잘 맞을 수 없다. 후보 집합 안에 좋은 답이 없기 때문이다. 이것이 4장에서 다룰 과소적합이며, "모델의 표현력"이 왜 중요한지의 첫 단서다.

확장의 예고: 직선에서 GPT까지

"고작 직선이잖아"라는 마음이 들 것이다. 그러나 지금 세운 뼈대에서 현대 AI까지는 놀랍게도 부품 교체의 연속일 뿐이다.

  • 입력이 평수 하나가 아니라 사진의 픽셀 100만 개라면? → x가 숫자 목록(벡터)이 되고 w도 목록이 된다. (3장)
  • 직선으로 부족하다면? → 모델 수식을 구부리고 겹친다. 그것이 신경망이다. (9장)
  • 파라미터가 수천억 개면 기울기를 어떻게 다 구하나? → 연쇄법칙으로 한 번에 구하는 알고리즘이 있다. 역전파다. (10장)
  • 데이터가 수조 개면? → 매 걸음 전체 대신 무작위 일부만 보고 내려간다. 확률적 경사하강법이다. (11장)

부품은 화려해지지만 뼈대는 그대로다: 모델(후보 집합) — 손실(채점) — 최적화(내리막 반복). 앞으로 아무리 복잡한 시스템을 만나도 이 세 부품이 각각 무엇인지 짚어 보라. 그것이 전문가의 독법이다.

핵심 요약

  • 학습 기계는 세 부품으로 조립된다. 모델은 가능한 답의 후보 집합(파라미터에 따라 달라지는 수식), 손실 함수는 "잘 맞음"을 숫자로 만든 채점표, 최적화는 손실을 낮추는 파라미터를 찾는 절차.
  • 경사하강법: 기울기(각 파라미터에 대한 손실의 민감도)를 구해 그 반대 방향으로 학습률만큼 반복해서 이동한다.
  • 학습률이 너무 크면 발산, 너무 작으면 정체. 하이퍼파라미터는 사람이 조율하는 다이얼이다.
  • 예측 → 채점 → 기울기 → 갱신. 이 네 박자 루프가 GPT까지 이어지는 모든 학습의 뼈대다.

스스로 점검

  1. 친구에게 "모델·손실·최적화"를 집값 예제 없이, 다른 예(예: 커피 원두량과 쓴맛)로 설명해 보라.
  2. 손실 함수에서 오차를 제곱하는 대신 절댓값을 쓰면 무엇이 달라질까? 오차 10짜리 이상치(outlier) 하나가 있을 때 두 방식의 벌점 차이를 계산해 보라.
  3. 기울기 Lw가 0이라는 것은 등산객 비유에서 어떤 상황인가? 그곳은 항상 가장 낮은 골짜기인가?
  4. (코드) 위 코드에서 x를 100으로 나눠 0.1~0.3 범위로 만들면 훨씬 큰 학습률로도 안정적으로 학습된다. 실험해 보고, 왜 그런지 등산 지형의 모양으로 추측해 보라. (답의 실마리는 11장에서 만난다.)

다음 장에서

이번 장에서 미분과 벡터를 슬쩍 지나쳤다. 다음 장에서는 이 책 전체를 지탱할 수학 도구 — 벡터와 행렬, 미분과 기울기, 확률 — 를 "학습 기계를 만드는 데 필요한 만큼만, 그러나 확실하게" 손에 넣는다. 수학이 두려웠던 독자일수록 다음 장이 이 책에서 가장 보람찬 장이 될 것이다.

3장. 학습을 떠받치는 수학 →