본문 바로가기

부스트캠프 AI Tech/AI_Math

[04] 확률적 경사하강법 SGD

선형회귀분석 복습

  • 역행렬을 이용하지 말고, 경사하강법을 이용해 적절한 선형모델을 찾아보자
    • 선형모델 아닌 모델 → 경사하강법 사용 가능
    • 경사하강법: 일반적인 기계학습 최적화
  • 선형회귀의 목적식은 $\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)
    1. 벡터의 거리는 L2-norm으로 계산
    2. Squared Error는 각 데이터별로 정답과 예측 벡터 사이를 L2-norm의 제곱으로 계산
    3. Mean Squared Error는 Squared Error를 데이터 숫자만큼 나눠준다
    4. 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 너무 작으면 경사하강법보다 느리게 수렴

GD 와 SGD

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