Adam Optimizer
Adam은 모멘텀과 최근 그래디언트 크기에 따라 조정되는 매개변수별 스텝 크기를 결합합니다. 업데이트 규칙, 기본값, AdamW, Adam과 SGD의 비교를 다룹니다.
Adam 옵티마이저는 Adaptive Moment Estimation의 약칭으로, 모든 파라미터에 개별 적응형 스텝 크기를 적용하는 최적화 알고리즘이며 신경망 학습에 사용됩니다. Kingma와 Ba가 Adam: 확률적 최적화 방법에서 소개한 Adam은 과거 그래디언트와 제곱값의 이동 평균을 활용해 확률적 경사 하강법(SGD)을 확장합니다. 초기 학습이 빠르고 기본 설정을 그대로 사용하기 쉬워 Adam은 딥러닝에서 가장 흔한 시작 옵티마이저가 되었으며, AdamW 변형은 Transformer와 대규모 언어 모델 학습의 표준 선택입니다.
Adam의 작동 방식#
학습은 각 가중치를 해당 그래디언트에 따라 반복적으로 업데이트하여 손실 함수를 최소화합니다. 일반 SGD는 모든 그래디언트에 동일한 학습률을 적용합니다. Adam은 파라미터마다 추가 값 두 개를 유지하고, 각 스텝에서 현재 그래디언트 t를 사용해 이를 업데이트합니다 g.
- 1차 모멘트(모멘텀):
m = β1·m + (1 − β1)·g은 그래디언트의 지수 감쇠 평균으로, 업데이트가 일관된 방향으로 진행되도록 합니다. - 2차 모멘트:
v = β2·v + (1 − β2)·g²은 제곱 그래디언트의 감쇠 평균으로, 각 파라미터의 일반적인 그래디언트 크기를 추적합니다. - 편향 보정:
m̂ = m / (1 − β1^t)및v̂ = v / (1 − β2^t)은 두 평균이 모두 0에서 시작하는 문제를 보정합니다. - 업데이트:
θ = θ − lr · m̂ / (√v̂ + ε).
논문에서 제시한 기본값은 PyTorch의 torch.optim.Adam에서도 사용하며, lr = 0.001, β1 = 0.9, β2 = 0.999, ε = 1e-8입니다. √v̂으로 나누면 각 스텝이 파라미터의 일반적인 그래디언트 크기에 따라 정규화되므로, 그래디언트가 아주 작거나 커도 스텝 크기는 학습률과 비슷하게 유지됩니다. 또한 m̂ 안에서 양의 그래디언트와 음의 그래디언트가 상쇄되는 잡음이 많은 방향에서는 스텝 크기가 줄어듭니다. 아래 코드는 그래디언트 크기가 1,000배 차이 나는 두 파라미터에서 SGD와 Adam의 첫 번째 스텝을 비교합니다.
import torch
# Two parameters whose gradients differ in scale by 1,000x
scale = torch.tensor([1000.0, 1.0])
for name, optimizer_cls in [("SGD", torch.optim.SGD), ("Adam", torch.optim.Adam)]:
w = torch.zeros(2, requires_grad=True)
optimizer = optimizer_cls([w], lr=0.001)
loss = (scale * w).sum() # gradient is [1000, 1]
loss.backward()
optimizer.step()
print(f"{name} first step: {[round(v, 4) for v in w.tolist()]}")SGD는 첫 번째 파라미터를 -1.0으로, 두 번째 파라미터를 -0.001로 이동시킵니다. 그래디언트를 따르므로 1,000배 차이가 납니다. Adam은 정규화된 스텝이 그래디언트의 원시 크기가 아니라 방향과 일관성에 좌우되므로 두 파라미터를 모두 학습률과 정확히 같은 -0.001만큼 이동시킵니다.
Adam과 AdamW 비교#
일반적인 Adam 구현은 정규화의 한 형태인 가중치 감쇠를 그래디언트에 L2 패널티로 더합니다. 이 패널티도 다른 항목과 함께 √v̂로 나누므로, 그래디언트가 큰 가중치에는 정규화가 거의 적용되지 않습니다. Loshchilov와 Hutter의 분리형 가중치 감쇠는 적응형 업데이트와 별도로 각 스텝에서 가중치를 직접 줄여 이 문제를 해결합니다. 그 결과 탄생한 AdamW는 논문 실험에서 이미지 분류 일반화 성능을 Adam보다 향상했으며 torch.optim.AdamW로 사용할 수 있습니다.
Adam과 SGD 비교#
모멘텀을 적용한 SGD는 전역 학습률 하나를 사용하고 파라미터마다 버퍼 하나를 저장합니다. 반면 Adam은 버퍼 두 개를 저장하며, 32비트 정밀도에서 파라미터당 8바이트가 필요합니다. 따라서 파라미터 70억 개 모델에서는 옵티마이저 상태에 56GB가 사용됩니다. Adam은 일반적으로 초기에 더 빠르게 진전하고 학습률에 덜 민감하며, Transformer를 SGD보다 훨씬 안정적으로 학습합니다. 잘 조정된 SGD는 합성곱 이미지 모델에서 같거나 더 높은 최종 정확도에 도달하는 경우가 많습니다. 또한 Wilson 등은 자신들이 실험한 이미지 분류 및 언어 작업에서 적응형 방법이 SGD보다 일반화 성능이 낮은 경우가 많다는 사실을 발견했습니다.
Ultralytics YOLO 학습에는 이러한 절충점이 반영되어 있습니다. 기본값인 optimizer="auto"은 클래스 수에 맞춰 초기 학습률을 설정한 AdamW를 선택해 최대 10,000회 반복 학습을 수행하고, 더 긴 스케줄에서는 SGD와 Muon의 하이브리드인 MuSGD로 전환합니다. 옵티마이저를 명시적으로 설정할 때는 학습률도 설정해야 합니다. 기본 lr0=0.01는 SGD에 적합하며 일반적인 Adam 학습률보다 10배 높기 때문입니다.
from ultralytics import YOLO
# 사전 학습된 YOLO26n 모델을 불러옵니다
model = YOLO("yolo26n.pt")
# AdamW와 Adam에 적합한 초기 학습률로 학습합니다.
results = model.train(data="coco8.yaml", epochs=5, optimizer="AdamW", lr0=0.001)YOLO26이 Adam 계열 옵티마이저로 학습할 때 momentum 인수(기본값 0.937)는 β1를 설정하며, β2은 0.999로 고정됩니다.
Adam과 관련 옵티마이저 비교#
- AdaGrad: 과거 모든 제곱 그래디언트의 제곱근으로 각 스텝을 나누므로 스텝 크기가 계속 줄어듭니다. 희소 특징에 적합하지만 학습이 길어지면 속도가 느려집니다.
- RMSProp: AdaGrad의 누적 합을 제곱 그래디언트의 지수 감쇠 평균으로 대체합니다. Adam은 기본적으로 RMSProp에 모멘텀과 편향 보정을 더한 방식입니다.
- Muon: 은닉층의 2D 가중치 행렬을 위한 옵티마이저입니다. Newton–Schulz 반복을 사용해 각 모멘텀 업데이트를 직교화하고, 파라미터마다 Adam 옵티마이저 상태의 절반에 해당하는 상태 버퍼 하나만 유지합니다.










