모두의 AI
머신러닝플레이그라운드
로딩 중…

배우기

Ch.02

최적화 알고리즘: 속도와 방향을 똑똑하게 조절하기

최적화(Optimization)는 손실 함수 L(θ)L(\theta)L(θ)를 줄이기 위해 파라미터 θ\thetaθ를 어디로, 얼마나 빠르게 움직일지 정하는 핵심 과정입니다. Ch.01에서 가중치 초기화로 출발선을 잡았다면, 이번 챕터에서는 경사(gradient)를 이용해 산 아래 최솟값으로 내려가는 속도(학습률)와 방향(모멘텀·적응형 스케일)을 똑똑하게 조절하는 방법을 다룹니다. SGD, 모멘텀, AdaGrad·RMSProp, Adam처럼 자주 쓰이는 옵티마이저의 직관과 수식, 실무에서의 선택 기준을 초보자도 따라올 수 있게 정리합니다.
손실 곡면 위에서 옵티마이저는 같은 기울기라도 다른 궤적을 그립니다. 아래는 단순화한 2차 곡면에서의 비교입니다.
loss
SGDMomentumAdam
빨강(SGD)은 초기부터 좌우로 더 크게 흔들리며 내려오고, 하강 중 지그재그가 가장 뚜렷하게 남습니다. 초록(모멘텀)은 진동을 줄이면서도 끝에서 중심에서 살짝 비켜 있고, 파랑(Adam)은 가장 빨리 골짜기 한가운데로 붙습니다.

학습 흐름: 순전파 → 손실 → 역전파 → 옵티마이저 step

모델 작동: θ←θ−η⋅(Adam 등으로 만든 스텝)\theta \leftarrow \theta - \eta \cdot(\text{Adam 등으로 만든 스텝})θ←θ−η⋅(Adam 등으로 만든 스텝)

  • ① SGD: 기울기 반대 방향으로 매 스텝 이동(노이즈 있으면 지그재그)
  • ② Momentum: 속도 vvv를 누적해 관성으로 꺾임이 완만해짐
  • ③ Adam: 좌표별 적응적 보폭으로 골짜기 형태에 맞게 스텝
  • ④ 실무: 로그·스케줄·초기화(Ch.01)와 함께 튜닝

최적화 알고리즘: 속도와 방향을 똑똑하게 조절하기

1. 경사 하강과 SGD: 손실의 기울기 반대 방향으로
개념: 경사 하강법(Gradient Descent)은 손실 LLL이 가장 가파르게 내려가는 방향, 즉 기울기 ∇L\nabla L∇L의 반대 방향으로 파라미터를 조금씩 옮깁니다.
직관: 안개 낀 산에서 발밑의 가장 가파른 경사를 따라 조심스럽게 내려가는 등산과 같습니다. 한 번에 너무 크게 내디디면(학습률 과대) 발을 헛디디거나(발산·진동) 넘어질 수 있습니다.
수학적 설명: 한 스텝은 θ←θ−η∇L(θ)\theta \leftarrow \theta - \eta \nabla L(\theta)θ←θ−η∇L(θ)입니다. η\etaη는 학습률(learning rate)으로, 한 스텝의 크기입니다. 미니배치 SGD는 전체 데이터 대신 일부 샘플로 기울기 g^\hat{g}g^​를 추정해 θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​로 갱신합니다. 기울기에 노이즈가 있어 골짜기를 빠져나가기 쉬울 때가 있습니다.
실제 적용: PyTorch의 `SGD`, TensorFlow의 `tf.keras.optimizers.SGD` 등에서 `learning_rate`와 `momentum`을 함께 조정합니다. 배치 크기·학습률은 함께 맞추는 경우가 많습니다.
2. 모멘텀과 네스테로프: 관성으로 출렁임 줄이기
개념: 모멘텀(Momentum)은 과거 기울기 방향을 속도 벡터 vvv에 누적해, 좁은 골짜기에서 좌우로만 튕기는 지그재그(zig-zag)를 완화합니다.
직관: 공이 마찰 없는 빙판 위에서 굴러가면 한 번 잡힌 방향으로 계속 미끄러듯, 과거 방향의 관성이 남습니다.
수학적 설명: 전형적으로 v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g, θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv 형태로 씁니다. β\betaβ는 관성 계수(예: 0.9)입니다. Nesterov 변형은 현재 위치가 아니라 관성으로 한 번 이동한 지점에서 기울기를 보아 예측 성격을 줍니다.
실제 적용: CNN·MLP에서 SGD 대신 SGD+momentum이 기본 후보인 경우가 많습니다. 손실 곡선이 진동하면 η\etaη를 낮추거나 β\betaβ를 조정해 봅니다.
3. 적응형 방법: 좌표마다 다른 학습률 (AdaGrad, RMSProp, Adam)
개념: 희소한 특징이나 스케일이 다른 파라미터마다 같은 η\etaη가 비효율일 수 있어, 기울기 제곱의 누적(또는 지수이동평균)으로 각 좌표의 스텝 크기를 조절합니다.
직각: 자전거의 앞브레이크·뒤브레이크를 도로 상황에 맞게 따로 조절하는 것과 비슷합니다.
수학적 설명: AdaGrad는 기울기 제곱을 누적해 오래된 차원은 스텝이 작아집니다. RMSProp은 제곱 기울기의 지수이동평균으로 누적이 무한히 커지는 문제를 완화합니다. Adam은 기울기의 1차 모멘트(모멘텀)와 2차 모멘트(RMSProp 유사)를 함께 쓰고, 초기 편향을 bias correction으로 보정합니다.
실제 적용: NLP·트랜스포머 튜닝에서 Adam이 널리 쓰이고, 비전 CNN에서는 SGD+momentum이 강한 경우도 많습니다. AdamW는 가중치 감쇠를 손실과 분리해 L2 정규화와 함께 쓰기 좋게 만든 변형입니다.
4. 무엇을 맞추면 되나: 안정성·속도·일반화
개념: 옵티마이저는 같은 손실을 줄이는 도구이지만, 수렴 속도·진동·테스트 성능은 달라질 수 있습니다.
직관: 같은 목적지라도 고속도로(Adam)와 시내 도로(SGD)처럼 느낌이 다릅니다.
수학적 설명: 학습률·배치 크기·모멘텀·감쇠(weight decay)는 서로 연동됩니다. 너무 큰 η\etaη는 LLL이 발산하거나 NaN을 만들 수 있습니다.
실제 적용: 로그로 손실·그래디언트 노름을 보며 클리핑, 워밍업, 스케줄러를 병행합니다. Ch.01 초기화·이후 챕터의 학습률 스케줄링과 함께 설계하는 것이 일반적입니다.

수식 쉽게 이해하기

SGD 한 스텝 θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​ — g^\hat{g}g^​는 미니배치로 추정한 기울기, η\etaη는 스텝 크기(학습률)입니다.
모멘텀 v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g, θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv — 과거 방향이 vvv에 쌓여 좁은 골짜기에서 좌우로만 튕기는 현상을 줄이는 데 도움이 됩니다.
Adam(개념) — 1차 모멘트(기울기의 EMA)와 2차 모멘트(기울기 제곱의 EMA)로 각 좌표의 보폭을 조절하고, 초기 몇 스텝의 편향을 bias correction으로 나눕니다.
적응형의 공통 직관 — 자주 크게 갱신되는 좌표는 보폭을 줄이고, 드문 좌표는 상대적으로 덜 줄이는 식으로 좌표별 학습률 효과를 냅니다.

왜 중요한지

수렴과 안정성
나쁜 학습률·옵티마이저 설정은 손실이 줄지 않거나 진동·발산합니다. 실무에서는 학습 시간과 GPU 비용이 바로 연결되므로, 적절한 최적화는 비용 절감과 직결됩니다.
일반화와의 관계
미니배치 노이즈·모멘텀·적응형 스텝은 학습 궤적을 바꿔, 같은 최종 손실이라도 검증 오차가 달라질 수 있습니다. 대회·제품 모델에서 옵티마이저와 하이퍼파라미터는 함께 튜닝합니다.
디버깅의 기준선
학습이 이상할 때 학습률·그래디언트 노름·옵티마이저 종류를 먼저 의심하면 원인을 빠르게 좁힐 수 있습니다. 초기화(Ch.01) 다음으로 가장 자주 만지는 부분입니다.

어떻게 쓰이는지

① PyTorch 예시
`torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)` 또는 `torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01)`처럼 선언합니다. `zero_grad()` → `backward()` → `step()` 순서를 지킵니다.
② 선택 가이드 (요약)
대규모 비전·전통적 설정: SGD + momentum을 자주 시도합니다. 트랜스포머·빠른 실험: Adam / AdamW가 편리합니다. 희소·과거 AdaGrad 논문 맥락: AdaGrad 개념을 이해한 뒤 실무에서는 Adam 계열이 더 흔합니다.
③ 모니터링
TensorBoard 등으로 손실 곡선, 그래디언트 노름, 때로는 파라미터별 학습률 효과를 봅니다. 발산 직전에는 학습률을 낮추거나 워밍업을 적용합니다.

요약

최적화는 손실 L(θ)L(\theta)L(θ)을 줄이기 위해, 역전파로 얻은 기울기 ggg를 학습률 η\etaη과 함께 스텝(step)으로 가공한 뒤 θ←θ−η⋅(스텝)\theta \leftarrow \theta - \eta\cdot(\text{스텝})θ←θ−η⋅(스텝) 형태로 파라미터를 갱신하는 과정입니다.
SGD는 미니배치로 추정한 기울기 g^\hat{g}g^​로 한 스텝을 움직이고, 모멘텀은 속도 vvv에 과거 방향을 누적해 지그재그를 줄입니다. Adam은 1차 모멘트와 2차 모멘트를 사용해 좌표별 보폭을 적응적으로 조절하며, 초기 편향은 bias correction으로 보정합니다.
개념 흐름(텍스트 도식) - `순전파 -> 손실 -> 역전파(g) -> [SGD|Mom|Adam] -> step으로 θ 갱신` -> 다음 미니배치에서는 `optimizer.zero_grad()`로 이전 기울기 누적을 비운 뒤 같은 과정을 반복합니다.
실무 팁: 손실이 진동/발산하면 먼저 η\etaη(학습률)·모멘텀·배치 크기를 함께 점검하고, 초반 안정화를 위해 warmup과 학습률 스케줄러를 함께 고려하세요(Ch.01 초기화와 짝지어 설계).

문제 풀이를 위한 설명

정리 — 한 스텝은 대개 θ←θ−η⋅(기울기를 가공한 벡터)\theta \leftarrow \theta - \eta \cdot(\text{기울기를 가공한 벡터})θ←θ−η⋅(기울기를 가공한 벡터) 형태입니다. SGD는 g^\hat{g}g^​를 쓰고, 모멘텀은 기울기를 누적한 vvv를 쓰며, Adam은 1·2차 모멘트를 보정해 적응적으로 나눕니다. 손실이 진동하면 η\etaη·모멘텀·배치 크기를 함께 봅니다.
  • 키워드SGD
  • 풀이 힌트미니배치 기울기로 한 스텝
  • 키워드모멘텀
  • 풀이 힌트vvv 누적로 지그재그 완화
  • 키워드AdaGrad
  • 풀이 힌트기울기 제곱 누적로 좌표별 스텝 축소
  • 키워드RMSProp
  • 풀이 힌트제곱 기울기의 EMA
  • 키워드Adam
  • 풀이 힌트1·2차 모멘트 + bias correction
  • 키워드학습률 과대
  • 풀이 힌트발산·NaN·진동
  • 키워드AdamW
  • 풀이 힌트weight decay를 분리한 Adam
키워드풀이 힌트
SGD미니배치 기울기로 한 스텝
모멘텀vvv 누적로 지그재그 완화
AdaGrad기울기 제곱 누적로 좌표별 스텝 축소
RMSProp제곱 기울기의 EMA
Adam1·2차 모멘트 + bias correction
학습률 과대발산·NaN·진동
AdamWweight decay를 분리한 Adam
예시 (개념) — "손실을 줄이기 위해 파라미터를 기울기의 반대 방향으로 움직이는 한 스텝" → 경사 하강의 핵심. 정답: 기울기 반대 방향.
예시 (계산) — η=2\eta=2η=2, g=3g=3g=3일 때 ηg\eta gηg의 값? → 666. 정답: 6
예시 (참/거짓) — "Adam은 항상 모든 문제에서 SGD보다 낫다" → 상황에 따라 다름. 정답: 거짓(0).
예시 (시나리오) — 손실이 진동할 때 → 학습률 낮추기·모멘텀·스케줄 점검. 정답:
①