Стохастический и мини-батчевый градиентный спуск

Библиотека Brain.js предоставляет высокоуровневый интерфейс для работы с нейронными сетями на JavaScript. Одним из ключевых аспектов обучения сетей является оптимизация весов с помощью алгоритма градиентного спуска. В Brain.js поддерживаются различные варианты градиентного спуска, среди которых выделяются стохастический градиентный спуск (SGD) и мини-батчевый градиентный спуск (mini-batch gradient descent). Эти методы позволяют эффективно обучать сети на больших наборах данных, балансируя между скоростью обучения и стабильностью сходимости.


Основы градиентного спуска

Градиентный спуск — это итеративный метод оптимизации, цель которого минимизировать функцию потерь (L()), изменяя параметры сети () в направлении отрицательного градиента:

[ _{t+1} = _t - L(_t)]

где:

  • () — шаг обучения (learning rate),
  • (L(_t)) — градиент функции потерь по параметрам на текущей итерации.

В контексте нейронных сетей (L()) обычно вычисляется как средняя ошибка между предсказанными и фактическими значениями на обучающем наборе данных.


Стохастический градиентный спуск (SGD)

В SGD обновление весов происходит после каждого примера обучающего набора, что делает процесс более шумным, но позволяет быстрее проходить через данные. Формула обновления весов выглядит так:

[ _{t+1} = _t - L_i(_t)]

где (L_i(_t)) — функция потерь для одного примера (i).

Особенности SGD в Brain.js:

  • Обучение происходит итеративно по каждому примеру.
  • Быстро реагирует на изменения градиента, что полезно для сетей с большими и разнородными данными.
  • Высокая вариативность обновлений может привести к «дрожанию» функции потерь, но помогает избежать локальных минимумов.

Пример настройки SGD в Brain.js:

const brain = require('brain.js');
const net = new brain.NeuralNetwork({
  learningRate: 0.01,
  // Использование стохастического обновления
});

net.train(trainingData, {
  iterations: 20000,
  errorThresh: 0.005,
  log: true,
  logPeriod: 100
});

В данном примере обновление происходит по одному примеру за раз, что делает обучение стохастическим.


Мини-батчевый градиентный спуск

Мини-батчевый градиентный спуск является компромиссом между пакетным градиентным спуском (batch gradient descent) и стохастическим. Вместо обработки всей выборки или одного примера, вычисление градиента производится на небольших подвыборках (мини-батчах). Формула обновления весов:

[ _{t+1} = t - {i=1}^{m} L_i(_t)]

где (m) — размер мини-батча.

Преимущества мини-батчей:

  • Снижается шум градиента по сравнению с SGD, делая обновления более стабильными.
  • Эффективнее использование ресурсов, особенно при работе с GPU.
  • Позволяет находить хорошую сходимость при умеренном размере батча (например, 32, 64 или 128 примеров).

Пример настройки мини-батчевого градиентного спуска в Brain.js:

const brain = require('brain.js');
const net = new brain.NeuralNetwork({
  learningRate: 0.01,
  // Размер мини-батча
  batchSize: 32
});

net.train(trainingData, {
  iterations: 10000,
  errorThresh: 0.005,
  log: true,
  logPeriod: 50
});

Здесь batchSize определяет количество примеров, на которых вычисляется градиент перед обновлением весов.


Настройка параметров обучения

Ключевые параметры для управления SGD и мини-батчевым градиентным спуском в Brain.js:

  1. learningRate — скорость обучения. Малые значения повышают стабильность, но замедляют обучение. Слишком большие значения могут приводить к расходимости.
  2. iterations — количество итераций обучения. Определяет, сколько раз данные будут обработаны.
  3. batchSize — размер мини-батча. По умолчанию Brain.js использует стохастический подход (batchSize = 1), но при увеличении до нескольких десятков примеров обучение становится мини-батчевым.
  4. errorThresh — порог ошибки для остановки обучения.

Правильный подбор этих параметров позволяет добиться баланса между скоростью сходимости и точностью сети.


Практические аспекты использования

  • Стохастический градиентный спуск хорошо подходит для небольших или динамически меняющихся наборов данных, где требуется быстрый отклик модели.
  • Мини-батчевый градиентный спуск эффективен при обучении на больших объемах данных и позволяет стабилизировать колебания функции потерь.
  • В Brain.js можно комбинировать логирование прогресса и динамическое изменение скорости обучения для наблюдения за сходимостью.

Мини-батчевый подход также упрощает интеграцию с веб-приложениями, поскольку позволяет обрабатывать данные порциями и избегать перегрузки памяти.