Нормальное распределение, также известное как гауссово распределение, характеризуется колоколообразной формой и симметричной плотностью вероятности относительно среднего значения. Математически функция плотности распределения описывается формулой:
[ f(x) = e^{-}]
где:
Нормальное распределение играет ключевую роль в статистике и машинном обучении благодаря свойству концентрировать большинство значений около среднего, что обеспечивает стабильность вычислений при работе с большими массивами данных.
Весовые коэффициенты в нейронных сетях определяют силу влияния входных сигналов на выходные. Правильная инициализация весов критически важна для:
Использование нормального распределения для генерации начальных весов позволяет равномерно распределить значения вокруг нуля, сохраняя среднее значение близким к нулю и контролируя дисперсию.
В TensorFlow.js для инициализации весов используются встроенные классы tf.initializers. Среди них:
tf.initializers.randomNormal — создаёт веса с
нормальным распределением, где можно задать среднее значение
(mean) и стандартное отклонение (stddev):const initializer = tf.initializers.randomNormal({
mean: 0,
stddev: 0.05,
seed: 42
});
const layer = tf.layers.dense({
units: 128,
kernelInitializer: initializer,
activation: 'relu'
});
seed обеспечивает воспроизводимость
результатов, что особенно важно при отладке и тестировании моделей.Использование нормального распределения с малым стандартным отклонением предотвращает сильные колебания на старте обучения, которые могут привести к нестабильным градиентам.
Кроме базового нормального распределения, применяются специализированные схемы:
He Initialization (He Normal) Формула: ( = ), где ( n_ ) — количество входов в слой. Подходит для ReLU-активаций, снижает вероятность затухания градиентов.
Xavier/Glorot Initialization (Glorot Normal) Формула: ( = ). Оптимальна для сигмоидальных и гиперболических тангенсовых активаций, обеспечивая равномерное распределение сигналов между слоями.
В TensorFlow.js эти схемы реализованы через:
const heInit = tf.initializers.heNormal();
const glorotInit = tf.initializers.glorotNormal();
Применение этих инициализаторов критически важно для глубоких сетей, где стандартная случайная инициализация может вызвать затухание градиентов.
Для проверки корректности инициализации удобно визуализировать распределение весов:
const weights = layer.getWeights()[0].dataSync();
const mean = weights.reduce((sum, w) => sum + w, 0) / weights.length;
console.log(`Среднее значение весов: ${mean.toFixed(4)}`);
Такая проверка позволяет убедиться, что распределение близко к нормальному и отсутствуют аномально большие или маленькие значения.
Использование нормального распределения для инициализации весов обеспечивает:
Эти свойства делают нормальное распределение фундаментальным инструментом при проектировании и обучении нейронных сетей в TensorFlow.js.