TensorFlow >= 2.0 일 경우와 케라스의 경우는 아래의 버전으로 AdaBelief Optimizer를 설치한다.
pip install adabelief-tf==0.2.0
TensorFlow의 버전이 2.0 미만일 경우는 adabelief-tf=0.0.1
을 설치한다.
AdaBelief Optimizer의 버전에 따라 hyperparameter 설정을 다르게 해 주어야 한다.
Version | epsilon | weight-decouple | rectify |
---|---|---|---|
adabelief-tf=0.0.1 | 1e-8 | Not supported | Not supported |
adabelief-tf=0.2.0 | 1e-14 | Supoorted | default:True |
간단한 Hyperparameter 조정
Adabelief Optimizer는 버전과 Task에 따라서 Hyperparameter를 다르게 설정해 주어야 한다.
(아래의 표는 PyTorch에서의 하이퍼파라미터 기준이다. Tensorflow에서는 PyTorch보다 100배 더 크게 잡아야 한다. 예를 들어 PyTorch에서 eps=1e-16이라면 Tensorflow에서는 eps=1e-14이다. (이 Optimizer를 만든 사람은 Tensorflow에 익숙하지 않다고 함))
Task | learning_rate | beta1 | beta2 | epsilon | weight_decay | weight_decouple | rectify | fixed_decay | amsgrad |
---|---|---|---|---|---|---|---|---|---|
Cifar | 1e-3 | 0.9 | 0.999 | 1e-8 | 5e-4 | False | False | False | False |
ImageNet | 1e-3 | 0.9 | 0.999 | 1e-8 | 1e-2 | True | False | False | False |
Object detection(PASCAL) | 1e-4 | 0.9 | 0.999 | 1e-8 | 1e-4 | False | False | False | False |
LSTM-1layer | 1e-3 | 0.9 | 0.999 | 1e-16 | 1.2e-6 | False | False | False | False |
LSTM 2,3 layer | 1e-2 | 0.9 | 0.999 | 1e-12 | 1.2e-6. | False | False | False | False |
GAN (small) | 2e-4 | 0.5 | 0.999 | 1e-12 | 0 | True=False (decay=0) | False | False | False |
SN-GAN (large) | 2e-4 | 0.5 | 0.999 | 1e-16 | 0 | True=False (decay=0) | True | False | False |
Transformer | 5e-4 | 0.9 | 0.999 | 1e-16 | 1e-4 | True | True | False | False |
Reinforcement (Rainbow) | 1e-4 | 0.9 | 0.999 | 1e-10 | 0.0 | True=False (decay=0) | True | False | False |
Reinforcement (HalfCheetah-v2) | 1e-3 | 0.9 | 0.999 | 1e-12 | 0.0 | True=False (decay=0) | True | False | False |
epsilon: Adam에서의 eps=x와 Adambelief에서의 eps=x*x는 비슷한 결과를 얻는다. 즉 Adam보다 1/2 정도 작은 hyperparameter를 사용해야 한다.
decoupled weight decay가 task에서 중요하면(AdamW가 Adam보다 성능이 낫다면) weight_decouple=True
를 사용해야 한다.
weight decay regularization = L2 regularization for standard SGD.
L2 regularizaion을 사용하면 weight decay 효과를 볼 수 있다. 그러나 Adam에서는 그 효과가 적다. decoupled weight decay는 L2 regularization과 분리된 weight decay이다. decoupled weight decay를 사용하면 learning rate와 weight decay가 서로 독립적이어서 한 하이퍼파라미터를 고정하고 다른 하나만 바꿔도 좋은 성능을 얻을 수 있다.
-참고: 논문리뷰 AdamW
"gradient threshold"는 0으로 나누는 결과를 가져오므로 사용하지 말 것! 대신 "gradient clip"을 사용해라.
learning rate schedule: 에포크 70, 80에서 decay되고 90에서 끝내면 좋은 결과가 나온다. default learning rate를 사용하면 결과가 좋지 않았다. 그러나 이 부분에 대해서는 많은 실험을 하지 않았다.
from adabelief_tf import AdaBeliefOptimizer
optimizer = AdaBeliefOptimizer(learning_rate=1e-3, epsilon=1e-14, rectify=False)
위의 연산은 모두 엘레멘트 별로(element-wise) 계산해준다. Adam과 Adabelief의 차이점은 파란색 부분이다. Adabelief는 Adam에서 Bias correction step을 지웠고, update되는 방향의 차이를 주었다. Adam에서는 update되는 방향이 (: 의 EMA(Exponential Moving Average)이지만 Adabelief에서는 (: 의 EMA)이다.
직관적으로 는 관측값 의 예측값이라고 할 수 있다. AdaBelief에서 관측값 이 에 가까우면 큰 step을 가지고, 관측값 이 에서 크게 벗어날수록 작은 step을 가진다.
SGD, Adam, AdaBound, RAdam, AdamW, Yogi, MSVAG, Fromage라는 8개의 Optimizer를 비교했을 때의 결과 비교이다. Adabelief의 성능이 제일 좋은 것을 볼 수 있다.
대회에서 필요한 부분만 가져다가 사용했고, 나머지 부분은 시간이 부족해 다 살펴보지 못 했다.