# Как Mini-batch Gradient Descent ускоряет обучение нейросетей в тысячи раз

Источник: https://www.youtube.com/watch?v=-_4Zi8fCZO4
Канал: DeepLearning.AI
Опубликовано: 25.08.2017

---

В новом видеоуроке от образовательного проекта DeepLearning.AI подробно разбираются механизмы работы алгоритма градиентного спуска по мини-пакетам (Mini-batch Gradient Descent). Автор курса объясняет, почему этот метод стал «золотой серединой» между классическим пакетным и стохастическим подходами, а также дает конкретные рекомендации по выбору гиперпараметров для ускорения обучения нейросетей.

## 📈 Визуализация стоимости и проблема шума
[[JUMP:0:00]]

При использовании классического пакетного градиентного спуска (Batch Gradient Descent) функция стоимости $J$ должна уменьшаться на каждой итерации [0:27]. Если на каком-то этапе график идет вверх, это однозначно сигнализирует о проблеме, например, о слишком большой скорости обучения (learning rate) [0:39]. 

Однако в Mini-batch Gradient Descent ситуация иная. Поскольку на каждой итерации обрабатывается не весь набор данных, а лишь его часть ($X^{\{t\}}$, $Y^{\{t\}}$), график функции стоимости $J$ становится «шумным» [0:54]. По мнению автора, такие колебания естественны:

*   Один мини-пакет может оказаться «легким» для модели, и стоимость на нем будет низкой [1:48].
*   Следующий пакет может содержать сложные или неверно размеченные примеры, что вызовет кратковременный рост стоимости [2:02].

Несмотря на эти осцилляции, общая тенденция графика должна быть направлена вниз. Если кривая не демонстрирует нисходящего тренда в долгосрочной перспективе, алгоритм требует отладки [1:34].

## ⚖️ Две крайности: Batch против Stochastic
[[JUMP:2:14]]

Размер мини-пакета — это гиперпараметр, который критически влияет на поведение алгоритма. Существуют два экстремальных значения:

1.  **Batch Gradient Descent (Размер пакета = $m$):** Весь обучающий набор рассматривается как один гигантский пакет. Главный недостаток — слишком долгое время обработки одной итерации при больших объемах данных [5:35].
2.  **Stochastic Gradient Descent (Размер пакета = 1):** Каждый обучающий пример становится отдельным пакетом. В этом случае прогресс заметен уже после первого примера, но алгоритм становится чрезвычайно шумным [4:38].

Эндрю Ын отмечает, что стохастический градиентный спуск никогда не сходится к истинному минимуму окончательно [4:51]. Он будет «блуждать» и осциллировать в окрестностях оптимальной точки, но не остановится в ней. Для решения этой проблемы иногда применяют постепенное снижение скорости обучения [8:01].

## 🚀 Почему Mini-batch — оптимальный выбор
[[JUMP:5:07]]

В практических задачах размер мини-пакета выбирается в диапазоне между 1 и $m$. Это позволяет использовать преимущества обоих подходов:

*   **Скорость векторизации:** В отличие от стохастического спуска, обработка мини-пакета (например, из 1000 примеров) позволяет задействовать вычислительную мощь современных библиотек для быстрой векторизации вычислений [6:59].
*   **Частота обновлений:** Вам не нужно ждать обработки всего датасета, чтобы сделать шаг к минимуму. Если в датасете 5 миллионов примеров, а размер пакета — 1000, то за одну эпоху вы сделаете 5000 шагов обновления весов [7:24].

По словам эксперта, это обеспечивает максимально быстрое обучение на практике [6:31]. Алгоритм движется к минимуму более уверенно, чем стохастический спуск, хотя и сохраняет небольшие колебания [7:48].

## 🛠 Практические рекомендации по настройке
[[JUMP:8:16]]

Выбор конкретного размера мини-пакета зависит от размера вашего обучающего набора и аппаратного обеспечения. Автор предлагает следующие ориентиры:

1.  **Для малых наборов данных:** Если в вашей выборке менее 2000 примеров, нет смысла использовать мини-пакеты. Используйте обычный Batch Gradient Descent [8:32].
2.  **Типичные размеры для больших выборок:** В индустрии приняты значения от 64 до 512 [8:58].
3.  **Магия степеней двойки:** Поскольку компьютерная память организована определенным образом, код часто работает быстрее, если размер пакета является степенью двойки: 64, 128, 256 или 512 [9:11]. Хотя Andrew Ng использовал число 1000 в примерах, на практике он рекомендует 1024 ($2^{10}$) [9:38].

**Критический фактор:** необходимо следить, чтобы весь мини-пакет ($X^{\{t\}}$, $Y^{\{t\}}$) полностью помещался в память CPU или GPU [9:52]. Если данные не влезают в память, производительность алгоритма резко упадет («рухнет с обрыва»), так как системе придется обращаться к диску или использовать неэффективные методы подкачки [10:23].

В завершение автор подчеркивает, что размер мини-пакета — это такой же гиперпараметр, как и скорость обучения. Его стоит подбирать экспериментально, пробуя несколько значений (степеней двойки) и выбирая то, которое наиболее эффективно снижает функцию стоимости [10:49].