Производная функции показывает, как изменяется её значение при малом изменении аргумента. В контексте нейросетей производная играет ключевую роль при обучении, так как именно она позволяет оценивать скорость изменения функции ошибки относительно весов сети.
Для простой функции ошибки (E(w)), где (w) — вектор весов, производная по одному из весов (w_i) вычисляется как:
[ ]
Эта величина показывает, насколько сильно ошибка изменится при небольшом увеличении веса (w_i). Если производная положительна, увеличение веса увеличивает ошибку; если отрицательна — уменьшает.
Градиент — это вектор всех частных производных функции ошибки по весам сети:
[ E = ]
В контексте Brain.js градиент используется при обучении сети методом обратного распространения ошибки (backpropagation). На каждом шаге алгоритм вычисляет градиент и корректирует веса в направлении, противоположном градиенту, чтобы минимизировать ошибку.
Brain.js скрывает большую часть внутренней работы, но базовые принципы остаются стандартными:
Прямое распространение (Forward Propagation) Входные данные проходят через сеть, вычисляются активации нейронов. Выход сети сравнивается с ожидаемым результатом, формируя функцию ошибки.
Вычисление градиента (Backpropagation) Для каждого нейрона вычисляется частная производная функции ошибки по его весам. В Brain.js это реализовано через автоматическое дифференцирование внутренних функций активации, таких как сигмоида, tanh или ReLU.
Обновление весов Вес обновляется по правилу:
[ w_i := w_i - ]
где () — скорость обучения (learning rate), контролирующая величину шага в направлении уменьшения ошибки.
Сигмоида ( (x) = ) Производная: [ ’(x) = (x)(1 - (x))] Позволяет эффективно вычислять градиенты без повторного пересчёта экспоненты.
ReLU ( f(x) = (0, x) ) Производная: [ f’(x) = ] Простота производной делает вычисление градиента быстрым, но может приводить к “мертвым нейронам”, если активация часто оказывается отрицательной.
tanh ( (x) ) Производная: [ (x) = 1 - ^2(x)] Центрированность вокруг нуля улучшает сходимость градиентного спуска.
В Brain.js градиенты не требуется вычислять вручную. Основной интерфейс работы с сетью выглядит так:
const brain = require('brain.js');
const net = new brain.NeuralNetwork({ hiddenLayers: [3] });
net.train([
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
], {
learningRate: 0.3,
iterations: 20000
});
Параметр learningRate напрямую влияет на величину
корректировки весов по градиенту. Большое значение ускоряет обучение, но
может сделать его нестабильным; малое значение замедляет сходимость, но
делает процесс более плавным.
В многослойной сети градиент каждого веса вычисляется с помощью цепного правила:
[ = ]
Brain.js автоматически применяет эту формулу ко всем слоям, вычисляя градиенты для каждого веса и смещения.
Производные и градиенты — фундаментальные инструменты для настройки нейросетей. Brain.js скрывает большую часть математической сложности, но понимание того, как вычисляются производные функций активации и ошибки, помогает оптимально настраивать параметры обучения, выбирать архитектуру сети и управлять сходимостью. Правильное использование градиента обеспечивает стабильное обучение и высокую точность модели на практике.