Инициализация весов является критически важным этапом при создании и обучении нейронных сетей. Правильная инициализация позволяет избежать проблем с затухающим и взрывающимся градиентом, ускоряет сходимость и улучшает качество обучения. В библиотеке Synaptic.js предусмотрены возможности для управления начальными весами, что делает её гибкой для экспериментов с различными стратегиями инициализации. Наиболее часто применяются методы Xavier (Glorot) и He, которые обеспечивают правильное масштабирование весов в зависимости от структуры сети.
Метод Xavier предложен для сетей с функциями активации, такими как tanh или логистическая сигмоида, где важно сохранять дисперсию сигналов на входе и выходе каждого слоя примерно одинаковой. Смысл подхода заключается в выборе весов из случайного распределения с дисперсией, зависящей от числа нейронов на входе и выходе слоя.
Формулы для распределения весов:
[ W (0, )]
[ W U]
где ( n_ ) — число входов нейрона, ( n_ ) — число выходов.
Применение в Synaptic:
Synaptic по умолчанию инициализирует веса небольшими случайными
числами, но библиотека позволяет вручную задавать веса через свойства
Neuron или Layer. Для реализации Xavier можно
создать функцию, которая пересчитывает веса после создания сети:
function xavierInit(layer) {
const n_in = layer.list[0].connections.inputs.length;
const n_out = layer.list.length;
const limit = Math.sqrt(6 / (n_in + n_out));
layer.list.forEach(neuron => {
for (let key in neuron.connections.inputs) {
neuron.connections.inputs[key].weight = Math.random() * 2 * limit - limit;
}
});
}
Эта функция перебирает все нейроны слоя и присваивает случайные веса в диапазоне, рассчитанном по методу Xavier.
Метод He (He et al.) был предложен специально для сетей с ReLU-подобными функциями активации, где отрицательные значения обнуляются, а дисперсия активностей уменьшается. Инициализация по He масштабирует веса так, чтобы компенсировать это снижение дисперсии.
Формула для нормального распределения:
[ W (0, )]
Для равномерного распределения:
[ W U]
Здесь используется только число входов ( n_ ), без учета числа выходов.
Применение в Synaptic:
function heInit(layer) {
const n_in = layer.list[0].connections.inputs.length;
const limit = Math.sqrt(6 / n_in);
layer.list.forEach(neuron => {
for (let key in neuron.connections.inputs) {
neuron.connections.inputs[key].weight = Math.random() * 2 * limit - limit;
}
});
}
Такой подход обеспечивает, что значения на выходах слоя ReLU сохраняют достаточную дисперсию и позволяют градиенту корректно проходить через слои.
| Метод | Подходит для функций активации | Расчет дисперсии | Замечания |
|---|---|---|---|
| Xavier | tanh, sigmoid | () | Универсален для гладких функций активации |
| He | ReLU, Leaky ReLU | () | Специально для ReLU, сохраняет дисперсию активаций |
Использование неподходящего метода инициализации может привести к медленной сходимости или проблемам с градиентами. Например, применение Xavier для ReLU часто приводит к уменьшению дисперсии на последующих слоях, что замедляет обучение.
Правильная инициализация весов — фундамент эффективного обучения нейронных сетей. Методы Xavier и He обеспечивают сохранение дисперсии сигналов, ускоряют обучение и предотвращают проблемы с градиентами, делая Synaptic гибкой платформой для экспериментов с различными архитектурами и функциями активации.