Learning rate & warmup step & LR scheduling
Background
요즘 딥러닝을 하다보면 수도없이 접하게 되는 단어 중 하나는 learning rate, warmup, LR scheduler와 같은 것들입니다.
이미 시중에 여러가지 기법들이 나와있고 한번은 정리해야겠다 생각했는데, 우연히 좋은 스레드를 발견하게 되서 공유해봅니다.
버트 논문에는 다음과 같은 그림이 있습니다. 여기서 밑줄쳐진 learning rate warmup과 linear decay에 대한 내용입니다.
Warmup
일반적으로 lr warmup은 말그대로 천천히 lr을 올리는 작업을 뜻합니다.
lr을 2e-5
로 셋팅하고 warmup step을 10,000
으로 셋팅한다면, (linear 일 경우) lr은 10,000 스텝동안 0
에서 2e-5
까지 증가하게 됩니다.
코드 구현을 보면 다음과 같습니다
현재 스텝(global step)이 warmup 스텝 대비 어느정도이지 비율을 구하고 (warmup_percent_done = global_steps_float / warmup_steps_float
)그에 맞는 warmup_lr을 구하는 방식으로 lr을 조절해갑니다. (warmup_learning_rate = init_lr * warmup_percent_done
)
1 | def create_optimizer(loss, init_lr, num_train_steps, num_warmup_steps, use_tpu): |
why warmup is required for BERT(MLM, from scratch)?
- LR을 조절해주는걸 LR scheduling이라 부르고, 이러한 행위는 DL model 성능 개선에 도움을 주는 것으로 알려졌습니다.
- Another advantage of a high learning rate near the beginning (after warmup, which is another issue) is that it has a regularisation effect as it ends up in a relatively “flat” part of parameter space (ie: the hessian of the loss is relatively small). The idea of “super-convergence” tries to utilise this (paper, blog).
- 블로그 내용이 꽤 유익하니 참고하셔도 좋을 것 같습니다,
linear, cycle
등 scheduler에 대해 다룹니다.
- 블로그 내용이 꽤 유익하니 참고하셔도 좋을 것 같습니다,
Weight decay & AdamW
- 참고: https://hiddenbeginner.github.io/deeplearning/paperreview/2019/12/29/paper_review_AdamW.html
weight decay는 gradient를 업데이트할때 이전 weight의 크기를 일정부분 감소시켜줘서 업데이트를 원활하게 해주는 트릭입니다. 0~1 사이로 셋팅하며 PLM에서는 보통0.01
정도로 셋팅합니다.
Learning rate & warmup step & LR scheduling