/ DEEPLEARNING

Deep Learning - Stochastic Gradient Descent

Stochastic Gradient Descent

자료 분포로부터 독집적으로 추출한 $m$개의 견본으로 이루어진 미니배치의 평균 기울기를 취함으로써 훈련 집합 전체의 기울기의 불편추정량을 구할 수 있다. SGD 알고리즘의 핵심적인 매개변수는 학습 속도인데, 시간에 따라 학습 속도를 점차 줄일 필요가 있다. 왜냐하면 SGD의 기울기 추정에 의해 잡음이 도입되기 때문이다. 학습 과정에서 $m$개의 훈련 견본을 무작위로 추출하는 것이 하나의 잠음원으로 작용하는데, 이 잡음원은 알고리즘이 최솟값에 도달해도 사라지지 않는다.

SGD가 반드시 수렴할 충분조건

  • $\sum_{k=1}^{\infty} \epsilon_{k} = \infty$
  • $\sum_{k=1}^{\infty} \epsilon_{k}^{2} < \infty$

실제 응용에서는 $\tau$번째 반복까지는 학습속도 $\epsilon$을 선형으로 감소하고, $\tau$ 반복 이후에는 $\epsilon$을 그대로 두는 방법이 흔히 쓰인다.

$\epsilon_{k} = (1 - \alpha)\epsilon_{0} + \alpha \epsilon_{\tau} (\alpha = \frac{k}{\tau})$

학습 속도를 시행착오를 통해서 결정할 수 있지만, 보통의 경우 목적함수를 시간의 함수로 간주해서 함수의 곡선을 보고 결정하는 것이 최선이다. 선형 감소 방식을 사용할 때 결정해야 할 매개변수는 $\epsilon_{0}$과 $\epsilon_{\tau}$ 그리고 $\tau$이다. 일반적으로 $\epsilon_{\tau}$는 $\epsilon_{0}$의 값의 약 1% 정도로 잡아야 한다. $\epsilon_{0}$을 설정할 때 초기 학습 속도가 너무 높으면 비용함수가 크게 증가할 때가 많아서 학습 곡선이 요동칠 수 있다. 학습 속도가 너무 낮으면 학습이 느리게 진행되며, 초기학습속도가 너무 낮으면 큰 비용에 머무를 위험이 있다. 일반적으로, 최적의 초기 학습 속도는 처음 약 100회 반복 이후에 최고의 성과를 내는 학습 속도보다 높다. 따라서 알고리즘을 여러 번 반복해서 성과를 측정하고, 최고의 성과를 낸 학습 속도를 기록한 후 그보다 더 큰 값을 초기 학습 속도로 정하는 방법이 가장 바람직할 때가 많다.

최적화 알고리즘의 수렴 속도를 파악할 때 흔히 사용하는 측도는 $J(\theta) - min_{\theta}J(\theta)$로 정의되는 초과 오차이다. 현재 비용함수가 가능한 최소 비용보다 얼마나 큰지를 나타낸 값이다.

def f(x1, x2):
    return x1**2 + 2 * x2 ** 2
def f_grad(x1, x2):
    return 2 * x1, 4 * x2
def sgd(x1, x2, s1, s2, f_grad):
    g1, g2 = f_grad(x1, x2)

    g1 += torch.normal(0.0, 1, (1,))
    g2 += torch.normal(0.0, 1, (1,))
    eta_t = eta * lr()
    return (x1 - eta_t * g1, x2 - eta_t * g2, 0, 0)
def constant_lr():
    return 1
eta = 0.1
lr = constant_lr
d2l.show_trace_2d(f, d2l.train_2d(sgd, steps=50, f_grad=f_grad))
epoch 50, x1: -0.150819, x2: -0.042994

svg

참고 : 이안 굿펠로, 요수아 벤지오, 에런 쿠빌, 심층학습, Jpub(2018), p323-332