Подбор гиперпараметров вручную

Библиотека Brain.js предоставляет удобный интерфейс для создания и обучения нейронных сетей на JavaScript. Важной частью эффективного обучения является правильный подбор гиперпараметров, которые напрямую влияют на скорость сходимости сети и качество её предсказаний. Гиперпараметры — это настройки, которые задаются до начала процесса обучения и не изменяются автоматически во время него.

Ключевые гиперпараметры

  1. Количество скрытых слоев и нейронов в них

    • В Brain.js структура сети определяется массивом, где каждый элемент задаёт количество нейронов в соответствующем скрытом слое:

      const net = new brain.NeuralNetwork({ hiddenLayers: [10, 15] });
    • Малое количество нейронов может привести к недообучению, когда сеть не способна уловить сложные закономерности.

    • Слишком большое количество нейронов увеличивает риск переобучения и существенно замедляет обучение.

  2. Learning Rate (скорость обучения)

    • Определяет величину корректировки весов на каждой итерации.

    • В Brain.js задаётся через параметр learningRate (по умолчанию 0.3):

      const net = new brain.NeuralNetwork({ learningRate: 0.1 });
    • Высокий learning rate ускоряет обучение, но может вызвать нестабильность и пропуск минимума функции потерь.

    • Низкий learning rate делает обучение медленным, но более стабильным и точным.

  3. Количество итераций (iterations)

    • Определяет максимальное число проходов через обучающую выборку.

      net.train(trainingData, { iterations: 20000 });
    • Увеличение числа итераций повышает точность модели, но увеличивает время обучения.

    • При ручном подборе итераций важно наблюдать за функцией потерь (error) и останавливать обучение, когда улучшения становятся незначительными.

  4. Функция активации (activation)

    • Brain.js поддерживает несколько функций активации: 'sigmoid', 'relu', 'leaky-relu', 'tanh'.

      const net = new brain.NeuralNetwork({ activation: 'relu' });
    • Sigmoid хорошо работает для бинарной классификации, но может страдать от эффекта исчезающих градиентов.

    • ReLU и Leaky ReLU эффективны для глубоких сетей и более устойчивы к проблеме градиентов.

  5. Momentum (моментум)

    • Влияет на скорость и стабильность обучения, помогает преодолевать локальные минимумы функции потерь.

      net.train(trainingData, { learningRate: 0.01, momentum: 0.9 });
    • Значения 0.7–0.9 часто дают хороший баланс между ускорением и стабильностью.

Методика ручного подбора гиперпараметров

  1. Начало с базовых значений

    • Сначала выбирается простая архитектура, например, один скрытый слой с небольшим количеством нейронов и стандартным learning rate (0.3).
    • Проводится начальное обучение и фиксируется ошибка сети.
  2. Пошаговая модификация одного параметра

    • Изменяется только один гиперпараметр за раз. Например, сначала корректируется learning rate: 0.1 → 0.2 → 0.5.
    • После каждого изменения измеряется точность на тестовой выборке и наблюдается функция потерь.
  3. Наблюдение за переобучением

    • Если ошибка на обучающих данных продолжает снижаться, а на тестовых растёт, происходит переобучение.
    • В этом случае уменьшают количество нейронов, итераций или применяют регуляризацию.
  4. Оптимизация скрытых слоёв

    • После выбора оптимального learning rate и числа итераций проверяется влияние количества нейронов и слоёв.
    • Для сложных задач часто полезно использовать два-три скрытых слоя с постепенным уменьшением числа нейронов.
  5. Финальная настройка активации и momentum

    • Эксперименты с функцией активации помогают адаптировать сеть к типу данных: для изображений и численных признаков чаще применяют ReLU, для бинарных — sigmoid.
    • Настройка momentum позволяет ускорить обучение без потери стабильности.

Практические советы

  • Для небольших наборов данных стоит использовать меньше нейронов и слоёв, чтобы избежать переобучения.
  • Для сложных или шумных данных постепенное увеличение нейронов и слоёв часто улучшает результаты.
  • Мониторинг функции потерь (error) на каждой итерации позволяет своевременно остановить обучение и скорректировать гиперпараметры.
  • В Brain.js можно сохранять и загружать сеть через toJSON() и fromJSON(), что облегчает тестирование разных конфигураций без повторного обучения с нуля.

Пример последовательного подбора

const trainingData = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
];

// Начальная сеть
let net = new brain.NeuralNetwork({ hiddenLayers: [3], learningRate: 0.3 });
let result = net.train(trainingData, { iterations: 2000 });
console.log(result.error); // фиксируем начальную ошибку

// Изменение learning rate
net = new brain.NeuralNetwork({ hiddenLayers: [3], learningRate: 0.1 });
result = net.train(trainingData, { iterations: 5000 });
console.log(result.error);

// Добавление второго скрытого слоя
net = new brain.NeuralNetwork({ hiddenLayers: [3, 2], learningRate: 0.1 });
result = net.train(trainingData, { iterations: 5000 });
console.log(result.error);

Этот пример иллюстрирует постепенное улучшение модели через последовательное изменение гиперпараметров: сначала learning rate, затем архитектуры сети.


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