본문 바로가기
Artificial Intelligence/21. PyTorch

[PYTORCH] SGD, Adam, AdamW 옵티마이저 선택 방법과 3가지 핵심 성능 차이 해결

by Papa Martino V 2026. 4. 4.
728x90

SGD, Adam, AdamW 옵티마이저 선택 방법
SGD, Adam, AdamW 옵티마이저 선택 방법

 

 

딥러닝 모델의 성능을 결정짓는 가장 중요한 하이퍼파라미터 중 하나는 바로 옵티마이저(Optimizer)입니다. PyTorch 환경에서 모델을 학습시킬 때, 단순히 관습적으로 Adam을 쓰거나 고전적인 SGD를 고집하는 것은 최적의 수렴 속도와 일반화 성능을 놓치는 원인이 됩니다. 본 가이드에서는 실무 개발자가 반드시 알아야 할 3대 옵티마이저(SGD, Adam, AdamW)의 내부 메커니즘과 그에 따른 선택 기준을 심도 있게 분석합니다.


1. 왜 옵티마이저 선택이 중요한가?

옵티마이저는 손실 함수(Loss Function)의 최솟값을 찾기 위해 모델의 가중치($\theta$)를 업데이트하는 엔진입니다. 업데이트 방식에 따라 모델이 로컬 미니마(Local Minima)에 갇히느냐, 아니면 전역 최적점(Global Optimum)으로 매끄럽게 수렴하느냐가 결정됩니다. 특히 2026년 현재, 대규모 언어 모델(LLM)과 고해상도 비전 모델이 주류를 이루면서 가중치 감쇠(Weight Decay)의 올바른 구현 방식인 AdamW의 중요성이 더욱 부각되고 있습니다.


2. SGD vs Adam vs AdamW 상세 비교

세 가지 옵티마이저의 핵심 차이점을 수식과 구현 관점에서 비교 정리했습니다.

항목 SGD (Momentum 포함) Adam AdamW
핵심 특징 관성(Momentum)을 이용한 방향 가속 어댑티브 학습률 + 모멘텀 결합 Adam에서 Weight Decay 로직 분리
수렴 속도 상대적으로 느림 매우 빠름 매우 빠름
일반화 성능 매우 우수 (정교한 튜닝 시) 가끔 오버피팅 발생 위험 우수 (L2 규제 최적화)
Weight Decay L2 정규화와 동일하게 작동 학습률에 의해 감쇠량이 변함 학습률과 독립적으로 고정 감쇠
주요 용도 ResNet 등 전통적 CNN 모델 빠른 프로토타이핑, 일반 모델 Transformer, BERT, LLM 필수

3. 실무 개발자를 위한 7가지 PyTorch 구현 Example

실제 프로젝트에서 상황에 맞게 옵티마이저를 적용하고 커스터마이징하는 방법입니다.

Example 1: 기본 SGD와 Momentum 적용

import torch.optim as optim

# 일반적인 CNN 학습 시 가장 안정적인 조합
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True)

Example 2: Adam 옵티마이저의 기본 사용 (빠른 수렴용)

# 하이퍼파라미터 튜닝 시간이 부족할 때 권장
optimizer = optim.Adam(model.parameters(), lr=1e-3, betas=(0.9, 0.999))

Example 3: Transformer 모델을 위한 AdamW 적용 (표준)

# Adam의 Weight Decay 결함을 해결한 현대적 표준
optimizer = optim.AdamW(model.parameters(), lr=5e-5, weight_decay=0.01)

Example 4: 레이어별 다른 학습률 적용 (Discriminative LR)

# 백본(Frozen)과 분류기(Fine-tuning)의 학습 속도를 다르게 설정
optimizer = optim.AdamW([
    {'params': model.backbone.parameters(), 'lr': 1e-6},
    {'params': model.classifier.parameters(), 'lr': 1e-4}
], weight_decay=1e-2)

Example 5: 특정 파라미터(Bias, LayerNorm) Weight Decay 제외

# 실무에서 성능 향상을 위해 자주 쓰이는 테크닉
no_decay = ['bias', 'LayerNorm.weight']
optimizer_grouped_parameters = [
    {'params': [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01},
    {'params': [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}
]
optimizer = optim.AdamW(optimizer_grouped_parameters, lr=1e-4)

Example 6: 스케줄러와 옵티마이저의 결합

# 학습이 진행됨에 따라 학습률을 점진적으로 감소
optimizer = optim.AdamW(model.parameters(), lr=1e-3)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)

Example 7: 메모리 효율을 위한 8-bit AdamW (bitsandbytes 활용)

# 대규모 모델 학습 시 GPU 메모리 절약 (외부 라이브러리 필요)
import bitsandbytes as bnb
optimizer = bnb.optim.AdamW8bit(model.parameters(), lr=1e-4)

4. 해결 방법: Adam 대신 AdamW를 써야 하는 결정적 이유

Adam의 오리지널 논문에서는 L2 정규화(Regularization)를 손실 함수에 더하는 방식으로 Weight Decay를 구현했습니다. 하지만 PyTorch의 초기 Adam 구현에서 이는 어댑티브 학습률($\sqrt{\hat{v}_t}$)에 의해 나눠지게 되어, 실제로 가중치가 감쇠되는 양이 의도와 다르게 변질되는 문제가 있었습니다.

 

해결책: AdamW는 가중치 업데이트 식에서 직접 가중치를 줄여줌으로써($\theta_{t+1} = \theta_t - \eta \cdot grad - \eta \cdot \lambda \theta_t$) 학습률과 규제 강도를 완전히 분리(Decoupled)했습니다. 이로 인해 모델의 일반화 성능(Generalization)이 비약적으로 상승하며, 최신 SOTA 모델들이 AdamW를 기본으로 채택하는 이유가 되었습니다.


5. 결론: 어떤 상황에 무엇을 쓸까?

  1. CNN 기반 컴퓨터 비전 모델: 시간이 충분하다면 SGD + Momentum을 정교하게 튜닝하는 것이 최고의 정확도를 냅니다.
  2. Transformer 및 NLP 모델: 고민할 필요 없이 AdamW를 사용하십시오.
  3. 초기 실험 및 프로토타이핑: 하이퍼파라미터에 민감하지 않은 Adam이나 AdamW로 빠르게 베이스라인을 잡는 것이 좋습니다.

 

내용 출처 및 참고 문헌:
1. Loshchilov, I., & Hutter, F. (2019). "Decoupled Weight Decay Regularization." ICLR.
2. Kingma, D. P., & Ba, J. (2015). "Adam: A Method for Stochastic Optimization." ICLR.
3. PyTorch Documentation: torch.optim module (2026 Updated).
4. Howard, J., & Gugger, S. (2020). "Deep Learning for Coders with fastai and PyTorch." O'Reilly Media.

728x90