Сравнение весов и выходов

В TensorFlow.js веса модели представляют собой тензоры, которые определяют поведение нейронной сети. Каждый слой сети хранит свои веса и смещения, которые обновляются в процессе обучения методом обратного распространения ошибки. Работа с весами включает следующие ключевые операции:

  • Извлечение весов слоя: метод layer.getWeights() возвращает массив тензоров, где первый элемент — веса, а второй — смещения (если они есть).
  • Установка весов слоя: метод layer.setWeights(weightsArray) позволяет программно задать новые значения весов, где weightsArray — массив тензоров той же формы, что и оригинальные веса.

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

Визуализация и сравнение весов

Сравнение весов часто используется для:

  • анализа изменений модели после обучения,
  • отладки переобучения или недообучения,
  • экспериментов с переносом весов между моделями.

Для визуализации весов применяются методы преобразования тензоров в массивы JavaScript с помощью tensor.array() или tensor.dataSync(). Это позволяет строить графики, выводить статистику или выполнять сравнение:

const weights1 = model1.layers[0].getWeights()[0].dataSync();
const weights2 = model2.layers[0].getWeights()[0].dataSync();

const differences = weights1.map((w, i) => w - weights2[i]);
const maxDifference = Math.max(...differences.map(Math.abs));

Такое сравнение позволяет оценить максимальные отклонения весов между моделями и выявить слои с наибольшими изменениями.

Сравнение выходов слоев

Выходы нейронных сетей, также называемые активациями, демонстрируют реакцию сети на конкретный вход. В TensorFlow.js их можно получить с помощью создания промежуточной модели:

const layerOutputs = model.layers.map(layer => layer.output);
const activationModel = tf.model({inputs: model.input, outputs: layerOutputs});
const activations = activationModel.predict(inputTensor);

Основные аспекты анализа активаций:

  • Размерность тензора — зависит от формы входных данных и архитектуры сети. Например, сверточные слои возвращают тензоры 4D [batch, height, width, channels].
  • Статистические метрики — среднее, стандартное отклонение, максимум и минимум позволяют оценить насыщение нейронов.
  • Визуализация карт признаков — полезна для сверточных сетей, чтобы понять, какие признаки извлекаются на каждом уровне.

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

const diffActivations = activations1.map((act, i) =>
  tf.sub(act, activations2[i])
);
const maxDiff = diffActivations.map(t => t.max().dataSync()[0]);

Это дает количественное представление о том, какие слои изменились сильнее всего.

Синхронизация весов и выходов

В некоторых задачах требуется сопоставить веса и активации для анализа влияния конкретных параметров на выход. Например:

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

Для детального анализа применяются техники нормализации и стандартные меры расстояния:

  • Косинусная схожесть между векторами весов и активаций,
  • Евклидово расстояние для сравнения выходов слоев,
  • Корреляция Пирсона для оценки линейной зависимости между весами и активациями.

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

  • Сохранять промежуточные веса и активации после ключевых этапов обучения. Это позволяет проводить ретроспективный анализ и предотвращает потерю данных.
  • Использовать tf.tidy() для освобождения памяти при работе с большим количеством тензоров, особенно при сравнении слоев.
  • Для больших моделей рекомендуется сравнивать только ключевые слои, чтобы ускорить анализ и избежать переполнения памяти.

Пример интеграции сравнения в рабочий процесс

  1. Создать две версии модели: до обучения и после обучения.
  2. Извлечь веса ключевых слоев и вычислить разности.
  3. Создать промежуточную модель для получения активаций на одинаковом входе.
  4. Сравнить активации по выбранным метрикам.
  5. Выявить закономерности: какие изменения в весах приводят к наибольшим сдвигам в выходах.

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