Устройство входного слоя

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

Формат данных для входного слоя

Входные данные в Brain.js обычно передаются в виде объектов или массивов чисел. Формат зависит от типа сети:

  • Feedforward и NeuralNetwork используют массивы чисел [x1, x2, x3, …] или объекты { input1: 0.5, input2: 0.8 }.
  • Recurrent сети (например, LSTM) работают с последовательностями данных, представленных в виде массивов чисел или строк.

Все значения входного слоя должны быть нормализованы. Brain.js ожидает числа в диапазоне от 0 до 1. Для категориальных данных используется one-hot encoding, превращающий каждый возможный вариант в бинарный вектор. Например, для трёх категорий:

{ A: [1,0,0], B: [0,1,0], C: [0,0,1] }

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

Количество нейронов во входном слое

Количество нейронов входного слоя должно соответствовать числу признаков в наборе данных. Каждый нейрон отвечает за один признак. Например, если используется объект с тремя ключами:

{ temperature: 0.7, humidity: 0.4, wind: 0.2 }

— входной слой должен содержать три нейрона. Несоответствие количества нейронов и признаков приведет к ошибкам при обучении.

Предварительная обработка данных

  • Нормализация чисел: Приведение значений к диапазону [0,1]. Для отрицательных значений можно использовать сдвиг и масштабирование.
  • One-hot кодирование: Для категориальных данных с дискретными значениями.
  • Скалирование последовательностей: В рекуррентных сетях важно привести длины последовательностей к одинаковому размеру либо использовать динамическое пакетирование.

Связь с скрытыми слоями

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

[ y_j = f({i} w{ij} x_i + b_j)]

где (x_i) — значение i-го входного нейрона, (w_{ij}) — вес между входным нейроном и j-ым нейроном скрытого слоя, (b_j) — смещение, (f) — функция активации.

Выбор функции активации

Brain.js поддерживает несколько типов функций активации для входного слоя и скрытых слоев:

  • sigmoid: классическая сигмоидальная функция, значения от 0 до 1. Подходит для бинарных задач.
  • relu: возвращает ноль для отрицательных значений и само значение для положительных. Часто используется в глубоких сетях.
  • tanh: диапазон от -1 до 1, полезна для нормализованных данных, содержащих отрицательные значения.

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

Пример создания входного слоя в Brain.js

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

const net = new brain.NeuralNetwork({
  inputSize: 3,           // количество нейронов входного слоя
  hiddenLayers: [5, 3],   // два скрытых слоя
  outputSize: 2,          // выходной слой
  activation: 'sigmoid'   // функция активации
});

const trainingData = [
  { input: [0.1, 0.2, 0.3], output: [1, 0] },
  { input: [0.5, 0.6, 0.7], output: [0, 1] }
];

net.train(trainingData);

В этом примере входной слой состоит из трёх нейронов, соответствующих трём признакам каждого обучающего примера. Каждый нейрон подает нормализованное значение в первый скрытый слой.

Роль смещений (bias)

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

Практические рекомендации

  • Всегда проверять диапазон значений входных данных.
  • При работе с текстовыми данными использовать кодирование в числа.
  • Для больших наборов данных оптимально разбивать их на пакеты (batch), чтобы ускорить обучение.
  • Избегать слишком большого числа нейронов во входном слое, если признаки коррелируют, чтобы снизить переобучение.

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