Week 3. 회귀 1: 선형회귀와 경사하강법
데이터에 직선 하나를 그어봅니다. 그 단순한 행위 안에 머신러닝의 모든 핵심 개념이 들어 있습니다.
이번 주에 배우는 것
- 회귀 문제란 무엇인가
- 가설(hypothesis)과 파라미터
- 비용 함수 (MSE)
- 경사하강법의 원리
- 학습률 — 너무 크면, 너무 작으면
- 해석적 해 vs 반복적 해
1. 회귀 문제 — "연속된 숫자 맞히기"
입력 $x$로 연속된 출력 $y$를 예측하는 것을 회귀(regression)라고 합니다. 농어 길이로 무게 맞히기, 광고비로 매출 예측하기, 집 면적으로 가격 예측하기, 공부 시간으로 시험 점수 예측하기 — 모두 회귀입니다. 출력이 "범주"(고양이/개)가 아니라 "숫자"(23.7 kg, 345만 원)라는 점이 분류(W5)와 다릅니다.
"회귀(regression)"라는 말은 19세기 통계학자 Francis Galton에서 왔습니다. 키가 큰 부모의 자식이 부모보다 작아 평균으로 되돌아가는(regress) 현상을 연구하면서 회귀 직선을 만들었기 때문입니다. 오늘날의 머신러닝도 이 관찰에서 직접 이어집니다.
가장 단순한 가정은 $y$가 $x$에 선형으로 의존한다는 것입니다. 한 줄로:
$$ \hat{y} = wx + b $$여기서 $w$는 기울기(weight, 슬로프), $b$는 절편(bias, 상수항). 예측값에는 모자(hat)를 씌워 $\hat{y}$로 구분합니다. 실제 관측값 $y$와 다를 수 있기 때문입니다. 우리 목표는 주어진 데이터 $\{(x_1,y_1), \dots, (x_N,y_N)\}$에 가장 잘 맞는 $(w, b)$를 찾는 것.
"가장 잘 맞는다"는 말은 애매합니다. 각자 눈으로 그은 직선이 다를 수 있기 때문입니다. 그래서 수학에서는 이 기준을 숫자 하나로 정의합니다. 그것이 바로 아래에서 배울 비용 함수입니다.
2. 비용 함수 — "잘 맞는다"를 수식으로 정의
예측값 $\hat{y}_i$와 실제값 $y_i$의 차이를 오차(error) 또는 잔차(residual)라고 합니다. 그런데 어떤 점은 직선 위에, 어떤 점은 직선 아래에 있으니 단순히 오차를 합치면 서로 상쇄되어 0에 가까워질 수 있습니다. 그래서 부호를 없애는 두 방법이 있습니다:
- 절댓값: $|y_i - \hat{y}_i|$ → L1 손실, 이상치에 강건
- 제곱: $(y_i - \hat{y}_i)^2$ → L2 손실, 미분이 쉬움, 가장 널리 쓰임
관례적으로 제곱을 씁니다. 그 이유는 세 가지: (1) 모든 곳에서 미분 가능해 경사하강법에 좋고, (2) 가우시안 잡음 가정 아래 최대우도 추정과 일치하고(아래 별도 설명), (3) 큰 오차를 더 강하게 벌주어 학습이 빠릅니다. 제곱 오차를 모두 더하고 $N$으로 나누면 평균제곱오차(Mean Squared Error, MSE)가 됩니다.
$$ J(w, b) = \frac{1}{N} \sum_{i=1}^{N} (wx_i + b - y_i)^2 $$이 $J$를 비용 함수(cost function) 또는 손실 함수(loss function)라 부릅니다. $J$가 작을수록 직선이 데이터에 가깝다는 뜻. 학습이란 "$J(w, b)$를 최소화하는 $(w, b)$를 찾는 최적화 문제"로 정의됩니다. 머신러닝의 모든 훈련 과정은 결국 이 한 문장입니다.
2.1 최대우도 추정(MLE)에서 MSE가 나오는 이유
왜 하필 제곱일까? 통계적으로 아름다운 설명이 있습니다. 데이터 생성 모델이 "진짜 직선 $y = wx + b$에 가우시안 잡음 $\varepsilon \sim \mathcal{N}(0, \sigma^2)$이 얹힌 것"이라고 가정합시다:
$$ y_i = wx_i + b + \varepsilon_i, \quad \varepsilon_i \sim \mathcal{N}(0, \sigma^2) $$그러면 주어진 $(w, b)$ 하에서 데이터 $y_i$가 관측될 확률(우도, likelihood)은:
$$ p(y_i \mid x_i, w, b) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\!\left(-\frac{(y_i - wx_i - b)^2}{2\sigma^2}\right) $$모든 데이터가 독립이라면 전체 우도는 곱:
$$ \mathcal{L}(w, b) = \prod_{i=1}^N p(y_i \mid x_i, w, b) $$로그를 씌우면 곱이 합이 되고, 상수 항을 무시하면:
$$ \log \mathcal{L}(w, b) = -\frac{1}{2\sigma^2} \sum_i (y_i - wx_i - b)^2 + \text{const} $$즉 로그우도를 최대화하는 것은 제곱오차 합을 최소화하는 것과 정확히 같습니다. MSE 최소화는 "가우시안 잡음 가정 하의 최대우도 추정"과 동치입니다. 이 관점은 나중에 W4 로지스틱 회귀에서 Bernoulli 가정으로부터 교차 엔트로피가 나오는 방식과 정확히 같은 논리 구조를 가집니다.
2.2 작은 예시 — 손으로 계산해보기
데이터가 $(x, y) = (1, 2), (2, 3), (3, 5)$ 세 개라고 합시다. 직선 $\hat y = x$ ($w=1, b=0$)에 대해:
- $i=1$: 예측 1, 실제 2, 오차 $-1$, 제곱 1
- $i=2$: 예측 2, 실제 3, 오차 $-1$, 제곱 1
- $i=3$: 예측 3, 실제 5, 오차 $-2$, 제곱 4
합 = 6, 평균 $J = 6/3 = 2$. 이제 $\hat y = 1.5 x + 0.3$으로 바꿔보면 예측은 1.8, 3.3, 4.8, 오차 0.2, $-0.3$, 0.2, 제곱 0.04, 0.09, 0.04, 합 0.17, 평균 약 0.057. 훨씬 작아졌습니다. 즉 $(1.5, 0.3)$이 $(1, 0)$보다 "더 잘 맞는" 직선입니다. 이렇게 $(w, b)$를 조금씩 바꿔가며 $J$가 최소가 되는 지점을 찾는 것이 학습의 실체입니다.
🎮 인터랙티브: 직선 맞추기
슬라이더로 직접 $w$와 $b$를 움직여 데이터에 직선을 맞춰보세요. 비용 $J$가 실시간으로 표시됩니다.
3. 경사하강법 — 자동으로 내려가기
슬라이더로 직접 맞추는 건 직관을 얻는 데는 좋지만 차원이 많아지거나 데이터가 크면 손이 모자랍니다. 컴퓨터에게 자동으로 시키려면 비용함수의 기울기(gradient)를 따라 내려가게 만들면 됩니다. "안개 낀 산에서 내려가는 사람" 비유가 고전입니다: 시야가 전혀 없어도 발 밑의 경사를 느껴 가장 가파른 내리막 방향으로 한 걸음씩 옮기면 결국 골짜기 바닥에 도착합니다.
이 "한 걸음"을 수식으로 적으면:
$$ w \leftarrow w - \alpha \frac{\partial J}{\partial w}, \quad b \leftarrow b - \alpha \frac{\partial J}{\partial b} $$$\alpha$는 학습률(learning rate)로 한 걸음의 보폭을 정합니다. 너무 크면 골짜기를 뛰어넘어 반대쪽 산으로 튕겨나가고(발산), 너무 작으면 하루 종일 걸어도 바닥에 도달하지 못합니다(느린 수렴). 실전에서는 $10^{-4}$에서 $10^{-1}$ 사이에서 시작해 조정합니다.
3.1 편미분 유도 — 연쇄법칙으로 한 줄씩
비용 함수의 편미분을 직접 계산해봅시다. 한 샘플의 제곱 오차 $e_i^2 = (wx_i + b - y_i)^2$에 대해:
$$ \frac{\partial e_i^2}{\partial w} = 2(wx_i + b - y_i) \cdot \frac{\partial (wx_i + b - y_i)}{\partial w} = 2(wx_i + b - y_i) \cdot x_i $$연쇄법칙 한 번으로 끝납니다. 모든 샘플에 대해 합하고 $N$으로 나누면:
$$ \frac{\partial J}{\partial w} = \frac{2}{N}\sum_i (wx_i + b - y_i)\, x_i, \quad \frac{\partial J}{\partial b} = \frac{2}{N}\sum_i (wx_i + b - y_i) $$$b$에 대한 편미분은 $x_i$가 빠져 있는데, 이는 $b$가 모든 샘플에 동일하게 더해지기 때문입니다. 직관적으로도 맞습니다 — "편향만 올리면 모든 예측이 위로 같이 올라간다". 이 공식을 한 번 손으로 유도해두면, 나중에 W7 퍼셉트론과 W8 역전파에서 보게 될 다층 신경망의 그래디언트 계산도 똑같은 연쇄법칙의 반복이라는 것을 쉽게 받아들일 수 있습니다.
3.2 해석해 vs 경사하강법 — 언제 무엇을 쓸까
1차원 선형 회귀는 사실 경사하강법 없이도 풀 수 있습니다. $\nabla J = 0$을 대수로 풀면 바로 다음 정규방정식(Normal Equation)이 나옵니다:
$$ \boldsymbol{\beta} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y} $$그런데 특징 차원 $d$가 수천~수만이 되면 $\mathbf{X}^\top \mathbf{X}$의 역행렬 계산이 $\mathcal{O}(d^3)$로 폭발합니다. 반면 경사하강법은 한 스텝당 $\mathcal{O}(Nd)$로 $d$에 선형이라 훨씬 빠릅니다. 그래서 딥러닝에서는 파라미터가 수백만~수십억이 되어 해석해는 아예 불가능하고, 경사하강법만 유일한 선택이 됩니다.
3.3 배치 · 미니배치 · SGD
한 스텝에 몇 개의 샘플을 사용할까요? 선택지는 세 가지:
- 전체 배치(Batch GD) — 매 스텝 전체 $N$개 샘플로 그래디언트 계산. 정확하지만 느림 + 메모리 부담.
- 확률적 경사하강법(SGD) — 매 스텝 샘플 1개로만 그래디언트 추정. 빠르지만 잡음이 크고 지그재그 수렴.
- 미니배치(Mini-batch) — 32~512개 샘플로 추정. 속도와 안정성의 절충. 현대 딥러닝의 표준. GPU 병렬 처리에도 잘 맞음.
SGD의 잡음이 오히려 지역 최솟값에서 탈출하는 데 도움이 된다는 것이 1951년 Robbins-Monro의 고전적 결과입니다. 작은 잡음이 때로는 "좋은 진동"입니다.
🎮 인터랙티브: 경사하강법 자동 학습
학습률 $\alpha$를 설정하고 "시작"을 누르면 컴퓨터가 자동으로 직선을 맞춥니다. 너무 크게 하면 발산하고, 너무 작게 하면 한참 걸립니다.
4. 비용 함수 표면
$J(w,b)$를 $w$-$b$ 평면 위에 색으로 그리면 그릇 모양이 됩니다(MSE는 볼록함수). 경사하강법은 이 표면 위를 굴러 내려가는 공이에요.
🎮 인터랙티브: 비용 표면 위의 경사하강 궤적
색이 진할수록 비용이 작은 지점입니다. 시작 위치에서 경사하강이 어떻게 골짜기로 내려가는지 보세요.
5. 정규방정식 — 한 방에 푸는 법
선형회귀는 사실 미분을 0으로 놓고 풀면 닫힌 해가 존재합니다.
$$ \mathbf{w}^* = (X^\top X)^{-1} X^\top \mathbf{y} $$장점은 한 번에 정확한 답을 얻는다는 것, 단점은 $X^\top X$의 역행렬을 구해야 해서 특성 수가 많아지면 비싸다는 것($O(n^3)$). 그래서 딥러닝처럼 특성이 수백만 개인 경우엔 무조건 경사하강 계열을 씁니다.
6. 코드 예제
from sklearn.linear_model import LinearRegression, SGDRegressor
import numpy as np
X = np.array([[5.4],[8.5],[12.3],[15.0],[18.7],[22.0]])
y = np.array([40, 90, 200, 320, 480, 700])
# 정규방정식 (해석해)
lr = LinearRegression().fit(X, y)
print(lr.coef_, lr.intercept_)
# 경사하강법
sgd = SGDRegressor(learning_rate='constant', eta0=0.001, max_iter=1000)
sgd.fit(X, y)
📖 더 깊이 공부하기
- Sung Kim Lec 2-3 — hunkim.github.io/ml. 선형회귀와 경사하강을 가장 친절하게.
- Andrew Ng Machine Learning — Coursera. 첫 주차 강의 전체가 이 내용입니다.
- An Introduction to Statistical Learning — James 외, 3장. 통계학자의 관점에서 본 회귀.
- Goodfellow Deep Learning, 4-5장 — 수치 최적화의 모든 것.