Класс FullyConnectedLayer

FullyConnectedLayer — это основной строительный блок многослойных нейронных сетей в ConvNetJS, реализующий полносвязный (dense) слой. Каждый нейрон данного слоя соединен со всеми нейронами предыдущего слоя, что позволяет эффективно обучать модели, способные выявлять сложные зависимости между входными признаками.

Конструктор и параметры

Создание полносвязного слоя осуществляется через объект ConvNetJS.Layer с указанием типа fc. Основные параметры конструктора:

  • num_neurons — количество нейронов в слое. Обязательный параметр.
  • activation — функция активации, которая будет применяться к каждому нейрону. Поддерживаемые значения: 'relu', 'sigmoid', 'tanh', 'linear'. По умолчанию используется 'relu'.
  • drop_prob — вероятность случайного отключения нейронов (dropout) для регуляризации. Диапазон: 0–1, по умолчанию 0 (отсутствует).
  • bias_pref — смещение по умолчанию для всех нейронов, полезно для ускорения сходимости. Значение по умолчанию — 0.
  • weight_decay — коэффициент регуляризации весов, который используется для предотвращения переобучения. По умолчанию 0.

Пример создания слоя:

var layer_def = {
  type: 'fc',
  num_neurons: 128,
  activation: 'relu',
  drop_prob: 0.2,
  bias_pref: 0.1
};
var fc_layer = new convnetjs.FullyConnectedLayer(layer_def);

Структура данных слоя

Каждый полносвязный слой хранит веса и смещения в виде объектов Vol (объект объема данных, используемый в ConvNetJS):

  • filters — матрица весов размером [num_inputs x num_neurons].
  • biases — вектор смещений длиной num_neurons.
  • out_act — выходной объем активаций после применения функции активации.
  • in_act — входной объем, поступающий от предыдущего слоя, используется для обратного распространения ошибки.

Прямое распространение (forward pass)

Метод forward вычисляет активации слоя на основе входного объема V. Алгоритм работы:

  1. Умножение входного вектора на матрицу весов.
  2. Добавление смещений.
  3. Применение функции активации.
  4. Применение dropout при необходимости (выбор случайных нейронов для отключения).

Формально:

[ y = f(W x + b)]

где (x) — входной вектор, (W) — матрица весов, (b) — вектор смещений, (f) — функция активации.

Пример использования:

var input_vol = new convnetjs.Vol([1, 0, 1, 0]); // пример входного объема
fc_layer.forward(input_vol, true); // true включает тренировочный режим
console.log(fc_layer.out_act);

Обратное распространение (backward pass)

Метод backward рассчитывает градиенты функции потерь по входам и обновляет градиенты весов и смещений:

  1. Расчет градиента по активации: учитывается производная функции активации.
  2. Умножение на транспонированную матрицу весов для получения градиента по входу.
  3. Градиенты весов и смещений накапливаются в filters и biases.

Пример:

fc_layer.backward();

Обратное распространение корректно работает вместе с dropout, игнорируя отключенные нейроны.

Методы обновления весов

Для оптимизации ConvNetJS предоставляет класс Trainer, который работает с FullyConnectedLayer. Основные параметры оптимизатора:

  • learning_rate — скорость обучения.
  • momentum — импульс для сглаживания обновлений весов.
  • l2_decay — L2-регуляризация для весов.

Пример настройки тренера:

var trainer = new convnetjs.SGDTrainer(net, {
  learning_rate: 0.01,
  momentum: 0.9,
  l2_decay: 0.001
});

Обновление весов происходит автоматически при вызове метода train:

trainer.train(x, y); // x — входной Vol, y — целевой индекс класса

Dropout и регуляризация

Dropout в FullyConnectedLayer реализован как случайное обнуление нейронов на каждом обучающем шаге с вероятностью drop_prob. На этапе тестирования все нейроны активны, а их выходы масштабируются на коэффициент 1 - drop_prob для сохранения ожидаемого значения.

Регуляризация весов через weight_decay добавляет к градиенту каждого веса член:

[ _{w} += w]

что препятствует чрезмерному росту весов и снижает риск переобучения.

Интеграция с другими слоями

Полносвязные слои часто используют после свёрточных слоев или в составе многослойных перцептронов. Для этого необходимо выровнять выходной объем предыдущего слоя в одномерный вектор с помощью слоя flatten или встроенных методов ConvNetJS.

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

  • Для больших слоев стоит использовать функцию активации 'relu' для ускорения сходимости.
  • Dropout рекомендуется применять только в тренировочном режиме.
  • Смещения bias_pref часто задаются небольшим положительным числом (0.1) для улучшения работы ReLU.
  • Мониторинг градиентов помогает избежать взрыва градиентов, особенно при больших num_neurons.

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