모든 강의 자료와 영상은 공개된 해당 링크들을 통해서 학습하고 있다.
강의자료: https://cs229.stanford.edu/syllabus-spring2022.html
강의 영상: https://www.youtube.com/playlist?list=PLoROMvodv4rNyWOpJg_Yh4NSqI4Z4vOYy
2강 슬라이드: https://drive.google.com/file/d/1O_zLW3xvxv7w3R-kw7ZZMRPMcgY-gcim/view
요약
1. Linear Regression: 입력값 $ x $와 가중치 $ \theta $의 선형 결합으로 예측값 $ h_\theta(x)=\theta^Tx $를 만드는 회귀 모델을 정리한다.
2. Gradient Descent & LMS Algorithm: 비용 함수 $ J(\theta) $를 최소화하기 위해 기울기를 계산하고 파라미터 $ \theta $를 반복적으로 업데이트하는 방법을 살펴본다.
3. Batch vs Stochastic vs Mini-batch: 한 번의 업데이트에 사용하는 데이터 개수에 따라 Batch, SGD, Mini-batch 방식이 어떻게 달라지는지 비교한다.
0. Supervised Learning
Given Training Set
$ \{(x^{(1)}, y^{(1)}), \cdots, (x^{(n)}, y^{(n)})\} $
$ x^{(i)} \in \mathcal{X}, \quad y^{(i)} \in \mathcal{Y} $
좋은 $ h: \mathcal{X} \to \mathcal{Y} $ 찾기
y 가 discrete(이산형) 일때, classification
y 가 continous(연속형) 일때, regression
1. Linear regression
주택 가격 예시
$ h: Lot.area \to Price $ 찾기

$ h(x) = \theta_0 + \theta_1 x_1 $
선형이지만, 엄밀히는 아핀 모델(Affine Model)
절편($ \theta_0 $)이 포함된 아핀 모델의 계산 번거로움을 피하고자
입력값에 $ x_0 = 1 $을 강제로 추가하는 트릭입니다.
이를 통해 모든 식을 하나의 선형 결합($ \theta^T x $)으로 묶어, 단순화할 수 있습니다.
$ h(x) = \theta_0 x_0 + \theta_1 x_1 + \cdots + \theta_d x_d $
$ = \sum_{j=0}^{d} \theta_j x_j $
벡터 표기
$
\theta =
\begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_d
\end{bmatrix}
$, $
x^{(i)} =
\begin{bmatrix}
x_0^{(i)} \\
x_1^{(i)} \\
\vdots \\
x_d^{(i)}
\end{bmatrix}
$
$ (x_0^{(i)} = 1) $
행렬 표기
$
X =
\begin{bmatrix}
(x^{(1)})^T \\
(x^{(2)})^T \\
\vdots \\
(x^{(n)})^T
\end{bmatrix}
\in \mathbb{R}^{n \times (d+1)}
$
그래서
$ h(x) = \theta_0 x_0 + \theta_1 x_1 + \cdots + \theta_d x_d $,
$ h_\theta(x) \approx y $
에서
'어떤 가중치()를 써야 예측값이 실제 정답()과 가장 비슷해질까?'를 찾기 위해
비용 함수(Cost Function) $ J(\theta) $를 도입한다. (최소제곱법(Least Squares)을 기반)
$ J(\theta) = \frac{1}{2}\sum_{i=1}^{n}\left(h_\theta(x^{(i)}) - y^{(i)}\right)^2 $
$ min J(\theta) $
2. 경사 하강법 (Gradient Descent) & LMS Algorithm
$J(\theta)$를 최소화하기 위해, 미분을 통해 기울기를 구하고 파라미터 를 점진적으로 업데이트하는
LMS(Least Mean Squares)를 구한다.

$
\theta^{(0)} = 0
$
$
\theta_j^{(t+1)}
:=
\theta_j^{(t)}
-
\alpha
\frac{\partial}{\partial \theta_j}
J(\theta^{(t)})
$
(α: learning rate, 한 번에 얼마나 이동할지 정하는 값)
$
\frac{\partial}{\partial \theta_j}J(\theta)
=
\sum_{i=1}^{n}
\frac{1}{2}
\frac{\partial}{\partial \theta_j}
\left(h_\theta(x^{(i)}) - y^{(i)}\right)^2
$

여기서 $ h_\theta(x^{(i)}) - y^{(i)} $는 i번째 데이터에 대한 예측 오차이다.
그래서
$
h_\theta(x)
=
\theta_0 x_0
+
\theta_1 x_1
+
\theta_2 x_2
+
\cdots
+
\theta_d x_d
$
이렇게 표현해볼 수 있고,
미분하면 다음과 같다.
$
\frac{\partial}{\partial \theta_j}h_\theta(x)
=
x_j
$

$ \theta^{(t+1)} := \theta^{(t)} - \alpha \sum_{i=1}^{n} \left( h_\theta(x^{(i)}) - y^{(i)} \right) x^{(i)} $
α는 학습률이다. 보통 상수처럼 쓰인다.
학습이 진행될수록 학습률을 감소시키며, 고전적인 머신러닝에서는 α를 사용자가 직접 조정해야 하는 하이퍼파라미터로 본다.
3. Batch vs Stochastic Mini Batch
Batch Gradient Descent (BGD)
Batch Gradient Descent는 파라미터를 한 번 업데이트할 때 전체 학습 데이터 $ n $개를 모두 사용한다.
$$ \theta^{(t+1)} := \theta^{(t)} - \alpha \frac{1}{n}\sum_{i=1}^{n} \left(h_\theta(x^{(i)}) - y^{(i)}\right)x^{(i)} $$
전체 데이터를 사용하므로 기울기 방향은 비교적 안정적이다. 하지만 데이터가 수백만 개 이상으로 커지면, 한 번 업데이트하는 데 필요한 계산 비용과 메모리 사용량이 매우 커진다.
Stochastic Gradient Descent (SGD)
Stochastic Gradient Descent는 한 번 업데이트할 때 무작위로 선택한 데이터 1개만 사용한다.
$$ \theta^{(t+1)} := \theta^{(t)} - \alpha \left(h_\theta(x^{(i)}) - y^{(i)}\right)x^{(i)} $$
매 업데이트가 빠르다는 장점이 있지만, 데이터 하나에만 의존하므로 업데이트 방향이 불안정하다. 그래서 최솟값을 향해 부드럽게 내려가기보다는 지그재그로 움직이는 경향이 있다.
Mini-batch Gradient Descent
Mini-batch Gradient Descent는 Batch와 SGD의 중간 방식이다. 전체 데이터가 아니라, 무작위로 선택한 작은 데이터 묶음 $ B_t $만 사용한다. 이때 mini-batch의 크기를 $ b $라고 하면 보통 $ b \ll n $이다.
$$ \theta^{(t+1)} := \theta^{(t)} - \alpha \frac{1}{b}\sum_{i \in B_t} \left(h_\theta(x^{(i)}) - y^{(i)}\right)x^{(i)} $$
즉, 전체 데이터로 계산한 정확한 기울기 대신 일부 데이터로 계산한 근사적인 기울기를 사용한다.
계산 비용은 줄이면서도 SGD보다 안정적인 업데이트 방향을 얻을 수 있기 때문에, 실제 머신러닝에서는 mini-batch 방식이 가장 많이 사용된다.
후기
글 작성한다고, 강의를 한 번 더 보면서 수식과 함께 정리했다.
잘 이해하고 넘어가자.