-
LR Schedulr 정리파이토치&텐서플로우&관련코딩 2021. 4. 25. 15:40
사용법은 간단하다.
- 최적화에 사용할 옵티마이저 정의
- 스케줄러를 정의 할 때, 어느 옵티마이저에 적용할지와, 다른 매개변수를 정의.
- 훈련때는 옵티마이저는 훈련 과정에 보통때와 같이 쓰고, 일반적으로 스케줄러는 보통 에폭를 기준으로 몇 에폭마다 학습률을 바꾸는지 결정하므로 스케줄러의 step함수가 에폭을 기준으로 사용하는지를 확인.
예시 코드는 아래와 같다.
// 옵티마이저와 스케줄러 정의 optimizer_G = torch.optim.Adam(generator.parameters(), lr=args.lr, betas=args.betas) optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=args.lr, betas=args.betas) scheduler_G = torch.optim.lr_scheduler.StepLR(optimizer_G, step_size=args.lr_decay_step_size, gamma=args.lr_decay_gamma) scheduler_D = torch.optim.lr_scheduler.StepLR(optimizer_D, step_size=args.lr_decay_step_size, gamma=args.lr_decay_gamma) // 학습 시작 for epoch in rnage(args.epoch): for batch in train_loop: img = batch["img"] label = batch["label"] optimizer_D.zero_grad() D_loss.backward() optimizer_D.step() optimizer_G.zero_grad() G_loss.backward() // 만약 10 에포크마다 학습률을 0.1로 감소시킨다 하면 아래와 같이 for문 밖에다가 step함수를 써준다. // 이렇게 하면 에포크를 기준으로 10번을 돌면 감소시켜주고, 만약 train_loop안에 있다면 한 에폭당이 아닌 한 배치당을 스텝으로 친다. schduler_D.step() schduler_G.step()
StepLR
위의 예시처럼 가장 단순한 스케줄러이다. 일정 스텝마다 학습률을 일정하게 감소시킨다.
- step size : step()이 몇번 불릴때마다 감소시키는지 정함.
- gamma : 얼마나 감소시킬지 정함
MultiStepLR
StepLR과 달리 감소될 에폭을 정해준다. 예를 들어서 아래와 같이 쓰면,
scheduler = torch.optim.lr_schduler.MultiStepLR(optimizer, milestones=[100, 210], gamma=0.1)
100, 210에폭에서 학습률을 $\frac{1}{10}$씩 감소시킨다.
ExponentialLR
StepLR의 step size가 1인 함수이다. 잘 안쓸듯
ReduceLROnPlateau
제일 많이 보이는 건데, 이건 특이하게 step 함수에 값을 넣는다. 이 값이 줄지 않는다면 patience를 기록해 두었다가 도달하면 감소시키는 식.
- mode : "min" or "max"를 넣는다. min이면 감소를 안할때 학습률을 조정하고, max이면 증가를 안할 때 학습률 조정. 기본값 : "min"
- factor : 위의 gamma와 같은 역할. 기본값 : 0.1
- patience : 계속 작아졌다고 할 때, 몇 epoch를 참을 것인지 결정. 기본값 : 10
- threshold : step함수에 들어가는 값이 이전에 업데이트때 들어간 값에 비해 얼만큼 차이나야 업데이트를 시킬 수 있다고 볼 수 있는지 결정. 기본값 : 1e-4
- min_lr : 감소되는 학습률의 최솟값
- eps : threshold는 step안에 들어가는 값을 기준으로 차이가 나야 되는 것이고, 이거는 학습률을 기준으로 이전 학습률에서 다음 학습률의 차이가 eps보다 작으면 업데이트를 안한다. 예를 들어 이전 학습률이 1e-8이고 다음 업데이트 학습률이 1e-9이면 업데이트가 안된다. 기본값 1e-8.
CyclicLR
step함수에 에폭을 넣어준다. 이 스케줄러는 에폭을 기준으로 학습률을 변화시킨다. cyclic 이므로 계속 최저점, 최고점 왔다갔다함.
- base_lr : 가장 낮은 학습률
- max_lr : 가장 높은 학습률
- step_size_up : 예를 들어 10을 입력하면 10번동안 base_lr에서 max_lr로 올라감. 기본값 2000
- step_size_down : 값을 입력 안하면 step_size_up과 같다. 보통 입력안하는게 맞을듯
- mode : 세가지 모드가 있다. "triangular", "triangular2", "exp_range". 아래 그림 참조. 기본값 "triangular"
- gamma : "exp_range" 모드 일때 gamma**cycilc_iteration으로 설정됨. 기본값 1.0
CosineAnnealingLR
학습률이 코사인 함수를 따라서 eat_min까지 떨어졌다 다시 초기 학습률까지 올라온다. 아래 식 참조 :
$$lr_t = lr_ + \frac{1}{2}(lr_{max} - lr{min})(1 + cos(\frac{T_{cur}}{T_{max}}\pi))$$- T_max : 위의 수식을 보면 주기가 $2T_{max}$임을 알 수 있다. 따라서 $T_{max}$는 주기의 반을 나타낸다.
- eta_min : 최대가 옵티마이저에서 지정한 학습률이고, 최소는 이 값이다. 결론적으로 전체적인 학습률은 이 값과 옵티마이저의 학습률 사이에서 움직인다. 기본값 : 0
CosineAnnealingWarmRestats
CosineAnnelingLR과 식을 공유한다. 한가지 다른 점은 이건 올라가는게 코사인 함수가 아니라 내가 정해준 학습률부터 최솟값 eta_min까지 다시 내려간다.
- T_0 : 이게 주기를 정한다. 위에서는 주기가 $T_{max}$의 2배였다면 이 스케줄러는 $T_0$이다.
- T_mult : 주기를 조정하는 변수. 만약 2이면 다음 주기는 2배가 된다.
- eta_min : 최소 학습률. 기본값 : 0
'파이토치&텐서플로우&관련코딩' 카테고리의 다른 글
SoftmaxGAN에서 모델 그래프 구조 공부 (0) 2021.05.05 torch gradient 계산 정리 (0) 2021.04.28 view vs reshape (0) 2021.04.23 파이토치 torchvision.utils.save_image (0) 2021.04.22 모델 저장 (0) 2021.04.22