본문 바로가기
Artificial Intelligence/21. PyTorch

[PYTORCH] 학습률 스케줄러(Learning Rate Scheduler) 적용 방법 7가지와 성능 차이 해결

by Papa Martino V 2026. 4. 4.
728x90

학습률 스케줄러(Learning Rate Scheduler) 적용 방법
학습률 스케줄러(Learning Rate Scheduler) 적용 방법

 

 

딥러닝 모델의 학습에서 학습률(Learning Rate)은 가중치 업데이트의 보폭을 결정하는 가장 치명적인 하이퍼파라미터입니다. 초기에 너무 큰 학습률은 발산을 초래하고, 너무 작은 학습률은 학습을 정체시킵니다. 이를 해결하기 위해 현대적인 딥러닝 아키텍처에서는 학습이 진행됨에 따라 학습률을 동적으로 조절하는 학습률 스케줄러(Learning Rate Scheduler)를 필수로 사용합니다.

본 포스팅에서는 PyTorch 환경에서 실무자가 즉시 도입할 수 있는 다양한 스케줄러의 특징과 적용 방법을 상세히 다루며, 각 전략이 모델 성능에 미치는 3가지 핵심 차이를 분석합니다.


1. 학습률 스케줄링의 필요성과 전략적 가치

학습 초기에는 손실 함수의 곡면을 빠르게 가로질러 최적점에 근접해야 하므로 큰 학습률이 유리합니다. 하지만 최적점(Global Minimum) 근처에 도달했을 때 보폭이 크면 미세한 수렴을 하지 못하고 주변을 겉도는 진동(Oscillation) 현상이 발생합니다. 스케줄러는 이를 점진적으로 줄여줌으로써 모델의 최종 정확도를 극한까지 끌어올리는 역할을 합니다.


2. 주요 학습률 스케줄러 비교 분석

실무에서 가장 빈번하게 사용되는 스케줄러들의 작동 원리와 장단점을 비교한 표입니다.

스케줄러 명칭 작동 방식 (Strategy) 장점 단점
StepLR 고정된 에포크마다 비율 감소 직관적이며 관리가 쉬움 감소 시점(Step)을 수동 설정해야 함
MultiStepLR 특정 지정 에포크 시점에서 감소 특정 구간의 성능 정체 시 효과적 학습 곡선에 대한 사전 지식 필요
ReduceLROnPlateau 성능(Metric) 정체 시 감소 검증 손실에 기반하여 매우 유연함 검증 데이터 설정 및 모니터링 필수
CosineAnnealingLR 코사인 함수 곡선을 따라 감소 매끄러운 감쇠로 일반화 성능 탁월 최소 학습률 설정이 중요함
OneCycleLR 증가 후 감소 (Cycle) 초고속 학습(Super-convergence) 가능 배치 사이즈와 스텝 계산이 복잡함

3. 실무 적용을 위한 7가지 핵심 구현 Example

개발자가 복사하여 바로 프로젝트에 적용할 수 있는 PyTorch 표준 코드 스니펫입니다.

Example 1: 단계별 학습률 감소 (StepLR)

가장 고전적인 방법으로, 30 에포크마다 학습률을 0.1배로 줄입니다.

import torch.optim as optim
from torch.optim import lr_scheduler

optimizer = optim.SGD(model.parameters(), lr=0.1)
# 30, 60, 90 에포크마다 lr = lr * 0.1
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

for epoch in range(100):
    train(...)
    scheduler.step() # 에포크 종료 후 호출

Example 2: 특정 마일스톤 기반 감소 (MultiStepLR)

# 논문에서 제시하는 특정 시점(예: 50, 80 에포크)에만 감소
scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[50, 80], gamma=0.1)

Example 3: 성능 기반 자동 조절 (ReduceLROnPlateau)

Loss가 줄어들지 않을 때 자동으로 개입하는 스마트한 방식입니다.

optimizer = optim.Adam(model.parameters(), lr=1e-3)
scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5)

for epoch in range(100):
    val_loss = validate(...)
    # 검증 손실을 기반으로 판단
    scheduler.step(val_loss)

Example 4: 코사인 감쇠 (CosineAnnealingLR)

현대적인 SOTA 모델에서 가장 권장되는 매끄러운 스케줄링입니다.

# T_max는 전체 에포크 수로 설정하는 것이 일반적
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=100, eta_min=1e-6)

Example 5: 코사인 리스타트 (CosineAnnealingWarmRestarts)

학습률을 다시 높여 로컬 미니마를 탈출하게 돕습니다.

# T_0 주기로 리스타트 발생
scheduler = lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=2)

Example 6: OneCycleLR (초고속 수렴)

최대 학습률까지 올렸다가 다시 낮추는 방식으로 학습 시간을 단축합니다.

scheduler = lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(train_loader), epochs=100)

for epoch in range(100):
    for batch in train_loader:
        train_batch(...)
        scheduler.step() # 배치가 끝날 때마다 호출 권장

Example 7: LambdaLR (커스텀 스케줄러)

사용자가 직접 정의한 함수에 따라 학습률을 조절합니다.

# 에포크가 지날수록 선형적으로 감소하는 함수
lambda_func = lambda epoch: 0.95 ** epoch
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_func)

4. 스케줄러 적용 시 발생하는 3가지 흔한 오류 해결

초보 개발자들이 자주 겪는 성능 이슈와 해결 방법입니다.

  1. Step 호출 시점 이슈: scheduler.step()은 보통 에포크 단위로 호출하지만, OneCycleLR이나 CyclicLR배치 단위로 호출해야 올바른 곡선이 나옵니다.
  2. 초기 학습률 설정: 스케줄러의 gammaoptimizer에 설정된 초기 학습률에 곱해집니다. 따라서 스케줄러를 쓸 때는 초기 lr을 평소보다 조금 높게 설정하는 것이 유리할 때가 많습니다.
  3. Warmup의 부재: 대형 모델(Transformer 등) 학습 시 초기 1,000스텝 정도는 학습률을 아주 작게 시작해 점진적으로 높이는 Warmup 과정을 거치지 않으면 수렴에 실패할 수 있습니다.

5. 요약 및 결론

학습률 스케줄러는 단순히 학습률을 낮추는 도구가 아니라, 모델의 일반화 능력을 제어하는 전략적 장치입니다. 어떤 스케줄러를 써야 할지 고민된다면 다음 우선순위를 추천합니다.

  • 가장 안정적인 선택: CosineAnnealingLR
  • 성능 최적화가 필요한 경우: ReduceLROnPlateau
  • 학습 시간을 단축하고 싶은 경우: OneCycleLR

 

내용 출처 및 참고 문헌:
1. PyTorch Documentation: torch.optim.lr_scheduler (Ver 2.6).
2. Smith, L. N. (2017). "Cyclical Learning Rates for Training Neural Networks." WACV.
3. Loshchilov, I., & Hutter, F. (2017). "SGDR: Stochastic Gradient Descent with Warm Restarts." ICLR.
4. Deep Learning Specialization (Andrew Ng, Coursera).

728x90