Python/Deep Learning

확률적 경사 하강법(SGD)과 배치 경사 하강법

임베디드 친구 2025. 11. 27. 20:02
728x90
반응형

확률적 경사 하강법(SGD)과 배치 경사 하강법

딥러닝 모델을 학습할 때 가장 중요한 과정 중 하나는 최적화(Optimization)입니다. 최적화 과정에서 가장 널리 사용되는 알고리즘이 바로 경사 하강법(Gradient Descent, GD)입니다. 경사 하강법은 손실 함수의 기울기를 이용하여 가중치를 조정하고, 손실이 최소화되는 방향으로 모델을 업데이트하는 방식입니다.

이번 글에서는 확률적 경사 하강법(Stochastic Gradient Descent, SGD)배치 경사 하강법(Batch Gradient Descent)의 개념, 차이점, 장단점에 대해 알아보고, Python을 활용하여 직접 구현해보겠습니다.


1. 경사 하강법(Gradient Descent)이란?

경사 하강법은 딥러닝 모델의 가중치를 최적화하는 핵심 알고리즘으로, 손실 함수의 기울기(Gradient)를 이용하여 가중치를 업데이트하는 방법입니다. 수학적으로는 다음과 같이 표현할 수 있습니다.

$$
w_{new} = w - \alpha \cdot \nabla J(w)
$$

  • $w_{new}$ : 업데이트된 가중치
  • $w$ : 기존 가중치
  • $\alpha$ : 학습률(Learning Rate)
  • $\nabla J(w)$ : 손실 함수의 기울기(Gradient)

경사 하강법은 손실 함수의 기울기를 계산한 후, 가중치를 업데이트하여 점진적으로 최적해를 찾는 과정입니다. 하지만 기울기를 계산하는 방법에 따라 배치 경사 하강법, 확률적 경사 하강법, 미니배치 경사 하강법으로 나뉩니다.


2. 배치 경사 하강법(Batch Gradient Descent, BGD)

배치 경사 하강법(BGD)은 전체 데이터셋을 사용하여 한 번의 가중치 업데이트를 수행하는 방식입니다. 즉, 모든 샘플을 활용하여 손실 함수의 기울기를 계산한 후, 한 번에 업데이트를 진행합니다.

배치 경사 하강법의 수식

$$
w_{new} = w - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} \nabla J(w_i)
$$

  • $m$ : 전체 데이터 샘플 수
  • $\nabla J(w_i)$ : 개별 샘플 $i$에 대한 손실 함수의 기울기

배치 경사 하강법은 정확한 기울기를 계산할 수 있어 안정적인 학습이 가능하지만, 데이터셋이 커질수록 연산량이 증가하여 학습 속도가 느려지는 단점이 있습니다.

배치 경사 하강법의 장단점

장점

  • 손실 함수의 기울기를 정확하게 계산하여 안정적인 학습이 가능
  • 수렴이 상대적으로 안정적이며, 최적값에 도달할 확률이 높음

단점

  • 데이터셋이 클 경우 계산량이 많아져 학습 속도가 느려짐
  • 메모리 사용량이 많아 대용량 데이터셋에는 부적합함

배치 경사 하강법 Python 구현

import numpy as np

def batch_gradient_descent(X, y, lr=0.01, epochs=1000):
    m, n = X.shape  # 데이터 크기
    theta = np.zeros(n)  # 가중치 초기화
    for epoch in range(epochs):
        gradient = (1/m) * X.T.dot(X.dot(theta) - y)
        theta -= lr * gradient
    return theta

# 예제 데이터
X = np.array([[1, 2], [2, 3], [3, 4]])
y = np.array([5, 7, 9])

# 경사 하강법 실행
theta = batch_gradient_descent(X, y)
print("최적화된 가중치:", theta)

3. 확률적 경사 하강법(Stochastic Gradient Descent, SGD)

확률적 경사 하강법(SGD)은 한 번의 가중치 업데이트를 수행할 때 하나의 샘플만을 사용하는 방식입니다. 즉, 전체 데이터셋을 한 번에 사용하는 것이 아니라, 각 샘플을 순차적으로 학습하며 가중치를 업데이트합니다.

확률적 경사 하강법의 수식

$$
w_{new} = w - \alpha \cdot \nabla J(w_i)
$$

SGD는 매 반복마다 데이터 샘플을 무작위로 선택하여 기울기를 계산하고, 즉시 가중치를 업데이트합니다.

확률적 경사 하강법의 장단점

장점

  • 학습 속도가 빠르고, 실시간으로 가중치를 업데이트할 수 있음
  • 대용량 데이터셋에도 적합하며, 메모리 사용량이 적음

단점

  • 매 반복마다 가중치가 변경되므로 수렴 속도가 불안정할 수 있음
  • 최적점 근처에서 진동하며 정확한 최소값을 찾기 어려울 수 있음

확률적 경사 하강법 Python 구현

def stochastic_gradient_descent(X, y, lr=0.01, epochs=1000):
    m, n = X.shape
    theta = np.zeros(n)
    for epoch in range(epochs):
        for i in range(m):
            random_index = np.random.randint(m)
            xi = X[random_index:random_index+1]
            yi = y[random_index]
            gradient = xi.T.dot(xi.dot(theta) - yi)
            theta -= lr * gradient
    return theta

# 경사 하강법 실행
theta = stochastic_gradient_descent(X, y)
print("최적화된 가중치:", theta)

4. 배치 경사 하강법과 확률적 경사 하강법 비교

경사 하강법 종류 장점 단점
배치 경사 하강법(BGD) 안정적인 수렴, 정확한 기울기 계산 데이터가 클 경우 연산량 증가
확률적 경사 하강법(SGD) 빠른 학습, 실시간 업데이트 가능 수렴 속도가 불안정할 수 있음

5. 결론

경사 하강법은 딥러닝에서 매우 중요한 최적화 기법이며, 배치 경사 하강법(BGD)과 확률적 경사 하강법(SGD)은 각각 장단점을 가지고 있습니다.

  • 배치 경사 하강법은 안정적인 수렴이 가능하지만, 데이터셋이 커지면 학습 속도가 느려질 수 있습니다.
  • 확률적 경사 하강법은 빠른 학습이 가능하지만, 최적값 근처에서 진동하며 안정적인 수렴이 어려울 수 있습니다.

실제 딥러닝에서는 배치와 확률적 경사 하강법의 장점을 결합한 미니배치 경사 하강법(Mini-Batch Gradient Descent)을 주로 사용합니다.

반응형