PyTorch의 **optim.lr_scheduler.ReduceLROnPlateau**는 학습 중에 **손실 함수가 개선되지 않을 때 학습률(learning rate)**을 줄이는 데 사용되는 스케줄러입니다. 학습률이 낮아지면 모델이 손실 함수의 국소 최적점 근처에서 더 안정적으로 수렴할 수 있습니다.
주요 특징
- 손실 기반: 다른 스케줄러들이 에폭이나 스텝에 따라 학습률을 조정하는 것과 달리, ReduceLROnPlateau는 특정 **지표(metric)**의 변화 여부에 따라 학습률을 줄입니다.
- 유연성: 손실이 아니라 정확도, F1 점수 등 다른 지표를 기준으로 설정할 수도 있습니다.
- 적응적: 훈련 상태에 따라 학습률을 동적으로 조정합니다.
사용 방법
1. 스케줄러 생성
ReduceLROnPlateau는 torch.optim의 옵티마이저와 함께 사용됩니다.
python
코드 복사
from torch.optim.lr_scheduler import ReduceLROnPlateau scheduler = ReduceLROnPlateau( optimizer, mode='min', # 'min': 손실 감소를 목표로 함, 'max': 정확도 등 증가를 목표로 함 factor=0.1, # 학습률을 줄이는 비율 (e.g., 10%로 감소) patience=10, # 지정한 에폭 동안 개선되지 않으면 학습률 감소 verbose=True, # 학습률 조정 시 로그 출력 threshold=1e-4, # 개선 여부를 판단하는 임계값 cooldown=0, # 학습률 감소 후 대기 기간 (초기 감소 방지) min_lr=0, # 학습률의 최저값 )
2. 학습 루프에서 호출
훈련 중 손실 값이나 평가 지표를 기반으로 scheduler.step(metrics)을 호출하여 스케줄러를 업데이트합니다.
python
코드 복사
for epoch in range(num_epochs): train_loss = train_model(model, train_loader, optimizer) val_loss = validate_model(model, val_loader) # 손실 기반으로 스케줄러 업데이트 scheduler.step(val_loss) print(f"Epoch {epoch+1}, Learning Rate: {optimizer.param_groups[0]['lr']}")
주요 매개변수 설명
- mode:
- 'min': 지표의 감소를 목표로 합니다 (e.g., 손실 값).
- 'max': 지표의 증가를 목표로 합니다 (e.g., 정확도).
- factor:
- 학습률을 감소시키는 비율입니다. 기본값은 0.1로, 학습률이 감소 시 기존의 10%로 설정됩니다.
- 예: 초기 학습률이 0.01이고 factor=0.1이라면 감소 후 학습률은 0.001이 됩니다.
- patience:
- 지표가 개선되지 않을 때 기다리는 에폭 수입니다.
- 예: patience=10이면, 지표가 10 에폭 동안 개선되지 않으면 학습률을 감소시킵니다.
- verbose:
- True로 설정하면 학습률이 줄어들 때 메시지를 출력합니다.
- threshold:
- 지표가 개선되었다고 간주할 최소 변화량입니다. 기본값은 1e-4.
- cooldown:
- 학습률이 감소한 후 다시 감소하기 전에 대기하는 에폭 수입니다.
- min_lr:
- 학습률의 최소값을 설정합니다. 이 값 이하로는 학습률이 줄어들지 않습니다.
예제
옵티마이저와 함께 사용
python
코드 복사
import torch import torch.nn as nn import torch.optim as optim model = nn.Linear(10, 1) optimizer = optim.SGD(model.parameters(), lr=0.01) # ReduceLROnPlateau 스케줄러 정의 scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5, verbose=True) # 학습 루프 for epoch in range(20): val_loss = 0.02 * (20 - epoch) if epoch < 10 else 0.02 # 손실 값 시뮬레이션 # 스케줄러에 손실 값 전달 scheduler.step(val_loss) print(f"Epoch {epoch+1}, LR: {optimizer.param_groups[0]['lr']}")
출력 예제:
vbnet
코드 복사
Epoch 6: reducing learning rate of group 0 to 5.0000e-03. Epoch 12: reducing learning rate of group 0 to 2.5000e-03.
장점
- 학습률을 동적으로 조정해 과적합을 방지하고 최적화를 개선할 수 있습니다.
- 학습이 정체되는 구간에서 모델이 더 세밀하게 최적화를 수행하도록 도와줍니다.
- 손실 외에도 다양한 지표에 적용 가능.
주의사항
- 지표 설정: scheduler.step(metrics)에서 전달하는 metrics는 스케줄러가 학습률 감소 여부를 판단하는 기준입니다.
- 초기 학습률 확인: 초기 학습률이 너무 낮으면 학습이 비효율적일 수 있습니다.
- 조합 사용: 다른 스케줄러(StepLR, CosineAnnealingLR)와 함께 사용할 수도 있지만, 충돌 가능성을 염두에 두고 설정해야 합니다.
이처럼 ReduceLROnPlateau는 학습 과정에서 유용한 도구로, 학습률을 효율적으로 조정하여 모델 성능을 높이는 데 기여할 수 있습니다!
반응형
'Python, PySpark' 카테고리의 다른 글
torch.nn.Embedding() (0) | 2025.01.04 |
---|---|
NewsClassifier (0) | 2025.01.04 |
networkx - sql과 함께 (0) | 2024.10.24 |
Python networkx (1) | 2024.10.10 |
how to visualize the customer page visit pattern on app? (0) | 2024.09.21 |