Плотные слои: Dense

Плотный слой, или Dense, является фундаментальным строительным блоком большинства нейронных сетей. Он реализует обычный полносвязный слой, где каждый нейрон предыдущего слоя соединён с каждым нейроном текущего. В TensorFlow.js плотные слои предоставляются через класс tf.layers.dense.


Основные параметры Dense

  • units: количество нейронов в слое. Определяет размерность выходного тензора.

  • activation: функция активации, применяемая к выходу слоя. Популярные варианты:

    • 'relu' — Rectified Linear Unit, ускоряет сходимость в глубоких сетях.
    • 'sigmoid' — вывод в диапазоне [0,1], часто используется для бинарной классификации.
    • 'softmax' — нормализует выход в вероятности, применяется в задачах многоклассовой классификации.
  • useBias: логическое значение, указывающее, добавлять ли смещение (bias) к каждому нейрону. По умолчанию true.

  • kernelInitializer и biasInitializer: задают способ инициализации весов и смещений. Например, 'glorotUniform' или 'zeros'.

  • kernelRegularizer и biasRegularizer: регуляризация весов и смещений для предотвращения переобучения.

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

const denseLayer = tf.layers.dense({
  units: 64,
  activation: 'relu',
  useBias: true,
  kernelInitializer: 'glorotUniform',
  biasInitializer: 'zeros'
});

Связь с входными и выходными тензорами

Плотный слой принимает на вход тензор любой формы, кроме первой размерности, которая обычно соответствует размеру батча. Например, если входной тензор имеет форму [batchSize, inputDim], а units=32, выходной тензор будет иметь форму [batchSize, 32].

При последовательной передаче данных в модели:

const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [100], units: 50, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
  • inputShape указывается только для первого слоя.
  • Следующие слои автоматически подстраиваются под размерность предыдущего слоя.

Функции активации и их влияние

ReLU (Rectified Linear Unit):

  • Формула: f(x) = max(0, x)
  • Преимущества: уменьшает эффект исчезающего градиента, ускоряет обучение.
  • Ограничение: “мертвые нейроны” при слишком большом количестве отрицательных входов.

Sigmoid:

  • Формула: f(x) = 1 / (1 + exp(-x))
  • Применение: выход в диапазоне [0,1], удобно для вероятностей.
  • Ограничение: градиенты могут быстро исчезать на больших положительных или отрицательных значениях.

Softmax:

  • Преобразует вектор из n элементов в вероятностное распределение.
  • Используется на последнем слое для многоклассовой классификации.

Инициализация весов

Инициализация весов имеет ключевое значение для сходимости сети:

  • glorotUniform: равномерное распределение, учитывающее количество входов и выходов.
  • heNormal: применяется с ReLU-активацией для сохранения дисперсии сигналов.
  • zeros / ones: инициализация нулями или единицами, редко используется для скрытых слоев из-за потери разнообразия весов.

Пример инициализации:

tf.layers.dense({
  units: 128,
  activation: 'relu',
  kernelInitializer: 'heNormal'
});

Регуляризация Dense слоя

Регуляризация помогает предотвращать переобучение, добавляя штраф за слишком большие веса:

  • L1: сумма абсолютных значений весов.
  • L2: сумма квадратов весов.
  • Можно комбинировать для комплексной регуляризации:
tf.layers.dense({
  units: 64,
  kernelRegularizer: tf.regularizers.l2({l2: 0.01})
});

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

Слой можно использовать как функциональный блок вне модели:

const input = tf.tensor2d([[1, 2, 3, 4]], [1, 4]);
const dense = tf.layers.dense({units: 3, activation: 'relu'});
const output = dense.apply(input);
output.print();
  • Метод apply возвращает новый тензор, вычисленный на основе входа.
  • Полезно для динамического построения сетей и экспериментов.

Взаимодействие с другими слоями

Dense слои часто комбинируются с:

  • Dropout — случайное обнуление части нейронов для борьбы с переобучением.
  • BatchNormalization — нормализация активаций перед нелинейной функцией.
  • Conv2D — плотные слои после сверточных слоев для классификации.

Пример комбинации:

const model = tf.sequential();
model.add(tf.layers.conv2d({
  inputShape: [28, 28, 1],
  filters: 32,
  kernelSize: 3,
  activation: 'relu'
}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 128, activation: 'relu'}));
model.add(tf.layers.dropout({rate: 0.5}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));

Особенности Dense слоя в TensorFlow.js

  • Все вычисления выполняются на GPU через WebGL при наличии поддержки, что ускоряет обучение и вывод.
  • Поддерживаются функции активации и регуляризации как встроенные, так и пользовательские.
  • Возможность динамического изменения весов через setWeights и получения через getWeights.
  • Слои полностью совместимы с моделью tf.Sequential и функциональным API (tf.model).

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