Градиентный спуск по мини-батчам (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
- хорошо масштабируется
На практике размер батча — это гиперпараметр, который подбирается экспериментально.
Как это выглядит алгоритмически
На каждой эпохе:
- Перемешиваем данные
- Делим их на батчи
- Для каждого батча:
- считаем предсказания
- считаем ошибку
- считаем градиенты
- обновляем параметры
Минимальный пример на 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)
После обучения параметры будут близки к:
w ≈ 3
b ≈ 2
Почему этот код работает
- параметры обновляются после каждого батча
- градиент считается не по одному объекту, а по небольшой группе
- модель постепенно приближается к оптимальному решению
Как выбирают размер батча
Типичные значения:
- 16
- 32
- 64
- 128
- 256
Где используется Mini-Batch Gradient Descent
- нейросети
- логистическая регрессия
- линейные модели
- практически весь deep learning
На самом деле, когда вы пишете в PyTorch, то используете MBGD:
DataLoader(..., batch_size=32)