콘텐츠로 이동

Root Mean Square Propagation (RMSProp)

이 알고리즘은 publish가 되지않고, Hinton 교수님의 Coursera 강의(2012)에서 소개된 알고리즘임.

아래 이미지가 해당 슬라이드 (아래 참고자료에 url로 다운로드 가능)임 image

AdaGrad와 거의 비슷하지만,

  • 지금까지의 모든 squared gradient의 누적합으로 \(\textbf{s}\)를 구하는 것이 아닌,
  • 과거 squared gradient들의 Exponential Moving Average 를 통해
    • 과거의 gradient의 영향을 지수함수로 감소 시키고
    • 최근의 gradient들을 중심으로 누적 시켜
  • 지나치게 learning rate가 빠르게 감소하는 문제를 해결함.

참고: Exponential Moving Average

즉, RMSPropAdaGrad의 문제점을 개선한 adaptive learning rate 기반의 optimizer임.

  • 각각의 parameter별로 과거 squared gradient의 EMA의 square root에 반비례하는 learning rate를 따로 적용하는 셈.
  • 과거 squared gradient의 EMA의 square root가 크다는 것은 해당 parameter에서 최근까지 gradient가 크게 나타났다는 의미이므로 작은 learning rate로 움직임.
  • 반대로 과거 squared gradient의 EMA의 square root가 작다는 것은 해당 parameter에서 최근까지 gradient가 작게 나타났다는 의미이므로 큰 learning rate로 움직임.

수식은 다음과 같음.

\[ \begin{aligned} s_{t+1} &= \beta\, s_t + (1-\beta)\, \bigl(\nabla_\theta J(\theta_t) \;\otimes\; \nabla_\theta J(\theta_t)\bigr), \\ \theta_{t+1} &= \theta_t - \eta\; \nabla_\theta J(\theta_t) \;\oslash\; \bigl(\sqrt{s_{t+1}} + \varepsilon\bigr). \end{aligned} \]
  • Exponential Decaying Factor인 \(\beta\) (forgetting factor, decaying factor, smoothing factor)는 0.9를 기본값으로 가지며, 일종의 hyperparameter로 0.9~0.999의 값을 취함.
  • \(\frac{1}{1-\beta}\)의 gradient들에 대한 평균으로 근사하기도 함. (즉 \(\beta\)가 클 수록 오래전의 gradient들을 고려하여 누적시켜 learning rate를 감소시킴)
  • \(\otimes\)는 element-wise multiplication (Hadamard product) 임.
  • \(\oslash\)는 element-wise division (Hadamard division)임.

다음의 형태로 기재하는 문헌도 많음 (같은 의미임):

\[ s_{t+1} = \beta v_{t} + (1-\beta)g_t^2 \\ \theta_{t+1} = \theta_{t} - \eta \frac{g_{t+1}}{\sqrt{v_{t+1}}+\epsilon} \]
  • \(g_t\)\(t\) 시점의 gradient임!
  • \(\epsilon\) 은 numerical stability term 으로 division by zero를 방지하고 numerical stability를 확보하기 위한 작은 상수임.

Pseudo code

cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
  • decay_rate is a hyperparameter and typical values are [0.9, 0.99, 0.999]
  • x+= update is identical to Adagrad, but the cache variable is a “leaky”

PyTorch에서의 구현

아래와 같이 torch.optim.RMSprop optimizer 객체를 생성하면 됨.

optimizer = torch.optim.RMSprop(
    model.parameters(),
    lr=0.001,
    alpha=0.9
)
  • lr: learning rate
  • alpha: squared gradient의 exponential moving average에 사용되는 decay factor로, Keras의 rho (앞서 수식의 beta)에 대응함.

Keras에서의 구현.

아래와 같이 RMSProp optimizer 객체를 생성하여 fit에 넘겨주면 됨.

optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.001,
                                        rho=0.9)

References