Python으로 배우는 AI 개념

Python으로 배우는 신경망 옵티마이저: SGD, Momentum, Adam

옵티마이저는 기울기를 가중치 업데이트로 바꾸는 규칙입니다. 기본 경사 하강법은 현재 기울기만 쓰고, Momentum은 과거의 방향을 기억하며, Adam은 가중치마다 보폭까지 조정합니다.

쉬운 말로 이해하는 개념

옵티마이저는 기울기를 가중치 업데이트로 바꾸는 규칙입니다. 기본 경사 하강법은 현재 기울기만 쓰고, Momentum은 과거의 방향을 기억하며, Adam은 가중치마다 보폭까지 조정합니다.

같은 함수를 단계별로 최소화하며 기본 경사 하강법, Momentum, Adam을 비교합니다.

핵심 아이디어

  • Momentum은 속도를 유지하므로 평평한 구간과 작은 굴곡을 굴러서 지나갑니다.
  • Adam은 기울기와 기울기 제곱의 이동 평균을 유지합니다.
  • 편향 보정(1 − βᵗ로 나누기)은 처음 몇 단계에서 그 평균값을 바로잡습니다.
  • 좋은 가중치 초기화와 미니 배치도 학습을 더 빠르고 안정적으로 만듭니다.

언제 사용하나요?

  • 신경망과 AI 라이브러리 내부에서 무슨 일이 일어나는지 이해합니다.
  • 해당 챌린지에서 직접 구현하기 전에 아이디어를 익힙니다.
  • 머신러닝 강의, 면접, 프로젝트를 준비합니다.

직접 움직여 보기

재생을 누르면 세 옵티마이저가 같은 울퉁불퉁한 골짜기를 내려가며 경주합니다. 학습률을 키우면 Momentum이 지나치는 모습을 볼 수 있습니다.

예제 코드

코드 실행 →
main.py
import math

# Minimise f(x) = (x - 3)² with three optimizers. The gradient is 2(x - 3).
grad = lambda x: 2 * (x - 3)

def sgd(steps, lr=0.1):
    x = 0.0
    for _ in range(steps):
        x -= lr * grad(x)
    return x

def momentum(steps, lr=0.1, beta=0.9):
    x, v = 0.0, 0.0
    for _ in range(steps):
        v = beta * v + grad(x)        # remember the direction we were going
        x -= lr * v
    return x

def adam(steps, lr=0.3, b1=0.9, b2=0.999, eps=1e-8):
    x, m, v = 0.0, 0.0, 0.0
    for t in range(1, steps + 1):
        g = grad(x)
        m = b1 * m + (1 - b1) * g     # running mean of gradients
        v = b2 * v + (1 - b2) * g * g # running mean of squared gradients
        m_hat, v_hat = m / (1 - b1 ** t), v / (1 - b2 ** t)
        x -= lr * m_hat / (math.sqrt(v_hat) + eps)
    return x

for steps in (5, 20, 50):
    print(f"{steps:>2} steps  sgd={sgd(steps):.3f}  momentum={momentum(steps):.3f}  adam={adam(steps):.3f}")

예상 출력

5 steps  sgd=2.017  momentum=4.741  adam=1.476
20 steps  sgd=2.965  momentum=4.048  adam=3.813
50 steps  sgd=3.000  momentum=3.091  adam=3.014

작동 원리

셋 모두 (x − 3)²를 최소화하며, 가장 낮은 점은 x = 3입니다. SGD는 꾸준히 이동하고, Momentum은 속도가 붙어 지나쳤다가 자리를 잡으며, Adam은 기울기와 그 제곱의 이동 평균으로 각 걸음을 조절합니다. 50단계 후에는 셋 모두 3에 가까워집니다.

값을 변경하고 Python 설치 없이 CodeUtility 온라인 Python 컴파일러에서 실행하세요.

연습 문제

입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.

  1. 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
  2. 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
  3. 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
Python IDE에서 실행 →

챌린지로 연습하기

이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.

모든 챌린지