Заморозка слоёв

Заморозка слоёв является ключевым приёмом в процессе дообучения (transfer learning) нейронных сетей. Основная идея заключается в том, чтобы сохранить веса уже обученных слоёв неизменными, фокусируя обучение на новых слоях, адаптированных под конкретную задачу.


Основные понятия

Слой (Layer) — это базовый строительный блок модели, который выполняет математические преобразования входных данных. В TensorFlow.js слои создаются через tf.layers.

Заморозка слоя означает установку свойства trainable в значение false. В результате градиенты для этого слоя не вычисляются, и веса слоя остаются неизменными во время обучения.

const layer = tf.layers.dense({ units: 128, activation: 'relu' });
layer.trainable = false;

Применение в transfer learning

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

  1. Загрузка предобученной модели:
const mobilenet = await tf.loadLayersModel('https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json');
  1. Заморозка всех слоёв кроме последних:
for (const layer of mobilenet.layers) {
  layer.trainable = false;
}

// Добавление нового классификатора
const x = mobilenet.outputs[0];
const newOutput = tf.layers.dense({ units: 10, activation: 'softmax' }).apply(x);
const model = tf.model({ inputs: mobilenet.inputs, outputs: newOutput });
  1. Компиляция и обучение модели:
model.compile({
  optimizer: tf.train.adam(),
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});

await model.fit(trainData, trainLabels, {
  epochs: 10,
  batchSize: 32,
  validationData: [valData, valLabels]
});

Замороженные слои сохраняют предобученные признаки, ускоряя обучение и снижая риск переобучения на малых данных.


Заморозка отдельных слоёв

В некоторых сценариях требуется замораживать только часть слоёв:

mobilenet.layers[0].trainable = false; // Заморозка первого слоя
mobilenet.layers[1].trainable = false; // Заморозка второго слоя

Можно комбинировать заморозку с fine-tuning, постепенно разблокируя слои:

for (let i = 0; i < mobilenet.layers.length; i++) {
  mobilenet.layers[i].trainable = i >= 50; // Разблокировать последние слои
}

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


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

  • Скорость обучения: замороженные слои не вычисляют градиенты, что снижает нагрузку на GPU/CPU.
  • Стабильность: базовые слои сохраняют общие признаки, предотвращая разрушение уже обученных весов.
  • Регуляризация: уменьшение числа обучаемых параметров снижает вероятность переобучения.

Особенности TensorFlow.js

  1. Свойство trainable действует только до компиляции модели. После компиляции изменение не повлияет на обучение, поэтому заморозку нужно выполнять до вызова model.compile().

  2. Масштабирование и нормализация: при заморозке слоёв следует учитывать, что предобученные модели часто ожидают определённый диапазон входных данных (например, [0,1] или [-1,1]). Несоответствие входного формата может снизить эффективность замороженных слоёв.

  3. Сохранение модели: при сохранении модели через model.save() информация о том, какие слои заморожены, сохраняется автоматически.

await model.save('localstorage://my-model');
  1. Гибридные подходы: TensorFlow.js позволяет комбинировать слои из нескольких моделей, замораживая одни и обучая другие. Это особенно полезно для мультимодальных данных, где часть признаков извлекается из изображений, а другая — из текста.

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

  • Всегда замораживать слои перед компиляцией.
  • Начинать обучение с замороженными базовыми слоями, затем постепенно разблокировать слои для fine-tuning.
  • Проверять совместимость входных данных с предобученной моделью.
  • Замораживание больших моделей помогает экономить память и ускоряет обучение в браузере.

Заморозка слоёв — фундаментальный инструмент при работе с предобученными моделями в TensorFlow.js. Она обеспечивает баланс между сохранением уже изученных признаков и адаптацией модели к новой задаче, позволяя эффективно использовать ресурсы и улучшать качество обучения.