Гистограммы весов и активаций

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

Основные концепции

Веса (Weights) — это параметры слоёв, которые обучаются в процессе оптимизации модели. Их распределение может показывать, насколько хорошо сеть обучается, и позволяют диагностировать проблемы, например, слишком малые или слишком большие значения весов.

Активации (Activations) — выходные значения слоёв после применения функции активации. Гистограммы активаций помогают понять, насколько эффективно проходят сигналы через сеть, выявить «мертвые» нейроны или затухающие значения.

Создание модели и получение весов

В TensorFlow.js модель можно создать с использованием tf.sequential или tf.model. Пример создания простой модели:

const model = tf.sequential();
model.add(tf.layers.dense({units: 64, activation: 'relu', inputShape: [100]}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
model.compile({optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy']});

Для извлечения весов используется метод getWeights():

const weights = model.layers[0].getWeights(); // возвращает массив тензоров

Каждый тензор весов можно конвертировать в массив чисел для построения гистограммы:

const weightsArray = await weights[0].array();

Гистограммы весов

Построение гистограммы весов помогает определить распределение значений и выявить аномалии. Например:

  • Слишком маленькие веса могут указывать на проблемы с инициализацией.
  • Слишком большие веса — на возможное взрывное поведение градиентов.
  • Симметричное распределение около нуля часто встречается при нормальной инициализации.

Пример построения гистограммы с использованием сторонней библиотеки визуализации, например Plotly:

const flattenedWeights = weightsArray.flat();
const trace = {
  x: flattenedWeights,
  type: 'histogram'
};
Plotly.newPlot('weightHistogram', [trace]);

Гистограммы активаций

Для анализа активаций необходимо получить выходные значения слоя для некоторого входного тензора. В TensorFlow.js это можно сделать через метод predict и tf.model.predict:

const input = tf.randomNormal([1, 100]);
const activations = model.layers[0].apply(input);
const activationsArray = await activations.array();

Гистограмма активаций позволяет оценить, как распределены значения после функции активации:

  • Большинство нулей при ReLU может указывать на «мертвые» нейроны.
  • Сильное смещение значений при сигмоидной или tanh активации может вызвать затухание градиентов.
  • Равномерное распределение вокруг нуля обычно свидетельствует о корректной работе сети.

Автоматизация и мониторинг

TensorFlow.js совместим с tfvis — библиотекой визуализации данных и моделей. Она позволяет автоматически строить гистограммы весов и активаций во время обучения:

const surface = { name: 'Layer Weights', tab: 'Model Inspection' };
tfvis.show.layer(model.layers[0], surface);

Также tfvis поддерживает мониторинг распределений во время тренировки с использованием callback:

await model.fit(xTrain, yTrain, {
  epochs: 20,
  callbacks: tfvis.show.fitCallbacks(
    { name: 'Training Performance' },
    ['loss', 'acc'],
    { height: 200, callbacks: ['onEpochEnd'] }
  )
});

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

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

  • Следить за масштабом весов и активаций на каждом слое, особенно при использовании глубоких сетей.
  • Использовать инициализацию He или Xavier для предотвращения исчезающих/взрывающихся градиентов.
  • Регулярно проверять гистограммы при изменении архитектуры модели или функции активации.
  • В случае аномальных распределений использовать регуляризацию или нормализацию слоёв.

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