2장. 첫 번째 학습 기계
이 장의 질문: 기계는 구체적으로 "어떻게" 배우는가? 가장 단순한 예제 하나를 뼛속까지 해부해서, 이후 모든 학습의 공통 뼈대를 손에 넣는다.
전제: 1장. 수학은 중학교 수준(직선의 방정식)이면 충분하다. 미분이 나오지만 그 자리에서 설명한다.
문제: 집값을 예측하라
아주 작은 데이터로 시작하자. 어느 동네 집 다섯 채의 크기와 가격이다.
| 크기 (평) | 가격 (억) |
|---|---|
| 10 | 3.2 |
| 15 | 4.1 |
| 20 | 5.5 |
| 25 | 6.1 |
| 30 | 7.4 |
질문: 18평짜리 집은 얼마쯤 하겠는가?
당신은 이미 머릿속으로 답했을 것이다. "크기가 클수록 비싸네. 대충 비례하는 것 같으니… 5억 안팎?" 축하한다. 방금 당신의 뇌가 한 일 — 데이터에서 경향을 뽑아 새로운 경우에 적용하는 일 — 을 이제 기계에게 시킬 것이다. 그리고 기계에게 시키려면, 그 두루뭉술한 과정을 세 개의 명확한 부품으로 쪼개야 한다.
부품 1: 모델 — 답의 "모양"을 정한다
기계는 "대충 비례하는 것 같다" 같은 직감이 없다. 그래서 우리가 먼저 답이 어떤 모양일지를 정해 준다. 크기와 가격이 대체로 비례해 보이니, 직선 관계라고 가정하자.
읽는 법: 예측 가격(
여기서 결정적인 관점 전환이 일어난다.
이 그림을 기억하라. 앞으로 만날 모든 모델이 정확히 이 구조다. GPT도 "가능한 답들의 후보 집합"을 정의하는 하나의 수식이며, 다만 파라미터가 2개가 아니라 수천억 개일 뿐이다. 파라미터가 많다는 것은 후보 집합이 어마어마하게 크고 표현력이 풍부하다는 뜻이다 — 직선만이 아니라 훨씬 구불구불하고 정교한 관계까지 후보에 들어간다.
부품 2: 손실 — "잘 맞는다"를 숫자로 만든다
"데이터에 가장 잘 맞는 직선"을 고르려면, "잘 맞는다"를 잴 수 있어야 한다. 기계에게 애매함은 없다 — 숫자로 만들어야 한다.
자연스러운 방법: 직선이 각 데이터 점을 얼마나 빗나갔는지(오차)를 재서 합친다. 시험 삼아
읽는 법: 손실(
이런 채점 함수를 손실 함수(loss function)라고 부른다. 손실이 작을수록 좋은 직선이다. 이제 학습 문제가 완전히 수학 문제로 번역되었다:
손실
을 최소로 만드는 를 찾아라.
애매했던 "배운다"가, "함수를 최소화하는 숫자 찾기"라는 명료한 문제가 되었다. 이 번역이 머신러닝 전체의 심장이다.
부품 3: 최적화 — 안개 속에서 골짜기 내려가기
이제 최소화를 어떻게 하느냐가 남았다.
상상하라. 손실
그렇다면 전략은 자명하다. 발밑에서 가장 가파른 내리막 방향으로 한 걸음. 그리고 반복.
발밑의 경사를 알려주는 도구가 미분이다. 겁먹지 말자 — 미분이란 그저 "이 자리에서
읽는 법: 새
학습률은 첫 번째로 만나는 하이퍼파라미터(사람이 정해 주는 다이얼)다. 너무 작으면 골짜기까지 십만 걸음이 걸리고, 너무 크면 골짜기를 훌쩍 뛰어넘어 반대편 벽으로, 다시 더 높은 곳으로 — 발산한다. 잠시 후 직접 확인할 것이다.
세 부품을 조립하다: 전체 코드
이제 조립하자. 스무 줄이면 된다. 반드시 직접 실행해 보라.
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}억")실행하면 손실이 뚝뚝 떨어지다가 어느 값 근처에서 잠잠해지고,
이 네 줄짜리 루프 — 예측하고, 채점하고, 기울기를 구하고, 한 걸음 내려간다 — 를 몸에 새겨라. 이 책 끝까지, 그리고 최전선 연구까지, 학습 루프는 이 네 박자에서 벗어나지 않는다.
직접 부숴 보기
코드를 실행했다면 이제 부숴 볼 차례다. 이해는 부술 때 깊어진다.
학습률을 키워 보라. lr = 0.01로 바꾸면? 손실이 inf를 지나 nan(숫자가 아님)이 된다 — 발산이다. 골짜기를 매번 건너뛰며 점점 높이 튀어 오른 것이다. 딥러닝 실무에서 가장 흔한 사고를 방금 가장 안전한 곳에서 경험했다. 학습이 발산하면 첫 용의자는 학습률이다. 반대로 lr = 0.00001로 줄이면 발산은 않지만 20만 걸음으로도 골짜기에 못 미친다.
출발점을 바꿔 보라. w, b = 5.0, -3.0에서 시작해도 같은 곳에 도착한다. 이 문제의 손실 지형은 골짜기가 하나뿐인 매끈한 밥그릇 모양(볼록 함수라고 한다)이라 어디서 출발하든 같은 바닥에 닿는다. 미리 귀띔하자면 — 신경망의 지형은 밥그릇이 아니라 험준한 산맥이라 출발점이 문제가 된다. 그 이야기는 11장에서.
모델의 모양이 틀렸다면? 데이터가 사실 곡선 관계인데 직선을 가정했다면, 어떤
확장의 예고: 직선에서 GPT까지
"고작 직선이잖아"라는 마음이 들 것이다. 그러나 지금 세운 뼈대에서 현대 AI까지는 놀랍게도 부품 교체의 연속일 뿐이다.
- 입력이 평수 하나가 아니라 사진의 픽셀 100만 개라면? →
가 숫자 목록(벡터)이 되고 도 목록이 된다. (3장) - 직선으로 부족하다면? → 모델 수식을 구부리고 겹친다. 그것이 신경망이다. (9장)
- 파라미터가 수천억 개면 기울기를 어떻게 다 구하나? → 연쇄법칙으로 한 번에 구하는 알고리즘이 있다. 역전파다. (10장)
- 데이터가 수조 개면? → 매 걸음 전체 대신 무작위 일부만 보고 내려간다. 확률적 경사하강법이다. (11장)
부품은 화려해지지만 뼈대는 그대로다: 모델(후보 집합) — 손실(채점) — 최적화(내리막 반복). 앞으로 아무리 복잡한 시스템을 만나도 이 세 부품이 각각 무엇인지 짚어 보라. 그것이 전문가의 독법이다.
핵심 요약
- 학습 기계는 세 부품으로 조립된다. 모델은 가능한 답의 후보 집합(파라미터에 따라 달라지는 수식), 손실 함수는 "잘 맞음"을 숫자로 만든 채점표, 최적화는 손실을 낮추는 파라미터를 찾는 절차.
- 경사하강법: 기울기(각 파라미터에 대한 손실의 민감도)를 구해 그 반대 방향으로 학습률만큼 반복해서 이동한다.
- 학습률이 너무 크면 발산, 너무 작으면 정체. 하이퍼파라미터는 사람이 조율하는 다이얼이다.
- 예측 → 채점 → 기울기 → 갱신. 이 네 박자 루프가 GPT까지 이어지는 모든 학습의 뼈대다.
스스로 점검
- 친구에게 "모델·손실·최적화"를 집값 예제 없이, 다른 예(예: 커피 원두량과 쓴맛)로 설명해 보라.
- 손실 함수에서 오차를 제곱하는 대신 절댓값을 쓰면 무엇이 달라질까? 오차 10짜리 이상치(outlier) 하나가 있을 때 두 방식의 벌점 차이를 계산해 보라.
- 기울기
가 0이라는 것은 등산객 비유에서 어떤 상황인가? 그곳은 항상 가장 낮은 골짜기인가? - (코드) 위 코드에서
x를 100으로 나눠 0.1~0.3 범위로 만들면 훨씬 큰 학습률로도 안정적으로 학습된다. 실험해 보고, 왜 그런지 등산 지형의 모양으로 추측해 보라. (답의 실마리는 11장에서 만난다.)
다음 장에서
이번 장에서 미분과 벡터를 슬쩍 지나쳤다. 다음 장에서는 이 책 전체를 지탱할 수학 도구 — 벡터와 행렬, 미분과 기울기, 확률 — 를 "학습 기계를 만드는 데 필요한 만큼만, 그러나 확실하게" 손에 넣는다. 수학이 두려웠던 독자일수록 다음 장이 이 책에서 가장 보람찬 장이 될 것이다.