🤖 AI/ML

Adam

Adaptive Moment Estimation

가장 널리 사용되는 최적화 알고리즘. 학습률을 적응적으로 조정. SGD의 개선.

📖 상세 설명

Adam(Adaptive Moment Estimation)은 딥러닝에서 가장 널리 사용되는 경사 하강 최적화 알고리즘입니다. Momentum의 이점(관성을 이용한 빠른 수렴)과 RMSprop의 이점(학습률 자동 조정)을 결합하여, 대부분의 문제에서 별도의 튜닝 없이도 안정적인 학습을 제공합니다.

2014년 Diederik Kingma와 Jimmy Ba가 ICLR 논문 "Adam: A Method for Stochastic Optimization"에서 제안했습니다. 발표 이후 빠르게 표준 옵티마이저로 자리잡았으며, 현재까지 12만 회 이상 인용되어 딥러닝 역사상 가장 영향력 있는 논문 중 하나가 되었습니다.

Adam은 두 가지 이동 평균을 유지합니다. 첫 번째 모멘트(m)는 기울기의 평균으로 Momentum 역할을 하고, 두 번째 모멘트(v)는 기울기 제곱의 평균으로 RMSprop처럼 학습률을 스케일링합니다. 초기 편향 보정(bias correction)을 통해 학습 초기의 불안정성도 해결합니다.

기본 하이퍼파라미터(lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8)가 대부분의 경우에 잘 작동합니다. Transformer 학습에는 AdamW(Weight Decay 분리), 대규모 언어 모델에는 8-bit Adam이나 Adafactor가 사용됩니다. SGD+Momentum이 최종 성능에서 더 나을 수 있지만, Adam은 튜닝 없이 빠르게 수렴하여 프로토타이핑에 최적입니다.

💻 코드 예제

import torch
import torch.nn as nn
import torch.optim as optim

# 간단한 모델 정의
model = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Linear(256, 10)
)

# Adam 옵티마이저 설정 (기본값이 대부분 최적)
optimizer = optim.Adam(
    model.parameters(),
    lr=0.001,        # 학습률 (기본값 권장)
    betas=(0.9, 0.999),  # 모멘텀 계수
    eps=1e-8,        # 0으로 나누기 방지
    weight_decay=0   # L2 정규화 (AdamW 권장)
)

# AdamW 사용 (Weight Decay를 올바르게 처리)
optimizer_w = optim.AdamW(
    model.parameters(),
    lr=0.001,
    weight_decay=0.01  # Transformer에서 일반적으로 0.01~0.1
)

# 학습 루프 예시
criterion = nn.CrossEntropyLoss()
for epoch in range(10):
    for batch_x, batch_y in dataloader:
        optimizer.zero_grad()        # 기울기 초기화
        outputs = model(batch_x)
        loss = criterion(outputs, batch_y)
        loss.backward()              # 기울기 계산
        optimizer.step()             # 파라미터 업데이트

# 학습률 스케줄러와 함께 사용
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
# 매 에폭 후: scheduler.step()

print(f"현재 학습률: {optimizer.param_groups[0]['lr']}")

🗣️ 실무 대화 예시

📊 모델 학습 디버깅 회의에서

"Loss가 발산하고 있으면 Adam 학습률을 0.001에서 0.0001로 낮춰보세요. 그래도 안 되면 gradient clipping을 추가하고, Transformer라면 AdamW로 바꿔서 weight decay를 0.01로 설정해보세요."

💼 기술 면접에서

"Adam과 SGD의 차이를 설명해주세요. Adam은 적응적 학습률로 빠르게 수렴하지만, 일부 연구에서는 SGD+Momentum이 일반화 성능에서 더 나은 결과를 보여줍니다. 그래서 프로덕션에서는 SGD로 fine-tuning하기도 합니다."

🔍 코드 리뷰에서

"BERT fine-tuning인데 Adam 대신 AdamW 써야 합니다. Adam에서 weight_decay는 L2 정규화로 구현되어 있어서 Adam의 적응적 학습률과 충돌해요. AdamW는 이 문제를 해결했습니다."

⚠️ 주의사항

⚖️
Adam vs AdamW 혼동

정규화가 필요한 경우 반드시 AdamW를 사용하세요. Adam의 weight_decay 파라미터는 L2 정규화로 구현되어 Adam의 적응적 학습률과 간섭합니다. Transformer 모델에서는 특히 중요합니다.

📉
일반화 성능 저하 가능성

Adam은 빠르게 수렴하지만 sharp minima에 빠질 수 있습니다. 최종 성능이 중요하다면 Adam으로 빠르게 학습 후 SGD+Momentum으로 fine-tuning하는 것을 고려하세요.

💾
메모리 사용량 증가

Adam은 각 파라미터마다 두 개의 상태(m, v)를 저장하므로 SGD 대비 메모리가 3배 필요합니다. 대규모 모델에서는 8-bit Adam이나 Adafactor를 고려하세요.

🔗 관련 용어

📚 더 배우기