Learning Rate
학습률은 학습 중 모든 가중치 업데이트의 크기를 조정합니다. 값이 너무 높으면 발산하고 너무 낮으면 학습이 정체되는 이유와 워밍업, 감쇠 스케줄, 튜닝을 다룹니다.
학습률은 각 학습 단계에서 모델 가중치가 얼마나 크게 변할지를 정하는 하이퍼파라미터입니다. 경사 하강법은 손실 함수의 그래디언트를 계산합니다. 그래디언트는 손실이 가장 빠르게 증가하는 방향을 가리키며, 각 가중치는 w ← w − η × gradient에 따라 업데이트됩니다. 여기서 η(에타)는 학습률입니다. 스텝 크기도 같은 의미이며, 코드에서는 보통 lr라고 부릅니다. 적절한 학습률을 설정하면 신경망이 좋은 해로 빠르게 수렴하며, 잘못 설정하면 학습이 발산하거나 매우 느려집니다. 따라서 Leslie Smith의 순환 학습률 논문은 이를 조정해야 할 가장 중요한 하이퍼파라미터라고 설명하며, 특히 딥 네트워크에서 중요합니다.
너무 높거나 낮은 경우와 적정 수준#
학습률은 속도와 안정성 사이의 균형을 조절합니다.
- 너무 높음: 각 단계에서 최소값을 지나칩니다. 손실이 진동하거나 급등하거나 증가하다가 NaN이 되며, 학습이 발산합니다.
- 너무 낮음: 각 단계에서 가중치가 거의 변하지 않습니다. 손실이 천천히 감소하고, 수렴에 훨씬 많은 에폭이 필요하며, 고정된 예산으로 실행하면 과소적합 상태로 끝납니다.
- 적절한 수준: 손실이 꾸준히 감소하고 최소값 근처에서 안정됩니다.
아래 PyTorch 스크립트는 동일한 시작점에서 네 가지 학습률을 사용해 w² 손실을 최소화합니다.
import torch
# Minimize loss = w**2 (lowest at w = 0) from the same start with four learning rates
for lr in (0.01, 0.1, 0.9, 1.1):
w = torch.tensor(5.0, requires_grad=True)
optimizer = torch.optim.SGD([w], lr=lr)
path = []
for step in range(20):
optimizer.zero_grad()
loss = w**2
loss.backward()
optimizer.step() # w = w - lr * gradient
path.append(w.item())
print(f"lr={lr}: first steps {[round(v, 2) for v in path[:3]]}, after 20 steps w={path[-1]:.3f}")0.01에서는 20단계 동안 가중치가 5에서 3.338로 조금만 줄어들며, 0.1에서는 0.058에 도달합니다. 0.9에서는 매 단계 부호가 바뀌지만(−4.0, 3.2, −2.56) 그래도 0.058로 수렴합니다. 반면 1.1에서는 단계마다 더 크게 지나쳐 가중치가 191.688까지 증가합니다. 이차 함수에 대한 경사 하강법은 학습률이 손실 곡률, 즉 이계 도함수를 2로 나눈 값보다 작을 때만 안정적으로 유지됩니다. w²의 곡률은 2이므로 이 경우 한계는 정확히 1.0이며, 학습률이 0.5이면 한 단계 만에 최소값에 도달합니다. 실제 네트워크에서는 손실의 가장 가파른 방향이 같은 종류의 한계를 결정합니다. 따라서 한 모델이나 배치 크기에서 효과적인 학습률이 다른 경우에는 발산할 수 있습니다.
학습률 스케줄#
학습에서는 처음부터 끝까지 동일한 학습률을 사용하는 경우가 드뭅니다. 스케줄을 통해 학습률을 시간에 따라 변경합니다.
- 워밍업: 낮은 학습률에서 시작해 처음 몇 에폭 또는 반복 단계에 걸쳐 점진적으로 높입니다. 이렇게 하면 초기 반복에서 발생하는 크고 불규칙한 그래디언트가 학습을 불안정하게 만드는 것을 방지할 수 있습니다.
- 단계적 감소: 지정된 에폭에서 또는 검증 손실이 정체될 때 고정된 배율(흔히 10)로 학습률을 나눕니다.
- 선형 및 코사인 감소: 학습률을 작은 최종값까지 부드럽게 낮춥니다. 코사인 어닐링은 코사인 파형의 절반을 따르며, 웜 리스타트 변형은 새로운 주기가 시작될 때 학습률을 높은 값으로 되돌립니다.
- 주기적 및 원사이클 정책: 학습 중 학습률을 하한과 상한 사이에서 변경합니다.
초기에 큰 단계로 가중치를 좋은 영역 쪽으로 빠르게 이동시키고, 후반에 작은 단계로 최소점 주변에서 튀지 않고 안정되도록 합니다. YOLO26 Ultralytics의 학습은 lr0에서 시작해 warmup_epochs 동안 워밍업한 뒤(기본값 3), lr0 * lrf까지 선형으로 감소시키거나 cos_lr=True를 사용해 코사인 곡선을 따라 감소시킵니다. 기본 optimizer="auto" 설정에서는 트레이너가 옵티마이저와 초기 학습률을 모두 직접 선택합니다. 10,000회 반복보다 긴 실행에는 0.01의 MuSGD를, 그 외에는 클래스 수에 맞춰 조정된 학습률의 AdamW를 사용하므로 lr0은 옵티마이저를 명시적으로 설정한 경우에만 적용됩니다:
from ultralytics import YOLO
# 사전 학습된 YOLO26 nano 모델을 불러옵니다
model = YOLO("yolo26n.pt")
# 명시적으로 지정한 옵티마이저는 lr0를 적용하며, 학습률은 코사인 곡선을 따라 lr0 * lrf까지 감소합니다.
results = model.train(data="coco8.yaml", epochs=10, optimizer="SGD", lr0=0.01, lrf=0.01, cos_lr=True)초기값 선택#
일반적인 시작값은 모멘텀을 사용하는 확률적 경사 하강법(SGD)의 경우 0.01~0.1이고, Adam 옵티마이저의 경우 Adam 논문에서 기본값으로 제안한 0.001입니다. 사전 학습된 모델을 파인 튜닝할 때는 처음부터 학습할 때보다 더 낮은 학습률을 사용합니다. 큰 단계는 전이 학습이 가능하도록 하는 특징을 덮어쓸 수 있기 때문입니다.
같은 주기적 학습률 논문의 학습률 범위 테스트를 fastai의 학습률 탐색기로 패키징한 도구를 사용하면 짧은 실행 한 번으로 적절한 값을 찾을 수 있습니다. 이 도구는 손실을 기록하면서 미니 배치마다 학습률을 높입니다. 유용한 범위는 손실이 가장 빠르게 감소하다가 폭발하기 시작하기 전까지입니다.
학습률과 관련 용어 비교#
- 최적화 알고리즘: 학습률을 사용하는 업데이트 규칙입니다. Adam과 같은 적응형 옵티마이저는 각 가중치의 단계 크기를 해당 가중치의 그래디언트 이력에 따라 조정하지만, 모든 단계에 여전히 하나의 전역 학습률을 곱합니다.
- 모멘텀: 이전 업데이트의 일부를 현재 업데이트에 더하는 별도의 하이퍼파라미터입니다. 이를 통해 이동 경로를 평활화하고 일관된 방향의 유효 단계 크기를 높입니다.
- 가중치 감쇠: 매 단계마다 가중치 자체를 0에 가깝게 줄이는 정규화 항입니다. 학습률 감쇠는 시간이 지남에 따라 단계 크기를 줄입니다.
- 배치 크기: 각 그래디언트의 평균을 계산하는 데 사용하는 샘플 수입니다. 배치가 클수록 그래디언트 노이즈가 줄어 더 큰 학습률을 사용할 수 있습니다. 선형 스케일링 규칙은 배치 크기가 k배 커지면 학습률에도 k를 곱합니다.










