Дообучение существующей модели

Дообучение (англ. retraining) — это процесс обновления уже обученной нейронной сети с новыми данными, не создавая модель с нуля. В Brain.js этот подход позволяет сохранять уже накопленные знания сети и адаптировать её к изменяющимся условиям.


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

Модели в Brain.js могут быть сохранены и восстановлены с помощью методов .toJSON() и .fromJSON(). Это ключевой элемент для организации дообучения.

const brain = require('brain.js');
const net = new brain.NeuralNetwork();

// Обучение на начальном наборе данных
net.train([
  { input: { red: 1, green: 0, blue: 0 }, output: { color: 1 } },
  { input: { red: 0, green: 1, blue: 0 }, output: { color: 0 } }
]);

// Сохранение состояния сети
const savedModel = net.toJSON();

// Восстановление модели
const restoredNet = new brain.NeuralNetwork();
restoredNet.fromJSON(savedModel);

Важно: toJSON() сохраняет структуру сети, веса и смещения нейронов. Это позволяет восстановить модель в точности такой же, какой она была после обучения, и продолжить тренировку на новых данных.


Подготовка данных для дообучения

Для эффективного дообучения необходимо убедиться, что новые данные соответствуют формату исходного обучения:

  • Входные данные (input) должны иметь те же ключи и нормализованное представление.
  • Выходные данные (output) должны быть совместимы с ранее использованной схемой кодирования.

Пример корректной подготовки новых данных:

const additionalData = [
  { input: { red: 0, green: 0, blue: 1 }, output: { color: 0.5 } },
  { input: { red: 1, green: 1, blue: 0 }, output: { color: 0.8 } }
];

Продолжение обучения существующей модели

После восстановления модели можно продолжить обучение с новым набором данных. В Brain.js метод .train() позволяет указать дополнительные параметры для более точной настройки:

  • iterations — количество циклов обучения.
  • learningRate — скорость обучения.
  • log — функция логирования прогресса.

Пример:

restoredNet.train(additionalData, {
  iterations: 2000,
  learningRate: 0.01,
  log: true,
  logPeriod: 100
});

Особенности дообучения:

  • Сеть сохраняет предыдущие знания и корректирует их с учетом новых данных.
  • Высокая скорость обучения возможна благодаря уже установленным весам.
  • Если новые данные сильно отличаются от исходных, может возникнуть «катастрофическое забывание», когда старые знания частично теряются. В таких случаях рекомендуется объединять старый и новый набор данных при дообучении.

Комбинирование старых и новых данных

Для предотвращения потери информации старые данные можно объединять с новыми:

const combinedData = [
  { input: { red: 1, green: 0, blue: 0 }, output: { color: 1 } },
  { input: { red: 0, green: 1, blue: 0 }, output: { color: 0 } },
  ...additionalData
];

restoredNet.train(combinedData, { iterations: 3000, learningRate: 0.01 });

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


Дообучение рекуррентных сетей (LSTM)

Brain.js поддерживает LSTM (Long Short-Term Memory), что полезно для последовательных данных, таких как текст. Принципы дообучения схожи:

const lstm = new brain.recurrent.LSTMNetwork();

// Изначальное обучение
lstm.train([
  { input: 'Привет', output: 'Здравствуйте' },
  { input: 'Как дела?', output: 'Хорошо' }
]);

const savedLSTM = lstm.toJSON();

// Дообучение на новых примерах
const newConversations = [
  { input: 'Доброе утро', output: 'Доброе утро!' },
  { input: 'Пока', output: 'До свидания' }
];

const lstmRestored = new brain.recurrent.LSTMNetwork();
lstmRestored.fromJSON(savedLSTM);
lstmRestored.train(newConversations, { iterations: 1000 });

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


Настройка параметров дообучения

Оптимизация процесса дообучения включает:

  • Скорость обучения (learningRate) — небольшие значения предотвращают переобучение новых данных.
  • Количество итераций (iterations) — баланс между точностью на новых данных и сохранением старых знаний.
  • Логирование (log и logPeriod) — отслеживание изменения функции потерь на каждом этапе.

Эти параметры позволяют гибко управлять обучением, предотвращая разрушение ранее изученных паттернов.


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

  1. Всегда сохранять модель после начального обучения.
  2. Подготовка новых данных должна строго соответствовать исходной структуре.
  3. Для предотвращения забывания использовать объединение старых и новых данных.
  4. Контролировать скорость обучения и количество итераций для стабильной адаптации.
  5. Тестировать дообученную модель на старых и новых данных для проверки качества знаний.

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