Optimization Algorithm
최적화 알고리즘은 학습 중 손실을 최소화하도록 모델의 가중치를 업데이트합니다. 경사 하강법, 모멘텀, Adam, AdamW, Muon 및 코드를 다룹니다.
최적화 알고리즘 또는 옵티마이저는 학습 프로세스가 손실 함수를 감소시키도록 모델의 파라미터를 변경하는 규칙입니다. 딥러닝에서 옵티마이저는 역전파를 통해 모든 모델 가중치에 대한 손실의 그래디언트를 받고, 각 가중치를 얼마나 어느 방향으로 이동할지 결정합니다. 옵티마이저는 학습률과 함께 학습 수렴 속도와 안정성, 필요한 메모리 양, 그리고 최종 모델의 일반화 성능을 좌우하는 경우가 많습니다.
옵티마이저 작동 방식#
거의 모든 딥러닝 옵티마이저는 경사 하강법의 변형입니다. 미니배치에서 손실의 그래디언트 g를 계산한 다음, 가중치를 그 반대 방향으로 작은 단계만큼 이동합니다(w ← w − η·g). 옵티마이저는 업데이트 전에 g를 처리하는 방식이 다릅니다. 모멘텀 방식은 시간에 따라 그래디언트를 평균 내어 일관된 방향으로 속도를 높입니다. 적응형 방식은 각 파라미터의 업데이트 크기를 그래디언트 크기의 이동 추정값으로 나눕니다. Muon은 각 가중치 행렬 전체의 업데이트를 직교화합니다. 2차 방법은 곡률도 사용하므로 각 단계의 정보를 개선하지만 계산 비용이 훨씬 큽니다. 진화 알고리즘과 무작위 탐색처럼 그래디언트가 전혀 필요 없는 방법은 후보를 시도하고 가장 좋은 후보를 선택해 최적화합니다:
손실 표면의 조건이 나빠 일부 방향에서는 급격히 휘고 다른 방향에서는 완만하게 휘는 경우, 업데이트 규칙이 가장 중요합니다. 같은 시작점에서 좁은 골짜기 안의 세 옵티마이저를 실행하면 차이가 드러납니다:
import torch
# A long, narrow valley: f(w) = w1^2 + 50 * w2^2, with its minimum at (0, 0)
scale = torch.tensor([1.0, 50.0])
optimizers = {
"SGD": lambda p: torch.optim.SGD(p, lr=0.015),
"SGD + momentum": lambda p: torch.optim.SGD(p, lr=0.015, momentum=0.9),
"Adam": lambda p: torch.optim.Adam(p, lr=0.1),
}
for name, make_optimizer in optimizers.items():
w = torch.tensor([5.0, 1.0], requires_grad=True)
optimizer = make_optimizer([w])
# Same loss and starting point for every optimizer; only the update rule differs
for step in range(100):
loss = (scale * w**2).sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"{name:15s} f(w) after 100 steps: {(scale * w**2).sum().item():.6f}")기본 SGD는 0.056531에서 멈춥니다. 가파른 w2 방향이 학습률의 상한을 결정하기 때문입니다. 학습률이 0.02를 넘으면 매 단계마다 w2의 오버슈팅이 더 커지며, 0.021에서는 100단계 이내에 손실이 약 95억까지 증가합니다. 이러한 상한에서는 완만한 w1 방향의 진전이 느립니다. 모멘텀은 w1 방향의 속도를 높여 0.000216에 도달하고, Adam은 각 좌표에 개별 업데이트 크기를 부여해 0.001953에 도달합니다.
일반적인 최적화 알고리즘#
- 확률적 경사 하강법(SGD): 미니배치 그래디언트의 반대 방향으로 업데이트합니다. 모멘텀 0.9를 사용하면 대표적인 합성곱 네트워크 대부분을 학습할 수 있으며, 파라미터마다 추가 값 하나를 저장합니다.
- AdaGrad 및 RMSProp: 각 파라미터의 업데이트 크기를 제곱 그래디언트 이력에 따라 조정합니다. AdaGrad는 계속 증가하는 이동 합의 제곱근으로 나누므로 학습이 진행될수록 업데이트 크기가 줄어듭니다. RMSProp은 대신 지수 감쇠 평균을 사용하여 업데이트 크기가 상황에 맞게 반응하도록 합니다.
- Adam: 모멘텀과 RMSProp 방식의 스케일 조정을 결합하고, 0에서 시작하는 두 이동 평균을 보정합니다. 학습률 0.001, β1 = 0.9, β2 = 0.999라는 기본값은 다양한 문제에서 잘 작동합니다.
- AdamW: 분리된 가중치 감쇠를 적용한 Adam으로, 적응형 그래디언트 스케일링을 거치지 않고 가중치를 직접 축소합니다. 트랜스포머와 대규모 언어 모델(LLM)의 표준 옵티마이저입니다.
- Muon: Newton–Schulz 반복을 사용해 각 2D 가중치 행렬의 모멘텀 업데이트를 직교화하고, 파라미터마다 상태 버퍼 하나를 유지합니다. Moonshot AI는 이를 LLM 사전 학습에 적용할 수 있도록 확장했습니다.
- L-BFGS: 최근 그래디언트에서 곡률 추정치를 구성하는 준뉴턴 방법입니다. 매끄러운 전체 배치 문제에서는 적은 단계로 수렴하지만, 미니배치 그래디언트의 노이즈 때문에 대규모 네트워크에는 적합하지 않습니다.
PyTorch의 옵티마이저 패키지는 torch.optim.Muon을 비롯한 모든 옵티마이저를 구현하며, 이들과 함께 사용할 수 있는 학습률 스케줄러도 제공합니다.
옵티마이저와 관련 용어 비교#
- 손실 함수: 옵티마이저가 최소화하는 목적 함수로, 분류의 교차 엔트로피나 회귀의 평균 제곱 오차 등이 있습니다.
- 학습률 스케줄러: 어떤 옵티마이저를 사용하든 워밍업, 단계별 감소 또는 코사인 어닐링으로 학습 중 업데이트 크기 η를 조정합니다.
- 하이퍼파라미터 튜닝: 옵티마이저, 학습률, 배치 크기 등의 설정을 대상으로 외부 탐색을 수행하며, 각 후보는 전체 또는 일부 학습 실행 비용이 듭니다. 검증 점수는 옵티마이저와 같은 선택 항목에 대해 미분할 수 없으므로, 베이지안 최적화와 진화 탐색 같은 그래디언트 비사용 방법이 이 작업을 수행합니다.
옵티마이저 선택#
옵티마이저와 학습률은 함께 선택합니다. 각 옵티마이저가 자체적으로 적절한 범위를 가지기 때문입니다. 모멘텀을 사용하는 SGD는 보통 0.01~0.1에서 시작하고, Adam 계열 옵티마이저는 약 0.001에서 시작합니다. Ultralytics YOLO 학습은 이 선택을 자동으로 수행합니다. 기본 optimizer="auto"은 lr0을 무시하고, 최대 10,000회 반복하는 실행에는 클래스 수에 맞춘 학습률의 AdamW를 선택하며, 더 긴 스케줄에는 출시된 YOLO26 체크포인트 학습에 사용된 SGD와 Muon의 하이브리드인 MuSGD를 선택합니다. 옵티마이저 이름을 지정하면 lr0이 적용됩니다:
from ultralytics import YOLO
# 사전 학습된 YOLO26n 모델을 불러옵니다
model = YOLO("yolo26n.pt")
# # SGD를 명시적으로 선택합니다. optimizer가 "auto"가 아닐 때만 lr0이 적용됩니다.
results = model.train(data="coco8.yaml", epochs=5, optimizer="SGD", lr0=0.01)optimizer="SGD"을 사용하면 트레이너는 Nesterov 모멘텀도 활성화하며, 기본값이 0.937인 momentum 인수를 계수로 사용합니다.










