Narx-сеть и лаговые входы

Narx-сети (Nonlinear AutoRegressive networks with eXogenous inputs) представляют собой специализированный тип рекуррентных нейронных сетей, применяемых для моделирования динамических систем и прогнозирования временных рядов. Ключевая особенность Narx-сети — зависимость текущего состояния сети не только от внешних входов, но и от предыдущих значений как входов, так и выходов. Это позволяет эффективно учитывать временные зависимости в данных.

Структура Narx-сети

Narx-сеть включает три основные компоненты:

  1. Входной слой — принимает текущее значение внешних сигналов и исторические данные (лаговые значения входов и выходов).
  2. Скрытый слой — содержит нейроны, способные моделировать нелинейные зависимости между входами и выходами. В Synaptic.js чаще всего используется слой Layer, соединённый с входным и выходным слоями через Connection.
  3. Выходной слой — формирует прогнозное значение на основе анализа текущих и прошлых данных.

Лаговые входы реализуются с помощью буферов, которые сохраняют предыдущие значения сигналов. Если заданы n лагов, сеть получает в качестве входа массив [x(t), x(t-1), ..., x(t-n)] для внешних сигналов и [y(t-1), ..., y(t-n)] для выходов.

Реализация Narx-сети в Synaptic.js

Synaptic.js предоставляет базовые элементы для построения нейронных сетей: Layer, Network, Trainer. Для создания Narx-сети необходимо вручную организовать обработку лаговых входов.

Пример структуры сети с лагами:

const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;

// Создание слоев
const inputLayer = new Layer(6);  // допустим, 3 входа + 3 лаговых значения
const hiddenLayer = new Layer(10);
const outputLayer = new Layer(1);

// Соединение слоев
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

// Формирование сети
const narxNetwork = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

В этом примере 3 исходных входа дополняются 3 лаговыми значениями, формируя полный входной вектор размером 6.

Подготовка данных с лагами

Для обучения сети необходимо преобразовать временной ряд в обучающие примеры с учетом лагов.

Алгоритм формирования обучающих примеров:

  1. Определить количество лагов nLag.

  2. Для каждого временного шага t формировать вектор входов:

    inputs = [x(t), x(t-1), ..., x(t-nLag), y(t-1), ..., y(t-nLag)]
    target = y(t)
  3. Создать массив объектов { input: inputs, output: [target] } для тренера.

Пример на Jav * aScript:

function createLaggedData(xSeries, ySeries, nLag) {
    const data = [];
    for (let t = nLag; t < xSeries.length; t++) {
        const input = [];
        for (let i = 0; i < nLag; i++) {
            input.push(xSeries[t - i - 1]);
            input.push(ySeries[t - i - 1]);
        }
        input.push(xSeries[t]);
        data.push({ input: input, output: [ySeries[t]] });
    }
    return data;
}

Обучение сети

Synaptic.js использует класс Trainer для обучения сетей методом обратного распространения ошибки (backpropagation). Для Narx-сети важно корректно задавать параметры обучения:

  • rate — скорость обучения (learning rate), обычно 0.01–0.1.
  • iterations — количество эпох обучения, зависит от объёма данных.
  • error — целевой уровень ошибки, ниже которого обучение прекращается.

Пример обучения:

const trainer = new Trainer(narxNetwork);
trainer.train(laggedData, {
    rate: 0.05,
    iterations: 5000,
    error: 0.005,
    shuffle: true
});

Прогнозирование

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

function predictNext(network, xLag, yLag, currentX) {
    const input = [...xLag, ...yLag, currentX];
    const output = network.activate(input);
    return output[0];
}

При последовательном прогнозировании необходимо обновлять буфер после каждого предсказания:

yLag.shift();
yLag.push(predictedValue);

Особенности и рекомендации

  • Выбор количества лагов сильно влияет на точность прогноза. Недостаток лагов может привести к недоучиванию, избыточное количество — к переобучению.
  • Сеть Narx эффективна для нелинейных временных рядов и систем с задержками.
  • В Synaptic.js отсутствует встроенная поддержка рекуррентной связи для Narx, поэтому лаги реализуются вручную через входные векторы.
  • Для улучшения стабильности прогнозов можно использовать нормализацию данных и скользящее окно для буферов лагов.

Применение Narx-сети

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

Narx-сети, реализованные с использованием Synaptic.js, демонстрируют гибкость и мощность для анализа временных рядов, позволяя создавать кастомизированные модели с учетом специфики данных и требований к точности.