Search

Polynomial Learning Rate Scheduling 개념 및 코드 분석

카테고리
DL/ML
Index
ML/DL
Learning Rate Scheduling
Polynomial
Segmenter
날짜
2024/02/15

Polynomial Learning Rate 스케줄링이란?

딥러닝 모델을 훈련할 때 사용되는 학습률(learning rate) 스케줄링 기법 중 하나로,
시작 학습률(lrstartlr_{start})에서 최종 학습률(lrendlr_{end})까지 학습률을 다항식 형태로 감소시키는 방식.
최대학습 시간(tmaxt_{max}) 동안, 학습률의 감소 패턴을 다항식으로 모델링해서 훈련과정을 최적화
감소율은 다항식의 차수powerpower에 의해 결정됨
→ 다항식의 차수를 조절하는 방식으로 학습률 감소 정도를 제어
Polynomial Learning Rate Scheduler 수식
lr(t)lr(t): 시간 t 에서의 학습률
lrstartlr_{start}, lrendlr_{end} : 시작 학습률, 최종학습률
tmaxt_{max} : 학습률 감소를 적용할 최대 시간(에포크)
powerpower: 다항식 차수 (powerpower값이 클수록 감소 속도가 느려짐)

Polynomial Learning Rate 스케줄러 코드

다음은 SETR(Segmenter)모델에서 사용된 Polynomial Learning Rate Scheduler 클래스 코드이다.
segmenter/segm/optim/scheduler.py에 구현되어있다.
scheduler.py 전체 코드

1. Polynomial LR 클래스 생성자

: PyTorch_LRScheduler를 상속받아 Polynomial Learning Rate 스케줄링을 위해 구현된 클래스
class PolynomialLR(_LRScheduler): # PolynomialLR 클래스는 PyTorch의 _LRScheduler를 상속받아 정의됩니다. def __init__( self, optimizer, step_size, iter_warmup, iter_max, power, min_lr=0, last_epoch=-1, ): self.step_size = step_size self.iter_warmup = int(iter_warmup) self.iter_max = int(iter_max) self.power = power self.min_lr = min_lr super(PolynomialLR, self).__init__(optimizer, last_epoch) # 상위 클래스의 생성자 호출
Python
복사
생성자 함수 주요 파라미터
optimizer: PyTorch 최적화 알고리즘 (예: SGD, Adam 등)
step_size: 학습률을 업데이트할 스텝 사이즈
iter_warmup: 학습 초기에 학습률을 서서히 증가시킬 워밍업 단계의 반복 횟수
iter_max: 최대 반복 횟수 (이 값을 넘어서면 학습률이 min_lr로 고정됨)
power: 다항식 감소에 사용되는 지수 (다항식의 차수)
min_lr: 최소 학습률 값
last_epoch: 마지막 에포크 번호, 기본값은 -1로 초기 설정

2. Polynomial_decay 함수

: Polynomial Learning rate decay 연산을 진행하는 함수
def polynomial_decay(self, lr): iter_cur = float(self.last_epoch) # 현재 반복(iteration)횟수 if iter_cur < self.iter_warmup: # 워밍업 기간 동안은 coef = iter_cur / self.iter_warmup coef *= (1 - self.iter_warmup / self.iter_max) ** self.power else: # 워밍업 기간 이후는 coef = (1 - iter_cur / self.iter_max) ** self.power return (lr - self.min_lr) * coef + self.min_lr # 다항식 감소 계산
Python
복사
[Polynomial Learning rate decay 연산 과정]
1.
self.last_epoch 를 실수형으로 변환하여 현재 반복 횟수 iter_cur 결정
2.
워밍업 기간 동안의 계산 정의
모델 초기화 과정에서 무작위로 높은 학습률 값을 사용하게 되면, 가중치 업데이트가 너무 커져서 모델이 불안정해질 수 있음
워밍업 기간을 통해 점진적으로 학습률을 증가시키게 되면, 학습 초기단계에서의 과적합을 방지 가능.
해당 코드에서는 워밍업 기간(warm-up period)동안
현재 반복 횟수(iter_cur)가 워밍업 기간(iter_warmup)에 도달 할 때 까지 점진적으로 coef 값을 증가.
iter_curiter_warmup\frac{iter\_cur}{iter\_warmup} (coef)값을 곱해줌
coef 값은 학습률의 증가 속도를 결정하고, 워밍업 기간이 끝나면 초기에 설정된 학습률에 도달함
lrnew=(lrmin_lr)×(iter_curiter_warmup×(1iter_warmupiter_max)power)+min_lrlr_{new} = (lr - min\_lr) \times \left( \frac{iter\_cur}{iter\_warmup} \times \left(1 - \frac{iter\_warmup}{iter\_max}\right)^{power} \right) + min\_lr
3.
워밍업 기간 이후의 계산
Polynomial Learning rate decay 수식을 사용해 각 단계마다 학습률을 감소시키고, 새로운 학습률 (lrnewlr_{new})를 계산
lrnew=(lrmin_lr)×(1iter_curiter_max)power+min_lrlr_{new} = (lr - min\_lr) \times \left(1 - \frac{iter\_cur}{iter\_max}\right)^{power} + min\_lr
현재학습률과 최소학습률 사이의 오차에 learning rate 감소율 값을 곱하는 방식으로 학습률을 감소 시킴
최소학습률 min_lrmin\_lr을 더해서 최종 학습률인 lrnew lr_{new} 결정
4.
최종 learning rate 값 반환

3. get_lr 함수

: 학습 단계에 따른 학습률 반환 함수
→ 학습 단계에 따라 polynomial_decay를 적용할 지를 결정하여 학습률 값을 반환
def get_lr(self): # 현재 에폭에서 학습률을 업데이트할지 여부를 결정 if ( (self.last_epoch == 0) #훈련이 시작된 후 첫 번째 에폭인 경우 or (self.last_epoch % self.step_size != 0) #현재 에포크가 학습률 업데이트 주기로 나누어 떨어지지 않는 경우 or (self.last_epoch > self.iter_max)#현재 에포크가 최대 반복횟수를 초과한 경우 ): # 변경 없이 현재 학습률 반환 (Polynomial Learing Rate Decay 사용X) return [group["lr"] for group in self.optimizer.param_groups] # 그 외의 단계에서는 다항식 감소를 적용한 학습률 반환 return [self.polynomial_decay(lr) for lr in self.base_lrs]
Python
복사