Разбиение на train, validation и test

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

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

  • Train (тренировочный набор) — основной набор данных, используемый для обучения сети. Модель корректирует свои веса и смещения, минимизируя функцию потерь на этих данных.
  • Validation (валидационный набор) — набор данных, который не участвует в непосредственном обучении, но используется для проверки качества модели на промежуточных этапах. Позволяет выявить переобучение до применения тестового набора.
  • Test (тестовый набор) — финальный набор данных, предназначенный для оценки производительности модели после завершения обучения. Он должен содержать данные, которые модель никогда не видела.

Разделение данных

В JavaScript и библиотеке Brain.js разбиение данных обычно производится вручную или с помощью вспомогательных функций. Классический подход — случайное распределение с определёнными пропорциями, например 70% — train, 15% — validation, 15% — test.

Пример распределения данных:

const data = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
];

function splitData(dataset, trainRatio = 0.7, validationRatio = 0.15) {
  const shuffled = dataset.sort(() => 0.5 - Math.random());
  const trainEnd = Math.floor(dataset.length * trainRatio);
  const validationEnd = trainEnd + Math.floor(dataset.length * validationRatio);

  return {
    train: shuffled.slice(0, trainEnd),
    validation: shuffled.slice(trainEnd, validationEnd),
    test: shuffled.slice(validationEnd)
  };
}

const { train, validation, test } = splitData(data);

В этом примере функция splitData выполняет рандомизированное разбиение, обеспечивая разнообразие данных в каждом наборе и предотвращая смещение.

Особенности использования в Brain.js

Brain.js позволяет использовать разные типы нейронных сетей, включая NeuralNetwork и NeuralNetworkGPU. Для контроля переобучения важно передавать в метод train не только тренировочные данные, но и валидационные данные через параметр callback или отслеживать ошибку на валидационном наборе.

Пример обучения с отслеживанием валидационной ошибки:

const net = new brain.NeuralNetwork({ hiddenLayers: [3] });

let bestValidationError = Infinity;
let bestWeights = null;

for (let i = 0; i < 20000; i++) {
  net.train(train, { iterations: 1, log: false });
  const validationError = net.test(validation).error;

  if (validationError < bestValidationError) {
    bestValidationError = validationError;
    bestWeights = JSON.parse(JSON.stringify(net.toJSON()));
  }
}

net.fromJSON(bestWeights);

Здесь реализован ручной ранний стоп: обучение прекращается на оптимальном состоянии, найденном по минимальной ошибке на валидационном наборе.

Принципы контроля переобучения

  1. Сбалансированные наборы данных — количество примеров для каждого класса должно быть пропорционально во всех трёх наборах.
  2. Случайное распределение — предотвращает систематическую ошибку при обучении и тестировании.
  3. Ранний стоп по валидационной ошибке — один из эффективных методов предотвращения переобучения.
  4. Сохранение лучшей модели — хранение весов с минимальной валидационной ошибкой обеспечивает стабильную производительность на тестовых данных.

Примеры практических ошибок

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

Итоговая структура данных

После разбиения данные обычно хранятся в виде объектов:

{
  train: [ ... ],
  validation: [ ... ],
  test: [ ... ]
}

Каждый элемент — объект с полями input и output. Такая структура позволяет легко интегрировать наборы с методами Brain.js train, test и run.

Разбиение данных на train, validation и test — фундаментальный шаг при работе с нейронными сетями в Brain.js, который напрямую влияет на качество и надежность прогнозов модели. Контролируемое и сбалансированное распределение данных вместе с правильным использованием валидационного набора позволяет построить устойчивую сеть с минимальной ошибкой на новых данных.