학습률 조정, 미리 충분합니까? 나중에 더할까?

AdaGrad는 말하지 않고 알려진 각 특징마다 학습률을 자동으로 조정하는 알고리즘이다. Hivemall의 구현으로 초기 파라미터를 재고할 기회가 있었지만, 초기 파라미터의 방식에 의문을 가지는 부분이 있어 정리하고 싶었으므로 이 엔트리를 쓰고 있다

AdaGrad recap



AdaGrad에서는 g: 구배, w: 특징의 가중치의 배열에 대해 다음과 같이 갱신한다.
gg[i] += g * g;
η = eta / (sqrt(gg[i]) + eps);
w[i] -= η * g;

여기서 gg: 초기값 0.0의 배열, eta: 학습률의 상수, η가 학습률.
AdaGrad에서는, 그라디언트의 제곱을 훈련 사례마다 더해, 학습율을 gg로 나눔으로써 학습률의 자동 조정을 실시한다. 기본적으로는 훈련이 진행될 때마다 α를 작게 해 나가지 않으면 학습이 수렴하지 않는다.

Chainer 하지만 TensorFlow 하지만 Keras 에서도 마찬가지로 구현되고 있다.

eps의 초기값



eps의 초기값은 제로 나눗셈을 피하기 위해서이거나 0에 가까운 작은 값을 사용하는 것이 좋다고 한다.
Chainer의 구현이라고 디폴트로 eps=1e-8, eta가 0.001 로 되어 있다.

이 기사 그렇듯이, eps가 0에 가까운 값이라고 하면 최초의 가중치의 갱신이 eta와 거의 동일해져, 비교적 알기 쉬운 거동이 된다.
eta / sqrt(g * g) * g = eta

다만, 최초의 가중치의 갱신이 w[i] -= eta 라고 하는 것은 이상적일까(?)

eta에 대한 보정



eps가 0에 가까우면 1/sqrt(x)의 보정이 수행됩니다. 다음과 같은 느낌의 슬로프가 된다.



gg가 0.01이거나 하면 eta * 10이기 때문에 상당히 aggressive로 업데이트가 이루어진다.

Hivemall이라고 eta의 ​​초기치로부터 기본적으로 학습률이 내려가고 싶다는 생각으로부터, 이 기사 과 같이, eps의 초기치는 1.0으로서 η = eta / (sqrt(eps + gg[i])) 를 이용하고 있다. 이렇게 하면 기본적으로 학습률이 eta 이하가 된다.



첫 업데이트



이하와 같이, 학습율의 조정에 구배 g는 이용하지 않는 것으로 한다. η * g 에서 갱신하는데 학습률의 조정을 그 때의 그라디언트 g로 조정하는 것이 어딘가 걸린다(과거의 그라디언트라면 좋지만).
gg = gg[i];
gg[i] = gg + g * g;
η = eta / sqrt(eps + gg);
w[i] -= η * g;

이 때, eps를 1로 하면, 최초의 갱신시, gg는 0이므로, 학습율은 파라미터로 준 초기 학습률과 동일해진다. 즉, SGD와 같은 갱신식이 된다. 학습률은 초기 학습률 eta에서 단조롭게 감소한다.
η = eta / sqrt (1+0) = eta
w[i] -= eta * g;

마지막으로



논문대로 gg를 먼저 더하는 것이 좋습니까?

p.s. 이 영화 좋아합니다.

좋은 웹페이지 즐겨찾기