week6: Optimizer choice
옵티마이저(Optimizer)란?
👉 쉽게 말하면, 머신러닝 모델이 더 좋은 정답을 찾도록 도와주는 알고리즘!
- 모델이 학습할 때는 손실 함수(loss function, 예: MSE, Cross-Entropy 등)를 줄이는 방향으로 가야 함
- 손실을 최소화하려면 가중치(weight)를 계속 업데이트해야 함
- 이 가중치를 "얼마나, 어떻게" 조정할지 결정하는 것이 옵티마이저의 역할!
아담(Adam)과 확률적 경사 하강법(SGD)
💡 SGD(확률적 경사 하강법, Stochastic Gradient Descent)
- 경사를 따라 한 걸음씩 내려감. (기울기 방향으로 이동)
- 하지만 데이터가 많거나, 지형이 복잡하면 진동이 심하고 최적점에 도달하기 어려움.
💡 Adam(Adaptive Moment Estimation)
- SGD의 단점을 보완한 방법!
- 이전 기울기(gradient)들의 지수 이동 평균을 활용하여 방향을 결정
즉, 단순히 현재 기울기만 보는 게 아니라, 과거의 기울기 변화도 고려해서 더 똑똑하게 움직임!
- 속도를 자동 조절해 진동을 줄이고, 빠르게 최적점에 도달할 수 있음.
📝 Adam이 하는 일
- 기울기(gradient)의 이동 평균을 저장 → 방향을 부드럽게 만듦
- 기울기의 분산(variance)도 저장 → 너무 급격한 변화를 막음
- 학습률을 자동으로 조절 → 적응형 학습률(Adaptive Learning Rate)
아담W(AdamW)와 가중치 감쇠(Weight Decay)
Adam과 AdamW의 가장 큰 차이점은 가중치 감쇠(Weight Decay)를 적용하는 방식!
💡 Weight Decay(가중치 감쇠)란?
- 쉽게 말해, 과적합을 방지하기 위해 가중치의 크기를 점점 줄이는 테크닉!
- 모델이 너무 큰 값을 가지면 오버피팅이 발생할 수 있음 → 이를 방지하기 위해 일부러 가중치를 줄여줌.
📝 Adam vs. AdamW 차이점
-
Adam은 L2 정규화 방식으로 가중치를 줄임.
-
기울기 업데이트할 때 (gradient + weight decay term)을 더함.
-
그런데 이 방식은 Adam의 업데이트 규칙과 완전히 분리되지 않아 비효율적임.
-
AdamW는 Adam에서 Weight Decay를 업데이트 과정에서 따로 적용.
-
즉, Adam의 장점(빠른 수렴 + 적응형 학습률)을 유지하면서도 더 효과적인 Weight Decay 적용.
Adafactor와 8-bit Adam (양자화 Adam)
Adafactor: 메모리 절약을 위한 Adam 대체제
💡 Adafactor는 Adam의 메모리 사용량을 줄이기 위해 개발된 옵티마이저!
- 기존 Adam은 기울기의 1차/2차 모멘트를 모두 저장해야 해서 메모리를 많이 사용함
- Adafactor는 이를 행(row)과 열(column) 단위로 요약해서 저장하여 메모리를 절반 이하로 줄일 수 있음!
- 대형 모델(GPT, T5-11B 등)에서 효과적
📝 Adafactor의 장점과 단점
- 장점: 메모리 사용량 절약 (Adam보다 절반 이상 적게 사용)
- 단점: 수렴 속도가 Adam보다 느릴 수도 있음
8-bit Adam (양자화 Adam)
💡 8-bit Adam은 기존 Adam의 모든 상태를 유지하면서도 메모리 사용을 최적화하는 방식!
- Adafactor처럼 정보를 요약하지 않고, 기존 Adam처럼 1차/2차 모멘트를 모두 저장함
- 대신 8비트(INT8)로 변환하여 저장하여 메모리를 절약
- 학습할 때는 다시 32비트(FP32)로 변환하여 계산하므로 정확도를 유지할 수 있음
📝 8-bit Adam의 장점과 단점
- 장점: Adam과 거의 동일한 성능 유지하면서도 메모리를 4배 절약 가능
- 단점: 낮은 정밀도로 인해 극단적인 경우 성능이 약간 저하될 수도 있음
요약
| 옵티마이저 | 특징 | 메모리 사용량 |
|---|
| SGD (확률적 경사 하강법) | 가장 기본적인 옵티마이저, 단순하지만 속도 느림 | ✅ 적음 |
| Adam | 과거 기울기의 이동 평균을 저장하여 빠르게 수렴 | ❌ 많음 |
| AdamW | Adam에 Weight Decay(가중치 감쇠) 추가, 더 나은 일반화 성능 | ❌ 많음 |
| Adafactor | Adam보다 메모리 절약 (모멘트를 요약 저장) | ✅ 적음 |
| 8-bit Adam | Adam의 상태를 8비트로 저장하여 메모리 절약 | ✅ 적음 |
DDP(Distributed Data Parallel)
- PyTorch에서 제공하는 데이터 병렬 학습 방식
- 여러 개의 GPU에서 같은 모델을 학습하도록 분산 처리하여 속도를 높이는 기법
📌 DDP 동작 방식
- 각 GPU(노드)는 동일한 모델과 옵티마이저를 로드하고,
- 미니배치를 GPU마다 나눠서 학습한 후,
- 각 GPU에서 계산한 기울기(gradient)를 동기화(sync)하여 업데이트!
📌 DDP의 핵심 개념:
- 모든 GPU가 같은 모델의 파라미터를 가지고 있음 (즉, 모델 복제)
- 각 GPU에서 개별적으로 forward/backward 연산 수행
- gradient를 all-reduce 방식으로 합쳐서 업데이트함 (동기화됨)
💡 DDP의 문제점
- 모델의 파라미터(Parameter), 옵티마이저 상태(Optimizer State), 활성값(Activation Value)가 각 GPU마다 중복 저장됨
- 모델이 클수록 GPU VRAM 사용량이 증가하여 학습이 어려워질 수 있음
Shared DDP(공유 DDP)
- DDP를 확장하여 GPU 간에 더 효율적인 리소스 활용을 목표로 하는 방식
- 특히 모델의 파라미터를 일부 GPU 간 공유하거나, 활성값(Activation)을 공유하여 메모리 사용량을 줄이는 기법을 의미
