Градиентный спуск по мини-батчам (Mini-Batch Gradient Descent)

Автор:

Vетод оптимизации, при котором модель обновляет параметры, используя не весь датасет сразу и не один объект, а небольшие группы данных

Градиентный спуск по мини-батчам (Mini-Batch Gradient Descent, MBGD) — это метод оптимизации, при котором модель обновляет параметры, используя не весь датасет сразу и не один объект, а небольшие группы данных (батчи).

При обучении модели нужно минимизировать функцию ошибки. Для этого используется градиентный спуск. Существует три основных варианта:

Batch Gradient Descent

  • использует весь датасет для одного обновления
  • стабилен, но медленный
  • плохо масштабируется

Stochastic Gradient Descent (SGD)

  • обновляет параметры после каждого объекта
  • быстрый, но шумный
  • может «прыгать» вокруг минимума

Mini-Batch Gradient Descent

  • использует небольшие батчи (например, 32, 64, 128 объектов)
  • быстрее полного batch
  • стабильнее SGD

Именно MBGD сегодня используется почти во всех задачах Deep Learning.

MBGD является золотым серединой между Batch Gradient Descent и Stochastic Gradient Descent, он:

  • эффективно использует GPU
  • снижает шум по сравнению с SGD
  • хорошо масштабируется

На практике размер батча — это гиперпараметр, который подбирается экспериментально.

Как это выглядит алгоритмически

На каждой эпохе:

  1. Перемешиваем данные
  2. Делим их на батчи
  3. Для каждого батча:
    • считаем предсказания
    • считаем ошибку
    • считаем градиенты
    • обновляем параметры

Минимальный пример на Python

Рассмотрим простую линейную регрессию.

Мы хотим обучить модель:

[
y = wx + b
]

Сгенерируем данные

import numpy as np

np.random.seed(42)
X = np.random.rand(1000, 1)
y = 3 * X + 2 + 0.1 * np.random.randn(1000, 1)

# Зададим параметры модели
w = np.random.randn(1)
b = np.random.randn(1)

learning_rate = 0.1
batch_size = 32
epochs = 50

# Обучим модель с Mini-Batch Gradient Descent
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 = w * X_batch + b
        
        # Вычислим градиенты
        dw = -2 * np.mean(X_batch * (y_batch - y_pred))
        db = -2 * np.mean(y_batch - y_pred)
        
        # Обновим параметры
        w -= learning_rate * dw
        b -= learning_rate * db

print("w:", w)
print("b:", b)

После обучения параметры будут близки к:

w3
b2

Почему этот код работает

  • параметры обновляются после каждого батча
  • градиент считается не по одному объекту, а по небольшой группе
  • модель постепенно приближается к оптимальному решению

Как выбирают размер батча

Типичные значения:

  • 16
  • 32
  • 64
  • 128
  • 256

Где используется Mini-Batch Gradient Descent

  • нейросети
  • логистическая регрессия
  • линейные модели
  • практически весь deep learning

На самом деле, когда вы пишете в PyTorch, то используете MBGD:

DataLoader(..., batch_size=32)