Аугментация данных

Аугментация данных — это процесс искусственного расширения обучающего набора данных с целью повышения качества обучения нейронной сети. В контексте Brain.js, которая является библиотекой для построения и обучения нейронных сетей на JavaScript, аугментация помогает справляться с проблемой малого объёма данных и повышает устойчивость модели к шуму и вариативности входных данных.


Принципы аугментации данных

1. Расширение набора данных В классических сценариях, когда имеется ограниченный набор примеров, можно создавать новые вариации исходных данных. В Brain.js это особенно актуально для сетей, работающих с числовыми массивами, изображениями или текстом, представленным в виде векторов.

2. Создание синтетических примеров Синтетические данные создаются с помощью преобразований существующих примеров. Основные методы включают:

  • Шумовые модификации: добавление случайного шума к числовым входам, чтобы сеть училась распознавать паттерны даже при небольших отклонениях.
  • Случайное смещение или масштабирование: изменение масштаба или диапазона числовых входов для улучшения обобщающей способности сети.
  • Вариации последовательностей: для сетей типа LSTM можно менять порядок или длину последовательностей в пределах допустимого диапазона.

3. Балансировка классов Если исходный набор данных имеет дисбаланс между категориями (например, один класс встречается чаще), аугментация позволяет увеличить количество примеров для редких классов, что повышает точность классификации.


Методы аугментации в Brain.js

Добавление шума к входным данным

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

function addNoise(input, intensity = 0.05) {
  return input.map(value => value + (Math.random() * 2 - 1) * intensity);
}

const trainingData = [
  { input: [0.1, 0.5, 0.2], output: [1] },
  { input: [0.3, 0.7, 0.9], output: [0] }
];

const augmentedData = trainingData.map(item => ({
  input: addNoise(item.input),
  output: item.output
}));

net.train([...trainingData, ...augmentedData]);

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


Масштабирование и нормализация

Масштабирование входов помогает сети быстрее сходиться и улучшает точность. В Brain.js все входные значения обычно нормализуются в диапазоне от 0 до 1, но при аугментации можно создавать случайные вариации внутри допустимого диапазона:

function scaleInput(input, factor = 0.1) {
  return input.map(value => Math.min(Math.max(value * (1 + (Math.random() * 2 - 1) * factor), 0), 1));
}

const scaledData = trainingData.map(item => ({
  input: scaleInput(item.input),
  output: item.output
}));

Вариации для последовательных данных

Для рекуррентных сетей (RNN, LSTM) важно разнообразие последовательностей:

const originalSequence = [0.1, 0.2, 0.3, 0.4, 0.5];

function shuffleSequence(seq) {
  return seq.map(value => value + (Math.random() * 0.02 - 0.01));
}

const augmentedSequences = Array.from({ length: 5 }, () => ({
  input: shuffleSequence(originalSequence),
  output: [1]
}));

Такое смещение элементов позволяет модели лучше распознавать закономерности в последовательностях с небольшими вариациями.


Влияние аугментации на обучение

  • Уменьшение переобучения: при малом объёме данных сеть склонна запоминать примеры. Аугментация создаёт дополнительные вариации, что заставляет сеть искать общие закономерности.
  • Улучшение обобщающей способности: модель становится способной корректно реагировать на новые, ранее не встречавшиеся входы.
  • Повышение устойчивости к шуму: за счёт обучения на слегка модифицированных данных сеть лучше справляется с реальными, “грязными” входными данными.

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

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

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