Заморозка слоёв: trainable = false

В Keras.js, как и в Keras для Python, каждый слой модели имеет атрибут trainable, который определяет, будут ли веса слоя обновляться в процессе обучения. Установка trainable = false позволяет заморозить слой, предотвращая изменение его параметров во время обучения, что особенно полезно при использовании предобученных моделей или при поэтапной тренировке сложных нейронных сетей.


Механизм работы

Когда слой помечен как trainable = false:

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

Пример настройки слоя:

const denseLayer = new KerasJS.layers.Dense({
  units: 128,
  activation: 'relu',
  inputShape: [64]
});

denseLayer.trainable = false;

После этого веса denseLayer останутся фиксированными при обучении модели.


Использование в предобученных моделях

Частая практика — использование предобученных моделей, например, VGG16 или MobileNet, для извлечения признаков. В таких случаях:

  1. Загружается предобученная модель.
  2. Замораживаются все слои, кроме последних.
  3. Добавляются новые слои, которые будут обучаться под конкретную задачу.

Пример:

const KerasJS = require('keras-js');

const vgg16 = new KerasJS.Model({
  filepath: 'vgg16_model.bin',
  gpu: true
});

// Заморозка всех слоёв
vgg16.layers.forEach(layer => layer.trainable = false);

// Добавление нового слоя классификации
const newLayer = new KerasJS.layers.Dense({ units: 10, activation: 'softmax' });
newLayer.trainable = true;
vgg16.add(newLayer);

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


Заморозка и разморозка на этапе обучения

Keras.js позволяет динамически менять состояние слоя:

denseLayer.trainable = false;  // заморозка
denseLayer.trainable = true;   // разморозка

Это удобно для пошаговой тренировки модели:

  1. Сначала обучаются только новые слои.
  2. После достижения стабильной точности можно разморозить часть предобученных слоёв для тонкой настройки.

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


Влияние на оптимизатор

Важно понимать, что установка trainable = false влияет только на градиенты и обновление весов, но не отключает слой в прямом проходе (forward pass). Слой продолжает участвовать в вычислении выходов и влияет на итоговую ошибку.

Например:

const input = new KerasJS.layers.Input({ shape: [64] });
const frozenLayer = new KerasJS.layers.Dense({ units: 32, activation: 'relu' });
frozenLayer.trainable = false;

const output = frozenLayer.apply(input);

Даже при замороженных весах, output зависит от входных данных и веса слоя используются при вычислении результата.


Практические рекомендации

  • Замораживать только проверенные слои. Если слой имеет нестабильные веса, заморозка может снизить качество обучения.
  • Комбинировать заморозку и fine-tuning. Сначала тренировка новых слоёв, затем постепенная разморозка старых.
  • Следить за trainable каждого слоя при загрузке предобученной модели, особенно если используется конвертация из Python Keras.
  • Оптимизировать производительность: замороженные слои не требуют вычисления градиентов, что ускоряет обучение на больших моделях.

Заморозка слоёв в функциональном API

Keras.js поддерживает функциональный подход:

const input = new KerasJS.layers.Input({ shape: [224, 224, 3] });
const conv1 = new KerasJS.layers.Conv2D({ filters: 64, kernelSize: 3, activation: 'relu' });
conv1.trainable = false;

const conv2 = new KerasJS.layers.Conv2D({ filters: 128, kernelSize: 3, activation: 'relu' });
conv2.trainable = true;

const x = conv1.apply(input);
const y = conv2.apply(x);

const model = new KerasJS.Model({ inputs: input, outputs: y });

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


Отличия от Keras на Python

В Keras.js:

  • Нет автоматической функции model.trainable = False для всей модели. Замораживать нужно каждый слой вручную.
  • Атрибут trainable не влияет на сохранение весов, только на обучение.
  • Замороженные слои сохраняют структуру модели и участвуют в прямом проходе.

Эффективное использование trainable = false позволяет экономить ресурсы, избегать переобучения и точно управлять обучаемостью слоёв в Keras.js, что особенно важно при работе с крупными предобученными моделями и задачами компьютерного зрения.