SGD base

SGD (Stochastic Gradient Descent)를 간단하게 파이썬으로 구현해 본다.

Stochastic Gradient Descent (SGD, 확률적 경사 하강법)는 전체 데이터를 한꺼번에 계산하지 않는다.
 **매 단계에서 무작위로 선택된 하나의 데이터(또는 소규모 배치)**에 대해서만 기울기를 계산하여 가중치를 업데이트하는 방식이다.

가장 직관적인 예시인 선형 회귀(y_hat = wx + b) 문제를 해결하는 코드를 작성해 보자.

import numpy as np

# 가상 데이터 (y = 2x + 1 관계)
x = np.array([1, 2, 3, 4])
y = np.array([3, 5, 7, 9])

rate = 0.01
w = 1.0
b = 1.0

for epoch in range(1000):
    for x_i, y_i in zip(x, y):
        # 1. 순전파 (Forward): 예측값 계산
        y_hat = x_i * w + b
       
        # 2. 오차 계산
        err = y_hat - y_i

        # 3. 역전파 & 업데이트 (Backward & Update)
        w = w - rate * err * x_i
        b = b - rate * err 

    if epoch % 200 == 0:
        print(f"Epoch {epoch}: w={w:.3f}, b={b:.3f}")

print(f"\n최종 결과: y = {w:.2f}x + {b:.2f}")


결과)
Epoch 0: w=1.270, b=1.092
Epoch 200: w=1.970, b=1.091
Epoch 400: w=1.991, b=1.027
Epoch 600: w=1.997, b=1.008
Epoch 800: w=1.999, b=1.002

최종 결과: y = 2.00x + 1.00


  • 손실 함수 𝐽(𝑤,𝑏)는 예측과 실제 값의 차이를 측정
  • 미분을 통해 𝑤,𝑏에 대한 기울기(gradient)를 구함
  • 경사하강법으로 손실을 줄이는 방향으로 𝑤,𝑏를 업데이트

역전파에서 미분(Gradient 계산)

경사하강법에서는 𝑤, 𝑏를 업데이트하기 위해 손실 함수를 각각에 대해 미분한다.


파라미터 업데이트 규칙

경사하강법은 다음과 같이 파라미터를 갱신한다.



ChainRule을 사용하여 미분 해보겠습니다.






ChainRule을 사용하지 않고 기본 전개식으로도 미분 해보겠습니다.