Валидация в процессе обучения: validation_split и validation_data

В процессе обучения нейронных сетей одной из ключевых задач является оценка качества модели на данных, которые не использовались при её настройке. В Keras.js (и Keras для Python, на котором она основана) существует два основных способа организации валидации: через параметр validation_split и через передачу отдельного набора данных в validation_data. Оба подхода позволяют контролировать переобучение и корректно отслеживать метрики модели в процессе обучения.


validation_split

Описание и принцип работы Параметр validation_split используется для автоматического разделения исходного набора данных на обучающую и валидационную части. Он принимает значение в диапазоне от 0 до 1, которое определяет долю исходных данных, выделяемую для валидации.

Ключевые особенности:

  • Деление происходит по последней размерности массива данных.
  • Данные для валидации отбираются из конца массива, а обучающие данные — из начала.
  • Применяется только к массидам, которые передаются напрямую в fit. Не работает с генераторами данных или Dataset объектов.

Пример использования:

const model = new KerasJS.Model({
  filepath: 'model.json'
});

const xTrain = ...; // Массив признаков
const yTrain = ...; // Массив меток

model.fit(xTrain, yTrain, {
  batchSize: 32,
  epochs: 50,
  validationSplit: 0.2
}).then(info => {
  console.log('История обучения:', info);
});

В этом примере 20% данных автоматически выделяются для валидации, и Keras.js будет вычислять метрики на этой части данных после каждой эпохи.

Преимущества validation_split:

  • Простота использования, не требует отдельного создания массивов.
  • Быстрое тестирование модели на небольшой части данных.

Ограничения:

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

validation_data

Описание и принцип работы Параметр validation_data позволяет передавать отдельно подготовленный набор данных для валидации. Он может быть представлен как кортеж [xVal, yVal] или как объект с дополнительными метками, если требуется специфическая обработка.

Ключевые особенности:

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

Пример использования:

const xTrain = ...;
const yTrain = ...;
const xVal = ...;
const yVal = ...;

model.fit(xTrain, yTrain, {
  batchSize: 32,
  epochs: 50,
  validationData: [xVal, yVal]
}).then(info => {
  console.log('История обучения с валидацией:', info);
});

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

Преимущества validation_data:

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

Ограничения:

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

Сравнение подходов

Параметр Простота Контроль Использование с потоками Ограничения
validation_split Высокая Низкий Нет Деление происходит только по последней размерности массива
validation_data Средняя Высокий Да Требует явного набора данных

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

  1. Для быстрого прототипирования: использовать validation_split, особенно когда данные представлены в виде массивов.
  2. Для точной оценки модели: выделять отдельный набор данных и передавать его через validation_data.
  3. Для потоковых данных: использовать только validation_data, так как validation_split неприменим.
  4. При использовании validation_split рекомендуется перемешивать данные заранее, чтобы избежать систематической ошибки при разделении.

Метрики в процессе валидации

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

model.fit(...).then(info => {
  console.log(info.history.loss);          // Потери на обучении
  console.log(info.history.val_loss);      // Потери на валидации
  console.log(info.history.accuracy);      // Точность на обучении
  console.log(info.history.val_accuracy);  // Точность на валидации
});

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


Рекомендации по сочетанию

Иногда целесообразно комбинировать оба метода: использовать validation_split для быстрой оценки на небольших данных и validation_data для финальной проверки модели на полностью независимом наборе. Такой подход обеспечивает баланс между скоростью эксперимента и достоверностью метрик.