학습률 조정, 미리 충분합니까? 나중에 더할까?
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. 이 영화 좋아합니다.
Reference
이 문제에 관하여(학습률 조정, 미리 충분합니까? 나중에 더할까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/myui/items/36efa6b34cb60fb0ebbb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)