move84

머신러닝: 배치 경사 하강법 vs. 확률적 경사 하강법 본문

머신러닝

머신러닝: 배치 경사 하강법 vs. 확률적 경사 하강법

move84 2025. 3. 4. 23:27
반응형

머신러닝 모델을 훈련시키는 과정에서 최적의 모델 파라미터를 찾는 것은 핵심적인 단계이다. 경사 하강법(Gradient Descent)은 이러한 최적의 파라미터를 찾아가는 가장 널리 사용되는 알고리즘 중 하나이다. 경사 하강법에는 여러 변형이 존재하며, 그 중에서도 배치 경사 하강법(Batch Gradient Descent)과 확률적 경사 하강법(Stochastic Gradient Descent)은 가장 기본적인 형태이자 널리 사용되는 방법이다. 이 글에서는 두 가지 방법의 차이점과 특징, 그리고 실제 적용 시의 장단점을 살펴본다.

배치 경사 하강법 (Batch Gradient Descent)

배치 경사 하강법은 전체 훈련 데이터셋(Training Dataset)을 사용하여 각 반복(iteration)에서 모델의 기울기(gradient)를 계산하고, 파라미터를 업데이트하는 방식이다. 즉, 모든 데이터를 한 번에 고려하여 손실 함수(loss function)의 경사를 계산하고, 그 경사의 반대 방향으로 파라미터를 업데이트한다. 이러한 방식으로 전체 데이터에 대한 최적의 기울기를 구하기 때문에, 수렴(convergence) 속도가 안정적이며, 각 업데이트 단계에서 손실 함수의 감소가 보장된다.

# 배치 경사 하강법 (Batch Gradient Descent) 예시
import numpy as np

# 가상의 데이터
X = np.array([[1, 2], [3, 4], [5, 6]]) # 입력 데이터
y = np.array([7, 14, 21]) # 목표 값

# 파라미터 초기화 (w: 가중치, b: 편향)
w = np.zeros(2)
b = 0

# 학습률 (learning rate)
lr = 0.01

# 반복 횟수
epochs = 100

for epoch in range(epochs):
    # 예측값 계산
    y_pred = np.dot(X, w) + b

    # 손실 계산 (MSE, Mean Squared Error)
    loss = np.mean((y_pred - y)**2)

    # 기울기 계산
    dw = (1/len(X)) * np.dot(X.T, (y_pred - y))
    db = (1/len(X)) * np.sum(y_pred - y)

    # 파라미터 업데이트
    w = w - lr * dw
    b = b - lr * db

    if epoch % 10 == 0:
        print(f"Epoch {epoch}, Loss: {loss}")

print("최종 가중치:", w)
print("최종 편향:", b)

배치 경사 하강법은 전체 데이터를 사용하기 때문에, 데이터셋이 작을 경우 효율적이지만, 데이터셋의 크기가 커질수록 계산량이 기하급수적으로 증가하여 훈련 속도가 매우 느려진다는 단점이 있다. 또한, 메모리 사용량이 많아 대용량 데이터셋을 처리하는 데 어려움이 있을 수 있다. 대용량 데이터셋의 경우, 전체 데이터를 한 번에 메모리에 로드하는 것이 불가능할 수 있기 때문이다.


💡 확률적 경사 하강법 (Stochastic Gradient Descent)

확률적 경사 하강법은 각 반복에서 훈련 데이터셋의 단일 샘플(single sample)을 무작위로 선택하여 기울기를 계산하고 파라미터를 업데이트하는 방식이다. 배치 경사 하강법과 달리 전체 데이터를 사용하지 않으므로, 계산 속도가 빠르며 메모리 사용량도 적다. 데이터셋이 매우 클 경우, 확률적 경사 하강법은 배치 경사 하강법보다 훨씬 효율적일 수 있다.

# 확률적 경사 하강법 (Stochastic Gradient Descent) 예시
import numpy as np

# 가상의 데이터
X = np.array([[1, 2], [3, 4], [5, 6]]) # 입력 데이터
y = np.array([7, 14, 21]) # 목표 값

# 파라미터 초기화
w = np.zeros(2)
b = 0

# 학습률
lr = 0.01

# 반복 횟수
epochs = 100

for epoch in range(epochs):
    # 각 샘플에 대해 반복
    for i in range(len(X)):
        # 하나의 샘플 선택
        x_i = X[i].reshape(1, -1)
        y_i = y[i]

        # 예측값 계산
        y_pred_i = np.dot(x_i, w) + b

        # 손실 계산
        loss_i = (y_pred_i - y_i)**2

        # 기울기 계산
        dw_i = x_i.T * (y_pred_i - y_i)
        db_i = y_pred_i - y_i

        # 파라미터 업데이트
        w = w - lr * dw_i.flatten()
        b = b - lr * db_i

    if epoch % 10 == 0:
        y_pred_all = np.dot(X, w) + b
        loss_all = np.mean((y_pred_all - y)**2)
        print(f"Epoch {epoch}, Loss: {loss_all}")

print("최종 가중치:", w)
print("최종 편향:", b)

확률적 경사 하강법은 각 업데이트 단계에서 하나의 샘플만 사용하므로, 기울기의 변화가 크고 노이즈(noise)가 많아 수렴 과정이 불안정할 수 있다. 최적점(global minimum)에 도달하기 전에 지역 최솟값(local minimum)에 갇히거나, 최적점을 계속 맴도는 현상이 발생할 수 있다. 이러한 단점을 보완하기 위해, 학습률(learning rate)을 조정하거나, 모멘텀(momentum)이나 아담(Adam)과 같은 최적화 기법을 함께 사용하는 경우가 많다. 또한, 각 에폭(epoch)마다 훈련 데이터를 섞어(shuffling) 샘플의 선택 순서를 무작위로 하는 것이 일반적이다.


🚀 미니 배치 경사 하강법 (Mini-batch Gradient Descent)

배치 경사 하강법과 확률적 경사 하강법의 절충안으로, 미니 배치 경사 하강법(Mini-batch Gradient Descent)이 존재한다. 미니 배치 경사 하강법은 전체 데이터셋을 작은 크기의 미니 배치(mini-batch)로 나누어 각 미니 배치에 대해 기울기를 계산하고 파라미터를 업데이트하는 방식이다. 미니 배치의 크기는 일반적으로 32, 64, 128, 256 등 2의 거듭제곱 값을 사용한다. 미니 배치 경사 하강법은 배치 경사 하강법보다 계산 속도가 빠르면서, 확률적 경사 하강법보다 수렴 과정이 안정적인 장점을 가진다. 따라서, 현재 가장 널리 사용되는 경사 하강법의 형태이다.

# 미니 배치 경사 하강법 (Mini-batch Gradient Descent) 예시
import numpy as np

# 가상의 데이터
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]) # 입력 데이터
y = np.array([7, 14, 21, 28, 35, 42]) # 목표 값

# 파라미터 초기화
w = np.zeros(2)
b = 0

# 학습률
lr = 0.01

# 반복 횟수
epochs = 100

# 미니 배치 크기
batch_size = 2

for epoch in range(epochs):
    # 데이터 섞기
    indices = np.random.permutation(len(X))
    X_shuffled = X[indices]
    y_shuffled = y[indices]

    # 미니 배치로 나누어 학습
    for i in range(0, len(X), batch_size):
        X_batch = X_shuffled[i:i+batch_size]
        y_batch = y_shuffled[i:i+batch_size]

        # 예측값 계산
        y_pred = np.dot(X_batch, w) + b

        # 손실 계산
        loss = np.mean((y_pred - y_batch)**2)

        # 기울기 계산
        dw = (1/batch_size) * np.dot(X_batch.T, (y_pred - y_batch))
        db = (1/batch_size) * np.sum(y_pred - y_batch)

        # 파라미터 업데이트
        w = w - lr * dw
        b = b - lr * db

    if epoch % 10 == 0:
        y_pred_all = np.dot(X, w) + b
        loss_all = np.mean((y_pred_all - y)**2)
        print(f"Epoch {epoch}, Loss: {loss_all}")

print("최종 가중치:", w)
print("최종 편향:", b)

📚 핵심 용어 정리

  • 경사 하강법 (Gradient Descent, GD): 손실 함수의 기울기를 이용하여 모델의 파라미터를 최적화하는 알고리즘.
  • 배치 경사 하강법 (Batch Gradient Descent, BGD): 전체 데이터셋을 사용하여 기울기를 계산하고 파라미터를 업데이트하는 방법.
  • 확률적 경사 하강법 (Stochastic Gradient Descent, SGD): 단일 샘플을 사용하여 기울기를 계산하고 파라미터를 업데이트하는 방법.
  • 미니 배치 경사 하강법 (Mini-batch Gradient Descent): 미니 배치 단위로 데이터를 나누어 기울기를 계산하고 파라미터를 업데이트하는 방법.
  • 훈련 데이터셋 (Training Dataset): 모델 학습에 사용되는 데이터셋.
  • 손실 함수 (Loss Function): 모델의 예측과 실제 값 사이의 차이를 나타내는 함수.
  • 기울기 (Gradient): 손실 함수의 변화율.
  • 파라미터 (Parameter): 모델의 가중치(weight)와 편향(bias) 등, 모델의 성능을 결정하는 값.
  • 학습률 (Learning Rate): 파라미터 업데이트의 정도를 조절하는 하이퍼파라미터.
  • 에폭 (Epoch): 전체 훈련 데이터셋을 한 번 학습하는 횟수.
  • 수렴 (Convergence): 모델의 파라미터가 최적 값에 가까워지는 과정.
  • 지역 최솟값 (Local Minimum): 손실 함수가 지역적으로 최소가 되는 지점.
  • 전역 최솟값 (Global Minimum): 손실 함수가 전체적으로 최소가 되는 지점.

🏁 결론

배치 경사 하강법, 확률적 경사 하강법, 그리고 미니 배치 경사 하강법은 각각 장단점을 가지고 있으며, 적용하려는 문제와 데이터셋의 특성에 따라 적절한 방법을 선택해야 한다. 일반적으로, 미니 배치 경사 하강법이 가장 널리 사용되며, 대용량 데이터셋에서는 확률적 경사 하강법과 같은 방법을 적절히 활용하여 훈련 속도를 높이는 것이 중요하다. 또한, 학습률 조정, 모멘텀, 아담과 같은 다양한 최적화 기법들을 함께 사용하면 모델의 성능을 더욱 향상시킬 수 있다.

반응형