Transfer learning

Transfer learning — это методика машинного обучения, при которой знания, полученные при обучении одной модели на одной задаче, используются для ускорения и улучшения обучения модели на другой, часто смежной задаче. В контексте ConvNetJS это позволяет использовать предобученные сети для распознавания изображений или извлечения признаков без необходимости обучать модель с нуля.

Архитектура моделей и перенос знаний

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

  • Input Layer — слой ввода, который принимает изображения фиксированного размера.
  • Conv Layer — сверточный слой для извлечения локальных признаков.
  • Pooling Layer — слой подвыборки (max-pooling или average-pooling) для снижения размерности и инвариантности к смещениям.
  • Fully Connected Layer — полносвязный слой для объединения признаков и классификации.
  • Softmax Layer — выходной слой для вероятностной классификации.

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

Использование предобученных сетей в ConvNetJS

ConvNetJS не имеет встроенного каталога предобученных моделей, но поддерживает импорт весов через JSON-формат, экспортируемый из других реализаций или из предыдущих тренировок. Типичный процесс:

  1. Создание исходной сети с архитектурой, аналогичной предобученной модели.
  2. Загрузка весов в ConvNetJS через метод net.fromJSON(json).
  3. Заморозка слоев для сохранения предобученных признаков, с помощью установки флага layer.trainable = false.
  4. Добавление новых слоев для специфической задачи.
  5. Тонкая настройка (fine-tuning) только последних слоев для адаптации к новой выборке.

Пример создания и заморозки слоев:

var layer_defs = [];
layer_defs.push({type:'input', out_sx:32, out_sy:32, out_depth:3});
layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'fc', num_neurons:64, activation:'relu'});
layer_defs.push({type:'softmax', num_classes:10});

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

// Заморозка всех сверточных слоев
for(var i=0;i<net.layers.length;i++){
    if(net.layers[i].layer_type === 'conv'){
        net.layers[i].trainable = false;
    }
}

Тонкая настройка (Fine-tuning)

Fine-tuning — это процесс дообучения верхних слоев модели с использованием новой выборки. В ConvNetJS он осуществляется обычным методом trainer.train(x, y), но с учетом, что часть слоев заморожена. Основные рекомендации:

  • Использовать меньший learning rate для сохранения полезных признаков.
  • Обучать новые слои дольше, сверточные — минимально.
  • Применять dropout и регуляризацию для предотвращения переобучения на маленьких датасетах.

Пример создания тренера для fine-tuning:

var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.001, momentum:0.9, batch_size:32, l2_decay:0.001});

Использование ConvNetJS для извлечения признаков

Иногда цель — не классификация, а извлечение признаков для других алгоритмов. В таком случае используется выход промежуточного слоя сети. ConvNetJS позволяет получать эти признаки через метод net.forward(x, layer_index). Пример:

var x = new convnetjs.Vol(32, 32, 3); // изображение
var features = net.forward(x, 3); // выход третьего слоя (fc)

Эти признаки можно передавать в SVM, kNN или любую другую модель.

Ограничения и особенности ConvNetJS

  • ConvNetJS работает полностью на JavaScript и в браузере, что ограничивает размер моделей и скорость обучения.
  • Отсутствует поддержка GPU в стандартной реализации, поэтому обучение больших сетей медленное.
  • Поддерживает только базовые операции для transfer learning: заморозку слоев, загрузку/сохранение весов, forward-pass.

Примеры сценариев применения

  1. Классификация новых категорий изображений с небольшим датасетом, используя предобученные сверточные слои.
  2. Извлечение признаков для кластеризации или поиска похожих изображений.
  3. Адаптация модели под специфическую визуальную задачу, например, распознавание жестов или определение объектов в медицинских снимках.

Transfer learning в ConvNetJS — мощный инструмент для быстрого прототипирования моделей и работы с ограниченными ресурсами, позволяющий переиспользовать уже изученные слои и значительно ускорять обучение.