Цепное правило дифференцирования

Brain.js — это библиотека для JavaScript, предоставляющая инструменты для создания и обучения нейронных сетей. Основное её преимущество заключается в простоте использования при работе с задачами классификации, регрессии, прогнозирования временных рядов и распознавания паттернов. Библиотека реализует несколько типов сетей, включая Feedforward Neural Network, Recurrent Neural Network (RNN) и Long Short-Term Memory (LSTM).

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


Инициализация сети

Для создания простой полносвязной нейронной сети используется класс NeuralNetwork.

const brain = require('brain.js');

const net = new brain.NeuralNetwork({
  hiddenLayers: [3], // Один скрытый слой с 3 нейронами
  activation: 'sigmoid' // Функция активации: sigmoid, relu, tanh
});

Параметры:

  • hiddenLayers — массив, задающий количество нейронов в каждом скрытом слое.
  • activation — функция активации, влияющая на способность сети обучаться нелинейным зависимостям.

Формат данных для обучения

Обучение сети происходит на наборах данных в виде объектов. Каждый объект содержит input и output.

const trainingData = [
  { input: { r: 0.03, g: 0.7, b: 0.5 }, output: { light: 1 } },
  { input: { r: 0.9, g: 0.1, b: 0.2 }, output: { dark: 1 } }
];
  • input — нормализованные значения признаков (числа от 0 до 1).
  • output — целевые значения, также обычно нормализованные или бинарные.

Процесс обучения

Метод train используется для подстройки весов сети на основе тренировочного набора данных.

net.train(trainingData, {
  iterations: 20000, // Количество проходов по данным
  learningRate: 0.05, // Скорость обучения
  errorThresh: 0.005 // Порог ошибки для остановки обучения
});

Пояснения параметров:

  • iterations — чем больше, тем точнее модель, но дольше обучение.
  • learningRate — регулирует шаг изменения весов. Слишком большой шаг может вызвать расходимость, слишком маленький — медленное обучение.
  • errorThresh — сеть прекращает обучение, как только ошибка опускается ниже этого значения.

Использование цепного правила дифференцирования

Цепное правило дифференцирования (backpropagation) лежит в основе обучения полносвязных сетей в Brain.js.

  1. Прямое распространение сигнала (forward pass): входные данные проходят через слои сети, формируя выход.
  2. Вычисление ошибки: разница между предсказанным выходом и целевым.
  3. Обратное распространение (backpropagation): ошибка распространяется обратно через слои сети, корректируя веса.

Формально, изменение веса w между нейронами вычисляется по формуле:

[ w = -]

где:

    1. — функция ошибки (обычно среднеквадратичная ошибка),
  • () — learningRate,
  • () — частная производная ошибки по весу, вычисляемая с использованием цепного правила.

Цепное правило позволяет эффективно вычислять производные для многослойных сетей, начиная с выхода и двигаясь назад через все слои. Для нейрона с функцией активации () градиент вычисляется так:

[ _j = ’(net_j) k w{jk} _k]

где (j) — ошибка нейрона, (w{jk}) — вес связи с последующим нейроном, (_k) — ошибка следующего слоя.


Прогнозирование и использование сети

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

const output = net.run({ r: 0.1, g: 0.8, b: 0.3 });
console.log(output); // { light: 0.9, dark: 0.1 }
  • net.run(input) возвращает объект с вероятностями для каждого выходного признака.
  • Для бинарной классификации выбирается категория с максимальным значением.

Рекуррентные сети

Brain.js также поддерживает RNN и LSTM, которые эффективны для последовательных данных, таких как тексты или временные ряды.

const rnn = new brain.recurrent.LSTM();
rnn.train([
  { input: "Привет", output: "Здравствуйте" },
  { input: "Как дела?", output: "Хорошо" }
]);
  • LSTM использует механизмы ячейки памяти, что позволяет моделировать долгосрочные зависимости.
  • Процесс обучения аналогичен backpropagation, но с расширением для последовательных шагов (backpropagation through time).

Настройка и оптимизация

Brain.js позволяет тонко настраивать сеть для улучшения качества:

  • Изменение функции активации (sigmoid, relu, tanh) для разных типов данных.
  • Регулировка hiddenLayers и числа нейронов в каждом слое для балансировки сложности модели и времени обучения.
  • Использование momentum и decay для стабилизации процесса обучения и предотвращения переобучения.
net.train(trainingData, {
  iterations: 10000,
  learningRate: 0.01,
  momentum: 0.9
});

Практические советы по обучению

  • Все входные данные должны быть нормализованы.
  • Для категориальных данных использовать one-hot encoding.
  • Размер выборки должен быть достаточным для надежного выявления закономерностей.
  • Проверка модели на отдельном тестовом наборе позволяет оценить реальную точность и избегать переобучения.