선형회귀분석 복습
- 역행렬을 이용하지 말고, 경사하강법을 이용해 적절한 선형모델을 찾아보자
- 선형모델 아닌 모델 → 경사하강법 사용 가능
- 경사하강법: 일반적인 기계학습 최적화
- 선형회귀의 목적식은 $\Vert y-X\beta \Vert_2$이고 (L2-norm) 이를 최소화하는 $\beta$를 찾아야 하므로 다음과 같은 gradient vector를 구해야 한다
- $\nabla_\beta \Vert y-X\beta \Vert_2 = (\partial_{\beta_1} \Vert y-X\beta \Vert_2, ... , \partial_{\beta_d}\Vert y-X\beta \Vert_2)$
- $\Vert y-X\beta \Vert_2$가 아닌 $\Vert y-X\beta \Vert_2^2$를 최소화해도 된다
- RMSE (Root Mean Squared Error)
- 벡터의 거리는 L2-norm으로 계산
- Squared Error는 각 데이터별로 정답과 예측 벡터 사이를 L2-norm의 제곱으로 계산
- Mean Squared Error는 Squared Error를 데이터 숫자만큼 나눠준다
- Root Mean Squared Error는 MSE에 제곱근을 취해준다
- RMSE는 L2-norm 정의와 유사하지만, 데이터 개수만큼 나눠줘야 한다!
- 정확히 쓰면 $E[\Vert y-X \beta \Vert]_2$로 써야한다 (기대값)
- 관용적으로 RMSE를 L2-norm처럼 쓴다
경사하강법으로 선형회귀 계수 구하기
- 계수 $\beta$에 대해 미분한 결과 → $X^T$
- 목적식을 최소화하는 $\beta$를 구하는 경사하강법 알고리즘
- $\lambda$는 학습률
- $\beta^{(t)}$는 t번째 단계에서의 coefficient
- $\Vert y - X\beta \Vert_2$ 대신 $\Vert y - X\beta \Vert_2^2$을 최소화하면 식이 좀 더 간단해진다
- 계산이 더 쉽다
- 최적화 방향 같다, $L2$ 최적화와 $L2 ^2$ 최적화 같다.
경사하강법 기반 선형회귀 알고리즘
- $\nabla_\beta \Vert y - X\beta \Vert_2^2$ 항을 계산해서 $\beta$ 업데이트
- L2-norm은 $\sqrt{|x|^2 + |y|^2}$
Input: X, y, lr, T, Output: data
# norm: L2-norm 계산 함수
# lr: 학습률, T: 학습횟수
# 종료조건 - 일정 학습횟수로 변경
for t in range(T):
error = y - X @ beta
grad = - transpose(X) @ error
beta = beta - lr * grad
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
y = np.dot(X, np.array([1, 2])) + 3
beta_gd = [10.1, 15.1, -6.5] # [1, 2, 3]이 정답
X_ = np.array([np.append(x, [1]) for x in X]) # intercept 항 추가
for t in range(5000):
error = y - X_ @ beta_gd
# error = error / np.linalg.norm(error)
grad = - np.transpose(X_) @ error
beta_gd = beta_gd - 0.01 * grad
print(beta_gd) # [1.00000367 1.99999949 2.99999516]
- 경사하강법 알고리즘에선 학습률과 학습횟수가 중요한
hyperparameter
가 된다- 학습률 작으면 수렴 느리고, 크면 불안정한 움직임
- 학습횟수 작으면 경사하강법 수렴 잘 안될 수 있다
경사하강법은 만능일까?
- 이론적으로 경사하강법은 미분가능하고 볼록(convex)한 함수에 대해선 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장
- 볼록한 함수는 gradient vector가 항상 최소점을 향한다
- [참고] 볼록함수 convex, 오목함수 concave
- 특히 선형회귀 경우 목적식 $\Vert y-X\beta \Vert_2$은 회귀계수 $\beta$에 대해 볼록함수이기 때문에 알고리즘을 충분히 돌리면 수렴이 보장된다
- L2-norm
- 비선형회귀 문제의 경우 목적식이 볼록하지 않을 수 있으므로 수렴이 항상 보장되지는 않는다
- 딥러닝을 사용하는 경우 목적식은 대부분 볼록함수가 아니다 (non-convex)
Stochastic Gradient Descent
- 확률적 경사하강법은 모든 데이터를 사용해서 업데이트하는 대신 데이터 한개 또는 일부(
mini-batch
) 활용하여 업데이트 - 볼록이 아닌(non-convex) 목적식은
SGD
를 통해 최적화할 수 있다$\mathbb{E} [\widehat{\nabla_\theta \mathcal{L}}] \approx \nabla_\theta \mathcal{L}$ - $\theta^{(t+1)} \leftarrow \theta^{(t)} - \widehat{\nabla_\theta \mathcal{L}}(\theta^{(t)})$
SGD
: 데이터 한 개 -> 비효율적mini-batch SGD
: 데이터 일부, mini-batch 만큼SGD
로 통용해 부른다SGD
라고 해서 만능은 아니지만, 딥러닝의 경우SGD
가 경사하강법보다 실증적으로 더 낫다고 검증되었다SGD
는 모든 데이터 사용한 gradient와 유사하지만, 같을 수는 없다SGD
는 데이터의 일부를 가지고 파라미터를 업데이트하기 때문에, 연산자원을 좀 더 효율적으로 활용- 아래 예시를 보면, 연산량이 $b/n$으로 감소
SGD 원리 : mini-batch 연산
- 경사하강법은 전체데이터 $D = (X, y)$를 가지고 목적식의 gradient vector인 $\nabla_\theta L(D, \theta)$를 계산
- 주어진 파라미터 $\theta$에서 목적식의 최소점으로 향하는 방향 안내
- SGD는 미니배치 $D_{(b)} = (X_{(B)}, y_{(b)}) \subset D$를 가지고 gradient vector를 근사해서 계산
- gradient 경사하강법과 다르지만, 방향 유사할 것이라고 기대
- mini-batch는 확률적으로 선택하므로 목적식 모양이 바뀌게 된다
- 매번 다른 mini-batch 사용함 → 목적식 모양 고정 아니다
- SGD는 볼록이 아닌 목적식에서도 사용 가능하므로 경사하강법보다 머신러닝 학습에 더 효율적 #TODO 왜???
- SGD에서 mini-batch 너무 작으면 경사하강법보다 느리게 수렴
SGD의 원리 : 하드웨어
Gradient Descent의 경우
- $256 \times 256 \times 3 \times 1,000,000 \approx 2^{37}$ Bytes
- 모든 데이터를 CPU → GPU 업로드하면, 메모리 부족해 out-of-memory 발생
SGD의 경우
- $256 \times 256 \times 3 \times |B| \leq 2^{18} \cdot |B|$ Bytes
- GPU에서 행렬 연산과 모델 파라미터 업데이트하는 동안, CPU는 전처리와 GPU에 업로드할 데이터 준비
- 빠른 연산, 하드웨어 한계 극복, 병렬 연산
정리
- 매번
mini-batch
sampling 때마다 목적함수 모양 바뀐다 - 앞에서 찾은 새로운 parameter에서의 gradient vector 계산 → 바뀐 모양에서의 gradient vector 계산, 값은 다를 수 있지만 비슷한 방향으로 갈 것이라고 기대
- 서로 다른
mini-batch
사용하면 곡선 모양 바뀌어서,non-convex
일 경우 local point에서 영벡터가 되더라도SGD
이용하면 극소, 극대점에서 목적식이 확률적으로 바뀌어 극소점이 아닐 확률 발생한다. - 확률적으로 극소점이 아니면
SGD
원리상 목적식이 바뀐 상태가 된다는 것이고, 여기서 계산을 하면 극소점(여기서는local-minimum
인듯)이 0이 아니라 극소점 탈출이 가능하다. 이를 이용해 non-convex에서 최소점을 찾을 수 있다.
'부스트캠프 AI Tech > AI_Math' 카테고리의 다른 글
[06] 확률론 (0) | 2022.01.16 |
---|---|
[05] 딥러닝 학습방법 이해하기 (0) | 2022.01.16 |
[03] 경사하강법 (0) | 2022.01.15 |
[02] 행렬 (0) | 2022.01.15 |
[01] Vector (0) | 2022.01.14 |