Инициализаторы весов

Инициализация весов является фундаментальной частью построения нейронных сетей. Она напрямую влияет на скорость сходимости модели и стабильность обучения. В Keras.js, как и в Keras для Python, поддерживается множество стандартных и настраиваемых инициализаторов весов, позволяющих контролировать распределение начальных значений параметров сети.

Принципы работы инициализаторов

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

  • Затухающие градиенты: слишком малые веса приводят к медленному обучению глубоких сетей.
  • Взрывающиеся градиенты: слишком большие веса вызывают нестабильность градиентов.

Keras.js наследует концепцию распределений и функций из оригинальной библиотеки Keras, обеспечивая совместимость моделей, обученных на Python, для запуска в браузере на JavaScript.

Стандартные инициализаторы

Keras.js поддерживает несколько встроенных методов инициализации, которые применяются через свойство kernelInitializer (для весов) и biasInitializer (для смещений) слоя.

1. Zeros Все веса и смещения устанавливаются равными нулю. Используется редко, так как одинаковые веса для всех нейронов приводят к симметричному обновлению градиентов.

2. Ones Все веса равны единице. Практическое применение ограничено случаями, когда требуется задать единичные значения как базу для дальнейшей оптимизации.

3. RandomUniform Веса инициализируются случайными числами из равномерного распределения в заданном диапазоне [minval, maxval].

const layer = {
    type: 'Dense',
    units: 64,
    kernelInitializer: { class_name: 'RandomUniform', config: { minval: -0.05, maxval: 0.05 } }
};

4. RandomNormal Инициализация весов из нормального распределения с заданными средним mean и стандартным отклонением stddev.

5. HeNormal и HeUniform Инициализация по Хе (He), оптимизированная для слоев с активацией ReLU. Распределение весов масштабируется в зависимости от числа входных нейронов:

  • HeNormal – нормальное распределение
  • HeUniform – равномерное распределение

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

6. GlorotNormal и GlorotUniform (Xavier) Инициализация по Ксавьеру подходит для tanh и sigmoid активаций. Весы выбираются так, чтобы дисперсия сигналов оставалась примерно одинаковой на входе и выходе слоя:

const denseLayer = {
    type: 'Dense',
    units: 128,
    kernelInitializer: { class_name: 'GlorotNormal', config: {} }
};

Создание пользовательских инициализаторов

Keras.js позволяет создавать свои инициализаторы, задавая функцию генерации значений. Основная структура пользовательского инициализатора включает:

  • Метод apply(shape) для генерации тензора заданной формы.
  • Использование стандартных распределений Math.random, Gaussian или других библиотек для генерации случайных чисел.

Пример простого инициализатора, генерирующего веса в диапазоне [-0.1, 0.1]:

function customInitializer(shape) {
    const values = [];
    const size = shape.reduce((a, b) => a * b, 1);
    for (let i = 0; i < size; i++) {
        values.push(Math.random() * 0.2 - 0.1);
    }
    return new Float32Array(values);
}

Этот инициализатор можно назначить конкретному слою через kernelInitializer.

Рекомендации по выбору инициализатора

  • Для ReLU и его производных рекомендуется использовать He-инициализацию.
  • Для сигмоидальных и tanh-активаций эффективна Glorot-инициализация.
  • Для небольших сетей или экспериментов можно применять RandomUniform или RandomNormal.
  • Инициализация нулями или единицами используется редко, чаще для смещений (biasInitializer).

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

Особенности использования в Keras.js

  • Все инициализаторы передаются как объекты с class_name и config, что обеспечивает совместимость с сохраненными моделями Keras.
  • Возможна загрузка предобученных весов, при этом инициализаторы не применяются повторно, так как веса уже определены.
  • Keras.js поддерживает все стандартные инициализаторы Keras, включая Glorot, He, Ones, Zeros, RandomUniform, RandomNormal, что делает переход между Python и JavaScript бесшовным.

Инициализация весов в Keras.js — это точный инструмент, позволяющий контролировать стартовые условия обучения сети, минимизировать проблемы с градиентами и повышать эффективность тренировки нейронных моделей прямо в браузере.