2장 - 선형 회귀와 경사 하강법

🏷️ "cs229" "machine-learning" "book"

2장. 선형 회귀와 경사 하강법

이번 강의에서는 첫 번째 학습 알고리즘인 선형 회귀를 깊이 다룬다. 배치 경사 하강법과 확률적 경사 하강법을 사용해 모델을 피팅하는 방법, 그리고 정규 방정식을 통해 한 단계 만에 최적해를 구하는 방법을 배운다.


2-cs229-gradient-descent.png

2.1 지도 학습의 구조

지도 학습의 흐름은 다음과 같다.

훈련 데이터셋 → 학습 알고리즘 → 가설 함수 h
  1. 훈련 세트를 학습 알고리즘에 입력한다.
  2. 학습 알고리즘은 가설(hypothesis) 함수 \(h\)를 출력한다.
  3. 가설 함수는 새로운 입력(예: 주택 면적)을 받아 예측값(예: 주택 가격)을 반환한다.

머신러닝 알고리즘 설계 시 핵심 결정 사항: - 데이터셋은 무엇인가? - 가설을 어떻게 표현할 것인가? - 어떤 알고리즘으로 가설을 학습할 것인가?


2.2 표기법 정리

선형 회귀를 본격적으로 다루기 전에, 이 강좌 전체에서 사용할 표기법을 정리한다.

기호

의미

\(m\)

훈련 예제의 수

\(n\)

특성(feature)의 수

\(x\)

입력 특성 (또는 입력 속성)

\(y\)

출력 / 목표 변수 (target variable)

\((x^{(i)}, y^{(i)})\)

\(i\)번째 훈련 예제 (위첨자 괄호는 지수가 아니라 인덱스)

\(\theta\)

매개변수 (parameters) — 학습 알고리즘이 선택하는 값

\(h_\theta(x)\)

가설 함수 — \(\theta\)\(x\) 모두에 의존


2.3 선형 회귀 모델

단일 특성

주택 면적 \(x\) 하나만 사용하는 가장 단순한 형태:

\[h_\theta(x) = \theta_0 + \theta_1 x\]

엄밀히 말하면 이것은 아핀(affine) 함수이지만, 머신러닝에서는 관례적으로 선형 함수라 부른다.

다중 특성

주택 면적(\(x_1\))과 침실 수(\(x_2\))를 함께 사용하는 경우:

\[h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2\]

표기를 간결하게 하기 위해 \(x_0 = 1\) (더미 특성)을 정의하면:

\[h_\theta(x) = \sum_{j=0}^{n} \theta_j x_j = \theta^T x\]

여기서 \(\theta\)\(x\)는 모두 \((n+1)\)차원 벡터다.


2.4 비용 함수 (Cost Function)

학습 알고리즘의 목표는 예측값 \(h_\theta(x)\)가 실제값 \(y\)가능한 한 가까워지도록 매개변수 \(\theta\)를 선택하는 것이다.

이를 공식화한 것이 비용 함수(또는 손실 함수)다:

\[J(\theta) = \frac{1}{2} \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2\]

왜 제곱 오차인가? 절대 오차나 4제곱 오차가 아니라 제곱 오차를 쓰는 이유는 일반화 선형 모델(GLM)에서 설명된다. 간단히 말하면, 제곱 오차는 가우시안(정규) 분포 가정에 대응한다.


2.5 경사 하강법 (Gradient Descent)

비용 함수 \(J(\theta)\)를 최소화하는 \(\theta\)를 찾는 반복적(iterative) 알고리즘이다.

직관

언덕 위에 서 있다고 상상하자. 360도 돌아보며 가장 가파르게 내려가는 방향을 찾아 작은 걸음을 옮긴다. 새로운 위치에서 같은 과정을 반복한다. 이것이 경사 하강법이다.

업데이트 규칙

\[\theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta)\]

\(j = 0, 1, \ldots, n\)에 대해 이 업데이트를 수렴할 때까지 반복한다.

편미분 계산

하나의 훈련 예제에 대해:

\[\frac{\partial}{\partial \theta_j} J(\theta) = \left( h_\theta(x) - y \right) \cdot x_j\]

\(m\)개의 전체 훈련 예제에 대해 합산하면:

\[\frac{\partial}{\partial \theta_j} J(\theta) = \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) \cdot x_j^{(i)}\]

학습률 선택

학습률

결과

너무 큼

최솟값을 지나쳐 발산할 수 있음

너무 작음

수렴이 매우 느림

실용적 접근법: 특성을 \([-1, +1]\) 범위로 스케일링한 후, \(\alpha = 0.01\)에서 시작하여 지수적으로 조정한다 (0.01, 0.02, 0.04, 0.08, ...). 비용 함수가 감소하지 않고 증가한다면 학습률이 너무 큰 것이다.

선형 회귀의 볼록성

선형 회귀의 비용 함수 \(J(\theta)\)제곱 항의 합으로 정의되므로, 항상 아래로 볼록한 그릇(bowl) 모양의 이차 함수가 된다. 따라서:


2.6 배치 경사 하강법 vs 확률적 경사 하강법

배치 경사 하강법 (Batch Gradient Descent)

매 업데이트 단계마다 전체 훈련 세트를 한 번 순회하여 기울기를 계산한다.

\[\theta_j := \theta_j - \alpha \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)}\]

장점: 정확한 기울기를 계산하므로 안정적으로 수렴한다.

단점: 데이터셋이 수백만~수억 건이면, 한 걸음을 옮기기 위해 전체 데이터를 읽어야 하므로 극도로 느리다. 예를 들어 음성 인식 시스템에서 테라바이트 규모의 데이터를 다룬다면, 배치 경사 하강법의 한 번 반복조차 실행하기 어려울 수 있다.

확률적 경사 하강법 (Stochastic Gradient Descent, SGD)

매 업데이트 단계마다 훈련 예제 하나만 사용하여 기울기를 근사한다.

\[\text{for } i = 1 \text{ to } m: \quad \theta_j := \theta_j - \alpha \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)}\]

장점: 하나의 예제만 보고도 매개변수를 즉시 업데이트할 수 있어 대규모 데이터셋에서 훨씬 빠르다.

단점: 경로가 noisy하다. 정확히 전역 최솟값에 수렴하지 않고 그 주변을 진동한다.

비교 요약

특성

배치 GD

확률적 GD

업데이트당 데이터

전체 \(m\)

1개

수렴 경로

매끄러움

noisy / 진동

대규모 데이터

매우 느림

빠름

수렴 정밀도

정확한 전역 최솟값

전역 최솟값 근처 진동

실용적 가이드라인

미니 배치 경사 하강법(Mini-batch GD)은 한 번에 하나도 아니고 전체도 아닌, 예컨대 100개씩 묶어서 업데이트하는 절충안이다. 실무에서 가장 널리 쓰인다.


2.7 정규 방정식 (Normal Equation)

경사 하강법은 반복적 알고리즘이지만, 선형 회귀에 한해 반복 없이 한 단계 만에 최적 \(\theta\)를 구하는 닫힌 형태(closed-form) 해가 존재한다.

행렬 미분 표기법

\(J(\theta)\)가 벡터 \(\theta\)에서 실수로의 함수일 때, \(\theta\)에 대한 미분은:

\[\nabla_\theta J(\theta) = \begin{bmatrix} \frac{\partial J}{\partial \theta_0} \\ \frac{\partial J}{\partial \theta_1} \\ \vdots \\ \frac{\partial J}{\partial \theta_n} \end{bmatrix}\]

이 표기법은 일반적인 행렬 함수로 확장된다. 함수 \(f\)가 행렬 \(A\)에서 실수로의 매핑일 때, \(A\)에 대한 미분은 각 원소에 대한 편미분을 같은 위치에 배치한 행렬이다.

대각합(Trace)의 성질

행렬 \(A\)의 대각합:

\[\text{tr}(A) = \sum_i A_{ii}\]

유용한 성질들: - \(\text{tr}(A) = \text{tr}(A^T)\) - \(\text{tr}(AB) = \text{tr}(BA)\) (순환 치환 성질) - \(\text{tr}(ABC) = \text{tr}(CAB)\) - \(\nabla_A \text{tr}(AB) = B^T\) - \(\nabla_A \text{tr}(AA^TC) = 2CA\) (제곱의 미분과 유사)

설계 행렬과 벡터 표현

훈련 예제를 행으로 쌓은 설계 행렬(design matrix) \(X\)를 정의한다:

\[X = \begin{bmatrix} — (x^{(1)})^T — \\ — (x^{(2)})^T — \\ \vdots \\ — (x^{(m)})^T — \end{bmatrix}, \quad \vec{y} = \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(m)} \end{bmatrix}\]

그러면 비용 함수를 행렬로 표현할 수 있다:

\[J(\theta) = \frac{1}{2}(X\theta - \vec{y})^T(X\theta - \vec{y})\]

유도 과정 (개요)

  1. \(J(\theta)\)를 전개한다: \((X\theta - \vec{y})^T(X\theta - \vec{y})\)를 이차식처럼 펼친다.
  2. \(\nabla_\theta J(\theta)\)를 구한다: 대각합의 성질과 행렬 미분 공식을 적용한다.
  3. 미분을 0으로 놓고 \(\theta\)에 대해 푼다.

결과:

\[\nabla_\theta J(\theta) = X^TX\theta - X^T\vec{y} = 0\]

정규 방정식

\[\boxed{\theta = (X^TX)^{-1}X^T\vec{y}}\]

이 공식 하나로, 행렬 곱셈 몇 번만에 전역 최솟값의 \(\theta\)한 단계에 구할 수 있다.

주의사항


핵심 정리

개념

핵심

선형 회귀

\(h_\theta(x) = \theta^Tx\), 제곱 오차를 최소화

비용 함수

\(J(\theta) = \frac{1}{2}\sum(h_\theta(x^{(i)}) - y^{(i)})^2\)

배치 GD

전체 데이터로 기울기 계산 → 안정적이나 대규모에서 느림

확률적 GD

예제 하나씩으로 업데이트 → 빠르나 noisy

정규 방정식

\(\theta = (X^TX)^{-1}X^T\vec{y}\) — 선형 회귀 전용, 한 단계 해

학습률

너무 크면 발산, 너무 작으면 느림 → 지수적으로 탐색


이전 장: 1장 - 머신러닝이란 무엇인가 다음 장: 3장 - 국소 가중 회귀와 로지스틱 회귀