안녕하세요, MoonLight입니다.
이번 Post에서는 Learning Rate를 효율적으로 변경하여 학습이 잘 이루어지도록 도와주는 Learning Rate Scheduler에 대해서 알아보도록 하겠습니다.

1. Learning Rate
1.1. Learning Rate ?
딥러닝에서 모델을 학습할 때 가장 중요한 하이퍼파라미터 중 하나가 학습률(Learning Rate, LR)입니다.
Learning Rate는 모델이 데이터를 학습하는 과정에서 가중치(Weight)와 편향(Bias)을 얼마나 빠르게 업데이트할지를 결정하는 값입니다.
쉽게 말해, Learning Rate은 우리가 경사 하강법(Gradient Descent)을 이용해 최적의 Weight를 찾아가는 과정에서 한 번의 업데이트마다 이동하는 거리를 의미합니다.
Learning Rate는 모델의 학습 성능과 수렴 속도에 직접적인 영향을 미치는 가장 중요한 하이퍼파라미터 중 하나입니다.
적절한 Learning Rate를 설정하지 않으면 모델이 제대로 학습되지 않거나, 학습 시간이 너무 길어질 수 있습니다.
1.2. 적절한 Learning Rate의 중요성
예를 들어, 우리가 어떤 미로에서 출구를 찾는다고 가정해 봅시다.
너무 큰 걸음으로 이동하면(Learning Rate가 너무 크면) 출구를 지나쳐서 엉뚱한 곳으로 가버릴 가능성이 큽니다.
너무 작은 걸음으로 이동하면(Learning Rate가 너무 작으면) 출구를 향해 가긴 하지만 너무 느려서 시간이 오래 걸립니다.
이처럼 Learning Rate은 너무 크거나 너무 작으면 학습이 잘 되지 않기 때문에, 적절한 Learning Rate를 설정하는 것이 매우 중요합니다.
즉, 미로에서 출구를 찾는다는 것은 모델 훈련에서 가장 적절한 Weight & Bias를 찾는 것과 동일한 의미입니다.
Learning Rate가 너무 크면, 모델이 최적의 가중치를 찾지 못하고 오히려 불안정하게 진동하거나 발산할 가능성이 크며, 이는 모델이 학습되지 않고 오히려 성능이 나빠질 수 있습니다.
반대로, Learning Rate가 너무 작으면 경사 하강법이 한 번에 너무 작은 거리만 이동하기 때문에 학습이 매우 느려질 수 있습니다.
최적의 지점을 향해 가긴 하지만, 속도가 너무 느려서 현실적으로 학습을 끝마치는 데 오랜 시간이 걸리는 문제가 발생할 수 있습니다.
2. Learning Rate Scheduler
앞서 Learning Rate이 너무 크거나 작으면 학습이 잘 이루어지지 않는다는 것을 살펴보았습니다.
그렇다면 처음부터 적절한 Learning Rate를 잘 설정하면 될까요?
사실 학습이 진행되는 동안에도 최적의 Learning Rate는 계속 변할 수 있기 때문에, 고정된 Learning Rate를 사용하는 것은 한계가 있습니다.
이를 해결하기 위해 등장한 개념이 바로 Learning Rate Scheduler입니다.
2.1. Learning Rate Scheduler의 개념과 역할
Learning Rate Scheduler(LR Scheduler)란, 학습이 진행됨에 따라 Learning Rate를 점진적으로 변경하는 기법입니다.
딥러닝 모델이 Learning Rate를 자동으로 조정할 수 있도록 하여, 더 효과적인 최적화를 가능하게 하도록 하는 것이죠.
Learning Rate Scheduler는 주로 학습 초기에는 Learning Rate 값을 크게 하여 빠르게 수렴하도록 하고, 학습이 진행될수록 Learning Rate를 조금씩 줄여 미세 조정을 수행하는 방식으로 진행됩니다.
필요할 경우 특정 이벤트(예: Validation Loss가 줄어들지 않을 때) 발생 시 Learning Rate를 동적으로 조정할 수도 있습니다.
이러한 다양한 이벤트를 이용하는 기법을 적용하면 모델의 학습 속도를 높이면서도, 최적화가 안정적으로 진행되도록 조정할 수 있습니다.
3. PyTorch의 Learning Rate Scheduler
PyTorch에서는 매우 다양한 종류의 Learning Rate Scheduler를 제공합니다.
각 Learning Rate Scheduler가 어떤 특징이 있고, 어떻게 사용하는지 하나씩 알아보도록 하겠습니다.
3.1. StepLR
StepLR은 가장 기본적인 Learning Rate Scheduler 중 하나로, 일정한 Epoch(step_size)마다 Learning Rate를 일정 비율(gamma)로 감소시키는 방식으로 작동되도록 구현되어 있습니다.
즉, 학습이 특정 횟수만큼 진행될 때마다 Learning Rate를 일정하게 낮추어 점진적인 학습 속도 조절을 가능하게 합니다.
3.1.1. 동작 방식
StepLR의 핵심 개념은 먼저 초기 Learning Rate를 설정하고, Train이 진행되면서 Epoch이 증가해서 step_size가 되면 Learning Rate를 gamma 비율로 감소하도록 하여 미세한 조정이 가능하도록 합니다.

3.1.2. Example Code
# 모델, 옵티마이저 및 손실 함수 정의
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.1) # 초기 Learning Rate 0.1
scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.5) # 5 Epoch마다 Learning Rate를 50% 감소
위의 Scheduler는 5 Epoch마다 Learning Rate를 50% 감소됩니다.
3.1.3. 단점
StepLR은 단순한 방식이라 효과적인 경우도 많지만, 몇 가지 단점도 존재합니다.
1. 고정된 step_size 사용으로 인해 유연성이 부족함
특정 상황(예: 학습이 빠르게 수렴하거나, 손실이 급격히 변할 때)에서는 Learning Rate를 더 동적으로 조정해야 할 수도 있지만, StepLR은 그렇게 할 수 없습니다.
2. 잘못된 step_size 설정 시 학습 성능 저하 가능
step_size가 너무 크면 Learning Rate이 충분히 감소하지 않아 학습이 불안정할 수 있고, 반대로 step_size가 너무 작으면 불필요하게 자주 감소하여 학습이 느려질 수 있다는 단점이 있습니다.
3.2. MultiStepLR
MultiStepLR은 StepLR의 확장된 형태로, 일정한 간격(step_size)마다 Learning Rate를 감소시키는 StepLR과 달리 사용자가 지정한 특정 Epoch에서만 Learning Rate를 감소시키는 방식입니다.
즉, Learning Rate를 감소시키고 싶은 시점을 직접 설정할 수 있기 때문에 더 정밀한 Learning Rate 조정이 가능합니다.
3.2.1. 동작 방식
MultiStepLR의 핵심 개념은 사용자가 Learning Rate를 줄일 특정 Epoch를 직접 지정하고 Train이 시작되어 해당 Epoch에 도달하면 Learning Rate를 특정 비율(gamma)로 감소시킵니다.
이후 지정된 Epoch가 될 때마다 Learning Rate가 다시 감소하는 동작을 반복하게 됩니다.

여기서 n은 현재까지 지나온 milestone(지정된 Epoch) 개수입니다.
3.2.2. Example Code
# 모델, 옵티마이저 및 손실 함수 정의
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.1) # 초기 Learning Rate 0.1
scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[10, 20, 30], gamma=0.5)
# 10, 20, 30 Epoch에서 Learning Rate를 절반으로 감소
위와 같이 MultiStepLR Scheduler를 설정하면 10, 20, 30 Epoch에서 Learning Rate를 절반으로 감소하게 됩니다.
3.2.3. 단점
MultiStepLR도 StepLR의 변형이어서 StepLR과 유사한 단점이 있습니다.
적절한 Epoch를 직접 정해야 하므로, 모델마다 다른 최적값을 찾아야 하며, 학습 중 손실이 예측과 다르게 변화할 경우 유연하게 조정되지 않는다는 단점이 있습니다.
3.3. ExponentialLR
ExponentialLR은 학습이 진행될수록 Learning Rate를 지수적으로 감소시키는 방식입니다.
즉, Learning Rate가 매 Epoch(혹은 Step)마다 일정한 비율로 줄어들어, 점진적으로 더 작은 Learning Rate로 변화하게 됩니다.
3.3.1. 동작 방식
ExponentialLR은 다음과 같은 수식을 따릅니다.

· lr : 현재 Learning Rate
· γ : 감소 비율 (0 < gamma < 1)
· t : 현재 Epoch 또는 스텝 (scheduler.step()이 호출된 횟수)
즉, 매 Epoch마다 Learning Rate이 지수적으로 감소하기 때문에, 초반에는 빠르게 학습하다가 점점 더 느리게 최적화를 진행하는 방식입니다.
3.3.2. 사용하는 이유
ExponentialLR은 학습이 진행됨에 따라 점진적으로 Learning Rate를 줄이고 싶을 때 유용합니다.
1) Learning Rate를 조금씩 감소시키면서 안정적인 최적화를 원할 때
특정 Epoch에서 갑자기 Learning Rate가 감소하는 StepLR/MultiStepLR과 달리, 부드럽게 Learning Rate를 감소시키고 싶을 때 적합합니다.
2) 모델이 빠르게 수렴해야 하지만, 후반부에서는 미세 조정이 필요할 때
초반에는 학습 속도를 높이고, 후반에는 작은 Learning Rate로 안정적인 수렴을 유도해야 하는 경우 사용할 수 있습니다.
3) 훈련이 길어질수록 과적합을 방지하고 싶을 때
모델이 지나치게 훈련 데이터에 과적합되는 것을 막고, 일반화 성능을 높일 수 있습니다.
3.3.3. Example Code
# 모델, 옵티마이저 및 손실 함수 정의
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.1) # 초기 Learning Rate 0.1
# 매 Epoch마다 Learning Rate를 90%로 감소
scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
위 ExponentialLR Scheduler는 매 Epoch마다 Learning Rate를 90%로 감소시키는 동작을 합니다.
3.3.4. 단점
1. Learning Rate가 너무 빠르게 줄어들 수 있음
gamma 값을 잘못 설정하면 Learning Rate이 너무 빨리 0에 가까워져 학습이 아예 안되는 경우가 발생할 수 있습니다.
그래서 일반적으로 gamma는 0.9~0.99 사이로 설정하는 것이 적절합니다.
2. Learning Rate 조정이 특정 이벤트와 연계되지 않음
예를 들어, Validation Loss가 줄어들지 않는 경우 Learning Rate를 줄이는 ReduceLROnPlateau와 달리, 무조건 Learning Rate를 줄이므로 비효율적일 수도 있습니다.
3.4. ReduceLROnPlateau
ReduceLROnPlateau는 지금까지 살펴본 StepLR, MultiStepLR, ExponentialLR과는 다르게, Learning Rate를 감소시키는 시점이 사전에 정해져 있지 않고, 특정 기준(예: 검증 손실(Validation Loss)이 줄어들지 않는 경우)을 충족하면 Learning Rate를 자동으로 조정하는 방식입니다.
3.4.1. 동작 방식
ReduceLROnPlateau는 다음과 같은 방식으로 동작합니다.
1. 특정 모니터링 값(예: validation loss)을 기준으로 Learning Rate를 조정하도록 설정
2. 해당 값이 patience Epoch 동안 개선되지 않으면 Learning Rate를 감소
3. Learning Rate를 일정 비율(factor)로 줄이고, 다시 개선 여부를 확인
4. 최적화가 더 이상 진행되지 않을 경우 Learning Rate를 계속 감소시켜 모델이 미세 조정을 할 수 있도록 유도
주요 하이퍼파라미터
· mode : "min" 또는 "max" 설정 가능
"min" → 모니터링하는 값이 줄어들지 않으면 Learning Rate 감소 (예: Validation Loss)
"max" → 모니터링하는 값이 증가하지 않으면 Learning Rate 감소 (예: Accuracy)
· factor : Learning Rate를 감소시키는 비율 (기본값 0.1, 즉 10%로 감소)
· patience : Learning Rate를 감소시키기 전에 기다리는 Epoch 수 (기본값 10)
· threshold : 변화량이 이 값보다 작으면 개선되지 않은 것으로 간주 (기본값 1e-4)
· cooldown : Learning Rate 감소 후 다시 감시를 시작하기 전 대기할 Epoch 수 (기본값 0)
· min_lr : Learning Rate이 너무 작아지는 것을 방지하는 최소값
3.4.2. 사용하는 이유
ReduceLROnPlateau는 다음과 같은 상황에서 효과적입니다.
1. Validation Loss가 감소하지 않을 때 Learning Rate를 줄이고 싶을 때
모델이 학습하는 동안 손실이 줄어들지 않으면 Learning Rate를 낮춰 더 세밀한 학습을 수행할 수 있습니다.
2. 고정된 스케줄 없이 유연하게 Learning Rate를 조정하고 싶을 때
StepLR이나 MultiStepLR처럼 정해진 Epoch에서 Learning Rate를 줄이는 방식은 비효율적일 수도 있습니다. 왜냐하면 실제 모델의 훈련의 진행 상황을 모니터링하지 않고 단순히 시간이 지남에 따라 일정 비율로 Learning Rate를 변경하기 때문입니다.
반면에, ReduceLROnPlateau는 실제 학습 상황에 따라 동적으로 Learning Rate를 조절할 수 있어서 훨씬 유연한 Learning Rate 조절을 가능하게 해줍니다.
3. 과적합을 방지하고 최적의 Learning Rate를 유지하고 싶을 때
Validation Loss가 더 이상 줄어들지 않는다면 불필요한 과적합을 막기 위해 Learning Rate를 낮추는 것이 효과적인 경우에 유리합니다.
3.4.3. Example Code
# 모델, 옵티마이저 및 손실 함수 정의
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.1) # 초기 Learning Rate 0.1
# factor=0.5, patience=5이므로 Validation Loss가 5 Epoch 동안 개선되지 않으면 Learning Rate이 절반으로 감소합니다.
scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode="min", factor=0.5, patience=5, verbose=True)
위 ReduceLROnPlateau Scheduler는 Validation Loss가 5 Epoch 동안 개선되지 않으면 Learning Rate이 절반으로 감소합니다.
참고로, mode="min"을 선택하면 Validation Loss가 감소하지 않을 때 학습률이 줄어듭니다.
예를 들면, 모델의 Validation Loss가 일정 기간 동안 개선되지 않으면 학습률을 낮추는 경우에 사용할 수 있죠.
반면에, mode="max"를 선택하면 Accuracy가 증가하지 않을 때 학습률이 줄어듭니다.
즉, Validation Accuracy가 일정 기간 동안 증가하지 않으면 학습률을 낮추게 됩니다.
3.4.4. 단점
1. 모니터링하는 값이 적절해야 함
Validation Loss가 아니라 Training Loss를 기준으로 하면 오히려 잘못된 조정이 발생할 수도 있습니다.
2. patience 설정이 중요함
너무 작으면 불필요하게 자주 Learning Rate를 낮출 수도 있고, 너무 크면 Learning Rate를 줄이지 않아 학습이 멈출 수도 있기 때문에 적절한 patience 값 설정이 중요합니다.
3.5. CosineAnnealingLR
CosineAnnealingLR은 Learning Rate를 코사인 함수 형태로 점진적으로 감소시키는 방식, 즉, Learning Rate가 학습 초반에는 천천히 감소하다가, 후반으로 갈수록 급격히 줄어드는 패턴을 따릅니다.
3.5.1. 동작 방식
CosineAnnealingLR은 Learning Rate를 다음과 같은 공식을 따라 변화시킵니다.

· Tcur : 현재 epoch
· Tmax : Learning Rate이 최저점에 도달하는 최대 epoch
· lrmin : 최소 Learning Rate
· lrmax : 최대 Learning Rate
이 공식에 따르면, Learning Rate가 처음에는 천천히 감소하다가 점점 더 빠르게 감소하는 패턴을 보입니다.
특히, 학습이 진행됨에 따라 점진적으로 Learning Rate이 작아지므로 빠른 수렴과 안정적인 최적화가 가능합니다.
3.5.2. 사용하는 이유
1. 자연스럽게 Learning Rate를 줄이며 최적화를 수행하고 싶을 때
StepLR처럼 급격히 Learning Rate를 낮추는 것보다 부드럽게 감소하는 것이 더 효과적인 경우에 사용할 수 있습니다.
2. 초반에는 빠르게 탐색하고, 후반에는 미세 조정을 원할 때
코사인 함수의 특성상 초반에는 Learning Rate이 비교적 크게 유지되지만, 후반에는 급격히 줄어들기 때문에 이런 동작이 가능합니다.
3.5.3. Example Code
# 모델, 옵티마이저 및 손실 함수 정의
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.1) # 초기 Learning Rate 0.1
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=20, eta_min=0.01)
위와 같은 CosineAnnealingLR Scheduler는 20 Epoch 동안 Learning Rate가 코사인 함수 형태로 감소하며 최소 Learning Rate가 0.01이 되면 다시 초기값(0.1)으로 리셋되는 형태를 따릅니다.
3.5.4. 단점
1. 주기(T_max)를 잘못 설정하면 Learning Rate 조정이 비효율적일 수 있음
Tmax가 너무 크면 Learning Rate이 줄어드는 속도가 느려지고, Tmax가 너무 작으면 Learning Rate이 너무 빨리 줄어 학습이 제대로 되지 않을 수도 있습니다.
2. 다른 방식들보다 직관적으로 조절하기 어려움
StepLR처럼 단순한 감소가 아니라, 코사인 함수 형태로 변화하므로 설정값을 조정하는 데 실험이 필요합니다.
3.6. CyclicLR
CyclicLR은 Learning Rate를 일정한 범위 내에서 주기적으로 증가 및 감소시키는 방식입니다.
즉, Learning Rate를 점진적으로 줄여가는 일반적인 스케줄러들과 달리, CyclicLR은 Learning Rate를 올렸다 내리는 사이클을 반복하며 최적화를 진행합니다.
이 방식은 지역 최소점(local minimum)에 갇히는 문제를 방지하고, 더 좋은 최적점을 탐색하는 데 유리합니다.
3.6.1. 동작 방식
CyclicLR은 Learning Rate를 최소값(eta_min)과 최대값(eta_max) 사이에서 주기적으로 변화시킵니다.
이 주기는 step_size_up과 step_size_down라는 Parameter로 조절됩니다.

주요 하이퍼파라미터
· base_lr : Learning Rate의 최소값
· max_lr : Learning Rate의 최대값
· step_size_up : Learning Rate이 최소값 → 최대값으로 증가하는 데 걸리는 스텝 수
· step_size_down : Learning Rate이 최대값 → 최소값으로 감소하는 데 걸리는 스텝 수
· mode
"triangular": 기본적인 삼각형 형태 변화
"triangular2": 점진적으로 진폭을 줄여가는 방식
"exp_range": 지수적으로 변화하는 방식
3.6.2. 사용하는 이유
CyclicLR은 다음과 같은 상황에서 효과적입니다.
1. 지역 최소점(local minimum)에 갇히는 것을 방지하고 싶을 때
Learning Rate이 고정되거나 지속적으로 감소하면, 비효율적인 최적화가 발생할 수 있어서 주기적으로 Learning Rate를 올리면 새로운 최적점을 탐색하는 효과를 가집니다.
2. Learning Rate를 계속 줄이기보다 변동을 주면서 더 나은 학습을 유도하고 싶을 때
일반적으로 Learning Rate이 계속 감소하면 최적화가 느려질 수 있는데, CyclicLR은 학습 속도를 유지하면서도 안정적인 최적화를 수행할 수 있습니다.
3. 훈련이 짧거나 데이터가 적을 때 빠르게 수렴하고 싶을 때
3.6.3. Example Code
# 모델, 옵티마이저 및 손실 함수 정의
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.01) # 초기 Learning Rate 0.01
scheduler = lr_scheduler.CyclicLR(optimizer, base_lr=0.001, max_lr=0.1, step_size_up=5, mode="triangular")
위와 같은 CyclicLR Scheduler는 5 Epoch 동안 Learning Rate이 증가한 후, 다시 5 Epoch 동안 감소하는 패턴을 반복합니다.
3.6.4. 단점
1. Learning Rate이 반복적으로 증가/감소하기 때문에 학습이 진행될수록 Learning Rate를 줄이는 일반적인 방식과 달리, 주기적인 변화를 주기 때문에 모든 상황에서 최적은 아닐 수 있음
2. step_size가 너무 크면 변화가 느려지고, 너무 작으면 학습이 불안정할 수 있기 때문에 적절한 step_size 설정이 중요합니다.
3.7. OneCycleLR
OneCycleLR은 CyclicLR과 유사하지만, 단 한 번의 사이클(One Cycle) 동안 Learning Rate를 증가했다가 감소시키는 방식입니다.
즉, 학습 초반에는 Learning Rate를 증가시키며 빠르게 학습하고, 후반부에서는 Learning Rate를 감소시켜 안정적인 수렴을 유도한다는 차이점이 있죠.
OneCycleLR은 특히 SGD 기반 모델에서 학습 속도를 높이고, 최적화 성능을 개선하는 데 효과적이라고 알려져 있습니다.
3.7.1. 동작 방식
OneCycleLR은 하나의 학습 주기 동안 Learning Rate를 변화시키며, 보통 다음과 같은 패턴을 따릅니다.
1. 학습 초반 Learning Rate를 증가 → 모델이 빠르게 최적점을 찾아가도록 유도
2. 학습 중반 이후 Learning Rate를 서서히 감소 → 안정적인 수렴을 위해 학습 속도를 줄임
3. 학습 마지막 단계 초기 Learning Rate보다 훨씬 작은 값으로 감소 → 최적화된 지점에서 미세 조정 수행
주요 하이퍼파라미터
· max_lr : Learning Rate이 증가할 때 도달하는 최대값
· total_steps : 전체 학습 스텝 수 (명시적으로 지정하지 않으면 자동 계산)
· epochs : 학습할 전체 Epoch 수
· pct_start : Learning Rate 증가 비율 (예: 0.3이면 30% 동안 증가, 이후 감소)
· anneal_strategy : "cos" (Cosine) 또는 "linear" (선형 감소)
· div_factor : 초기 Learning Rate를 max_lr / div_factor로 설정 (예: div_factor=25이면 초기 Learning Rate은 max_lr / 25)
· final_div_factor : 최종 Learning Rate를 initial_lr / final_div_factor로 설정 (예: final_div_factor=10000이면 최종 Learning Rate은 초기 Learning Rate의 1/10000)
3.7.2. 사용하는 이유
OneCycleLR은 다음과 같은 경우에 효과적입니다.
1. 짧은 학습 시간 내에 빠르게 수렴하고 싶을 때
기존 Learning Rate 스케줄러보다 빠르게 학습하면서도 높은 성능을 유지하고자 하는 경우에 사용합니다.
2. SGD 기반 최적화를 더 효율적으로 수행하고 싶을 때
OneCycleLR은 특히 SGD + Momentum과 함께 사용할 때 뛰어난 성능을 발휘한다고 알려져 있습니다.
3.8. LambdaLR
LambdaLR은 사용자가 직접 정의한 함수에 따라 Learning Rate를 조정하는 방식입니다.
즉, 다른 Scheduler들이 사전에 정해진 규칙(예: StepLR, CosineAnnealingLR 등)을 따르는 것과 달리, LambdaLR은 사용자가 원하는 형태의 Learning Rate 변화를 직접 설계할 수 있습니다.
이 기능을 사용하면 특정한 Learning Rate 스케줄링이 필요한 경우, 기존의 Scheduler가 지원하지 않는 방식으로 Learning Rate를 조절할 수 있습니다.
3.8.1. 동작 방식
LambdaLR은 사용자가 정의한 Lambda 함수를 기반으로 Learning Rate를 조정합니다.
즉, 현재 Epoch이나 Step을 입력으로 받아, 특정한 규칙에 따라 Learning Rate를 조절하는 함수를 생성하면 됩니다.
3.8.2. 기본 구조
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=my_lambda_function)
여기서 my_lambda_function은 사용자 정의 함수로, 현재 Epoch이나 Step을 입력으로 받아 Learning Rate를 조절하는 역할을 합니다.
3.8.3. Example Code
import torch
import torch.nn as nn
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
# 간단한 신경망 모델 정의
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
# 모델, 옵티마이저 및 손실 함수 정의
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.1) # 초기 학습률 0.1
# 사용자 정의 학습률 스케줄러 (선형 감소 방식)
def linear_decay(epoch):
total_epochs = 30
return 1.0 - (epoch / total_epochs)
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=linear_decay)
# 학습 루프
for epoch in range(30):
optimizer.zero_grad()
# 임의의 학습 데이터
dummy_input = torch.randn(32, 10)
dummy_target = torch.randn(32, 1)
output = model(dummy_input)
loss = ((output - dummy_target) ** 2).mean() # MSE 손실 계산
loss.backward()
optimizer.step()
# 학습률 스케줄러 업데이트
scheduler.step()
# 현재 학습률 출력
current_lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch+1}, Learning Rate: {current_lr:.6f}, Loss: {loss.item():.4f}")
위의 Code는 매 Epoch마다 1/30만큼 Learning Rate를 Linear하게 줄여나가는 Learning Rate Scheduler를 LambdaLR로 구현한 것입니다.
먼저 Optimizer를 정의하면서, 초기 Learning Rate를 설정합니다.
이 Example Code에서는 0.1로 설정합니다.
optimizer = optim.SGD(model.parameters(), lr=0.1) # 초기 Learning Rate 0.1
다음에는 Learning Rate Scheduler가 호출될 때 마다 실행될 Lambda 함수를 정의합니다.
이 함수는 Parameter로 Epoch값이 넘어옵니다.
# 사용자 정의 학습률 스케줄러 (선형 감소 방식)
def linear_decay(epoch):
total_epochs = 30
return 1.0 - (epoch / total_epochs)
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=linear_decay)
이 Lambda 함수는 Epoch마다 1/30만큼 Learning Rate를 Linear하게 줄여나가는 Scheduler입니다.
실제로 이 Lambda 함수는 scheduler.step()가 호출될 때 마다 Call됩니다.
# Learning Rate 스케줄러 업데이트
scheduler.step()
Lambda 함수의 Paramter인 epoch는 lr_scheduler 내부에서 관리됩니다.
즉, Train Loop의 제어변수인 'epoch'을 사용하는 것이 아니라, lr_scheduler 내부 변수를 통해서 전달됩니다.
내부 변수인 epoch은 scheduler.step()이 호출될 때마다 1씩 증가하게 되고, step()이 호출되면 내부 변수 epoch이 전달되는 것이죠.
epoch을 알고 자기만의 Scheduler를 정의할 수 있다는 것은 매우 큰 자율성을 줍니다.
아래와 같은 다양한 Scheduler를 정의할 수 있습니다.
def warmup_and_decay(epoch):
if epoch < 5:
return epoch / 5 # 처음 5 Epoch 동안 Learning Rate 증가
return 0.5 ** (epoch - 5) # 이후 지수적으로 감소
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=warmup_and_decay)
위와 같은 Scheduler는 Epoch이 5이하인 경우에는 크게 증가시켰다가 6이후에는 지수적으로 조금씩 감소하는 방식으로 작동하게 됩니다.
def stepwise_decay(epoch):
if epoch < 10:
return 1.0
elif epoch < 20:
return 0.5
else:
return 0.1 # 20번째 Epoch 이후 Learning Rate 급격히 감소
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=stepwise_decay)
이 Scheduler는 epoch이 10이하이면 1, 10에서 20까지는 0.5, 그 이후에는 0.1씩 감소하게 작동하게 됩니다.
이처럼 LambdaLR은 Learning Rate를 특정한 패턴으로 조정해야 할 때 매우 유용하게 사용할 수 있습니다.
3.8.4. 단점
1) 다른 Scheduler처럼 간단한 설정이 아니라, 적절한 함수를 직접 설계해야 하기 때문에 설정이 다소 복잡할 수 있습니다.
2) Learning Rate를 너무 복잡하게 조정하면 최적화 과정이 불안정해질 수도 있습니다.
3.9 Scheduler 요약
|
스케줄러
|
학습률 조정 방식
|
장점
|
단점
|
|
StepLR
|
일정 간격으로 감소
|
간단하고 효과적
|
유연성이 부족
|
|
MultiStepLR
|
특정 Epoch에서 감소
|
milestone을 자유롭게 설정 가능
|
적절한 milestone 설정이 필요
|
|
ExponentialLR
|
매 스텝마다 감소
|
부드러운 감소
|
학습률이 너무 빨리 감소 가능
|
|
ReduceLROnPlateau
|
Validation Loss 기준 감소
|
학습 성능에 맞춰 동적 조정
|
threshold 설정이 중요
|
|
CosineAnnealingLR
|
코사인 형태로 감소
|
자연스러운 학습률 변화
|
T_max 설정이 중요
|
|
CyclicLR
|
학습률을 반복적으로 증가/감소
|
최적화가 어려운 문제 해결
|
최적화 보장이 어려움
|
|
OneCycleLR
|
한 번의 주기 내에서 증가 후 감소
|
짧은 학습에도 효과적
|
적절한 max_lr 설정이 필요
|
|
LambdaLR
|
사용자 정의
|
학습률 조정 매우 유연한 조정 가능
|
직접 함수 작성 필요
|
더욱 다양한 PyTorch 강의를 보시려면 아래 강의 목록을 읽어보시면 도움이 됩니다.
1. PyTorch 소개
https://moonlight314.tistory.com/entry/1-PyTorch-%EC%86%8C%EA%B0%9C
1. PyTorch 소개
안녕하세요, MoonLight입니다.Deep Learning Framework의 양대산맥이라고 하면 Tensorflow와 PyTorch일 것입니다.예전에는 다양한 Framework이 많이 있었지만, 이제는 거의 이 2개가 대부분을 차지한다고 할
moonlight314.tistory.com
2. PyTorch의 주요 Module 소개
2. PyTorch의 주요 Module 소개
안녕하세요, MoonLight입니다.이번 Post에서는 PyTorch를 구성하는 다양한 Module에 대해서 소개해 드리고자 합니다.Model을 설계하고 Train 시키는데 매우 다양한 기능이 필요한 것은 어찌보면 당
moonlight314.tistory.com
3. Tensor
https://moonlight314.tistory.com/entry/3-Tensor
3. Tensor
안녕하세요, MoonLight입니다.이번 Post에서는 Deep Learning에서 Data를 표현하기 위한 자료구조인 Tensor에 대해서 알아보도록 하겠습니다.1. Tensor1.1 Tensor의 개념Tensor는 겉으로 보기에 숫자로
moonlight314.tistory.com
4. Basic Train Loop
https://moonlight314.tistory.com/entry/4-Basic-Train-Loop
4. Basic Train Loop
안녕하세요, MoonLight입니다.이번 글에서는 PyTorch를 이용한 기본적인 Train Loop를 분석하고, 각 구성 요소가 하는 역할을 상세히 설명합니다. 이를 통해 신경망 모델을 학습하는 과정에서 필요
moonlight314.tistory.com
5. Dataset & DataLoader
https://moonlight314.tistory.com/entry/5-Dataset-DataLoader
5. Dataset & DataLoader
안녕하세요, MoonLigt입니다.이번 Post에서는 Train Data를 효율적으로 가공하고 Model에 공급(?)해 주는 역할을 하는 Dataset & DataLoader Module에 대해서 알아보도록 하겠습니다.1. Dataset & DataLoader
moonlight314.tistory.com
6. 신경망 구성 - Container Class
6. 신경망 구성 - Container Class
안녕하세요, MoonLight입니다.이번 장에서는 신경망을 구성하는 기본 개념과, PyTorch에서 제공하는 다양한 Container Class를 활용하여 신경망을 구축하는 방법에 대해 알아보겠습니다.1. Model
moonlight314.tistory.com
7. Loss Function( 손실 함수 )
https://moonlight314.tistory.com/entry/7-Loss-Function-%EC%86%90%EC%8B%A4-%ED%95%A8%EC%88%98
7. Loss Function( 손실 함수 )
안녕하세요, MoonLight입니다.이번 Post에서는 모델이 학습을 잘하고 있는지 정량적으로 표현할 수 있게 해주는 손실함수(Loss Function)에 대해서 알아보도록 하겠습니다.1. Loss Function1.1. Loss F
moonlight314.tistory.com
8. Optimizers
https://moonlight314.tistory.com/entry/8-Optimizers
8. Optimizers
안녕하세요, MoonLight입니다.이번 장에서는 딥러닝 모델의 Train을 하는데 있어서 중요한 요소중의 하나인, Optimizer에 대해서 알아보도록 하겠습니다.1. Optimization in Deep Learning1.1. Optimizati
moonlight314.tistory.com
9. Learning Rate Schedulers
https://moonlight314.tistory.com/entry/9-Learning-Rate-Schedulers
9. Learning Rate Schedulers
안녕하세요, MoonLight입니다.이번 Post에서는 Learning Rate를 효율적으로 변경하여 학습이 잘 이루어지도록 도와주는 Learning Rate Scheduler에 대해서 알아보도록 하겠습니다.1. Learning Rate1
moonlight314.tistory.com
10. Early Stopping
https://moonlight314.tistory.com/entry/10-Early-Stopping
10. Early Stopping
안녕하세요, MoonLight입니다.이번 Post에서는 모델의 학습을 적절한 시점에 마무리 할 수 있도록 해주는 Early Stopping이라는 개념과 구현에 대해서 알아보도록 하겠습니다.1. Early Stopping1.1. E
moonlight314.tistory.com
'PyTorch' 카테고리의 다른 글
| 2. PyTorch의 주요 Module 소개 (0) | 2025.03.04 |
|---|---|
| 10. Early Stopping (0) | 2025.03.03 |
| 8. Optimizers (0) | 2025.03.03 |
| 7. Loss Function( 손실 함수 ) (0) | 2025.03.03 |
| 6. 신경망 구성 - Container Class (0) | 2025.03.03 |