← 주차 목록

Week 3. 회귀 1: 선형회귀와 경사하강법

데이터에 직선 하나를 그어봅니다. 그 단순한 행위 안에 머신러닝의 모든 핵심 개념이 들어 있습니다.

이번 주에 배우는 것

  1. 회귀 문제란 무엇인가
  2. 가설(hypothesis)과 파라미터
  3. 비용 함수 (MSE)
  4. 경사하강법의 원리
  5. 학습률 — 너무 크면, 너무 작으면
  6. 해석적 해 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)$를 찾는 것.

"가장 잘 맞는다"는 말은 애매합니다. 각자 눈으로 그은 직선이 다를 수 있기 때문입니다. 그래서 수학에서는 이 기준을 숫자 하나로 정의합니다. 그것이 바로 아래에서 배울 비용 함수입니다.

용어 정리 — 이 강의에서 등장할 세 단어를 미리 구분해 둡시다. ① 파라미터(parameter): 모델이 학습으로 찾아내는 값. 여기서는 $w, b$. ② 하이퍼파라미터(hyperparameter): 사람이 미리 정해야 하는 값. 여기서는 학습률 $\alpha$. ③ 특징(feature): 입력 $x$의 한 성분. 길이, 무게, 색깔 등. 다중 회귀에서는 여러 개가 됩니다.

2. 비용 함수 — "잘 맞는다"를 수식으로 정의

예측값 $\hat{y}_i$와 실제값 $y_i$의 차이를 오차(error) 또는 잔차(residual)라고 합니다. 그런데 어떤 점은 직선 위에, 어떤 점은 직선 아래에 있으니 단순히 오차를 합치면 서로 상쇄되어 0에 가까워질 수 있습니다. 그래서 부호를 없애는 두 방법이 있습니다:

관례적으로 제곱을 씁니다. 그 이유는 세 가지: (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$)에 대해:

합 = 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

한 스텝에 몇 개의 샘플을 사용할까요? 선택지는 세 가지:

SGD의 잡음이 오히려 지역 최솟값에서 탈출하는 데 도움이 된다는 것이 1951년 Robbins-Monro의 고전적 결과입니다. 작은 잡음이 때로는 "좋은 진동"입니다.

실전 팁 — 학습률 정하기 — 처음에는 $10^{-2}$로 시작해보고, 손실이 발산하면 10배 줄이기, 거의 안 움직이면 3배 키우기를 반복합니다. 요즘은 학습률 스케줄러(cosine, warmup+decay)를 함께 씁니다. 자세한 팁은 W8 §최적화에서 다룹니다.

🎮 인터랙티브: 경사하강법 자동 학습

학습률 $\alpha$를 설정하고 "시작"을 누르면 컴퓨터가 자동으로 직선을 맞춥니다. 너무 크게 하면 발산하고, 너무 작게 하면 한참 걸립니다.

학습률 직관. 안개 낀 산에서 골짜기를 찾는 등산객을 떠올리세요. 보폭이 너무 크면 골짜기를 건너뛰고, 너무 작으면 평생 못 내려옵니다. 좋은 $\alpha$는 보통 $10^{-4}$ ~ $10^{-1}$ 사이에서 실험으로 찾습니다.

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)

📖 더 깊이 공부하기