exponenta event banner

Неглубокая нейронная сеть - прогнозирование и моделирование временных рядов

Динамические нейронные сети хороши при прогнозировании временных рядов. Чтобы увидеть примеры использования сетей NARX, применяемых в форме с разомкнутым контуром, форме с замкнутым контуром и многоступенчатом прогнозировании с разомкнутым/замкнутым контуром, см. Многоступенчатое предсказание нейронной сети.

Совет

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

Предположим, например, что у вас есть данные из процесса нейтрализации pH. Необходимо создать сеть, которая может предсказывать pH раствора в резервуаре на основе прошлых значений pH и прошлых значений кислотного и основного расхода в резервуар. У вас есть в общей сложности 2001 временных шагов, для которых у вас есть эти серии.

Эту проблему можно решить двумя способами:

Обычно лучше всего начинать с GUI, а затем использовать GUI для автоматического создания сценариев командной строки. Прежде чем использовать любой из этих методов, необходимо определить проблему путем выбора набора данных. Каждый графический интерфейс пользователя имеет доступ ко многим типовым наборам данных, которые можно использовать для экспериментов с панелью инструментов. При наличии конкретной проблемы, которую необходимо решить, можно загрузить собственные данные в рабочую область. В следующем разделе описывается формат данных.

Определение проблемы

Чтобы определить проблему временных рядов для панели инструментов, упорядочьте набор входных векторов TS в виде столбцов в массиве ячеек. Затем скомпонуйте другой набор целевых векторов TS (правильные выходные векторы для каждого из входных векторов) во второй массив ячеек (подробное описание форматирования данных для статических данных и данных временных рядов см. в разделе «Структуры данных»). Однако существуют случаи, когда необходимо иметь только целевой набор данных. Например, можно определить следующую проблему временных рядов, в которой необходимо использовать предыдущие значения ряда для прогнозирования следующего значения:

targets = {1 2 3 4 5};

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

Использование приложения Neural Network Time Series

  1. Откройте приложение Neural Network Time Series с помощью ntstool.

    ntstool

    Обратите внимание, что эта панель открытия отличается от панелей открытия для других GUI. Это потому, что ntstool может использоваться для решения трех различных типов задач временных рядов.

    • В первом типе проблемы временного ряда необходимо предсказать будущие значения временного ряда y (t) из прошлых значений этого временного ряда и прошлых значений второго временного ряда x (t). Эта форма предсказания называется нелинейной авторегрессией с экзогенным (внешним) входом, или NARX (см. «NARX Network» (narxnet, closeloop)), и может быть записана следующим образом:

      y (t) = f (y (t-1),..., y (t-d), x (t-1),..., (t-d))

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

    • Во втором типе проблемы временных рядов задействована только одна серия. Будущие значения временного ряда y (t) прогнозируются только из прошлых значений этого ряда. Эта форма предсказания называется нелинейной авторегрессионной, или NAR, и может быть записана следующим образом:

      y (t) = f (y (t-1),..., y (t-d))

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

    • Проблема третьего временного ряда аналогична проблеме первого типа, в которой задействованы два ряда, входной ряд x (t) и выходной/целевой ряд y (t). Здесь вы хотите предсказать значения y (t) из предыдущих значений x (t), но без знания предыдущих значений y (t). Эта модель ввода/вывода может быть записана следующим образом:

      y (t) = f (x (t-1),..., x (t-d))

      Модель NARX обеспечит лучшие прогнозы, чем эта модель ввода-вывода, потому что она использует дополнительную информацию, содержащуюся в предыдущих значениях y (t). Однако могут быть некоторые приложения, в которых предыдущие значения y (t) будут недоступны. Это единственные случаи, когда требуется использовать модель «вход-выход» вместо модели NARX.

  2. В этом примере выберите модель NARX и нажмите кнопку Далее (Next), чтобы продолжить.

  3. Щелкните Загрузить набор данных примера (Load Example Data Set) в окне Выбрать данные (Select Data). Откроется окно Выбор набора данных временного ряда (Time Series Data Set Chooser).

    Примечание

    Если требуется загрузить данные из рабочей области MATLAB ®, используйте опции Входы и цели (Inputs and Targets) в окне Выбрать данные (Select Data).

  4. Выберите «Процесс нейтрализации pH» и нажмите «Импорт». Откроется окно Выбор данных.

  5. Нажмите кнопку Next, чтобы открыть окно Validation and Test Data, показанное на следующем рисунке.

    Каждый набор проверочных и тестовых данных составляет 15% от исходных данных.

    При этих настройках входные векторы и целевые векторы будут случайным образом разделены на три набора следующим образом:

    • 70% будет использовано для обучения.

    • 15% будут использоваться для проверки того, что сеть обобщается, и для прекращения обучения перед переоборудованием.

    • Последние 15% будут использованы как полностью независимый тест обобщения сети.

    (Для получения дополнительной информации о процессе разделения данных см. раздел «Разделение данных».)

  6. Нажмите кнопку Далее.

    Стандартная сеть NARX представляет собой двухуровневую сеть прямой связи с сигмоидной передаточной функцией в скрытом уровне и линейной передаточной функцией в выходном уровне. Эта сеть также использует отводимые линии задержки для хранения предыдущих значений последовательностей x (t) и y (t). Следует отметить, что выход сети NARX, y (t), подается обратно на вход сети (через задержки), так как y (t) является функцией y (t - 1), y (t - 2),..., y (t - d). Однако для эффективного обучения эта петля обратной связи может быть открыта.

    Поскольку истинный выходной сигнал доступен во время обучения сети, можно использовать приведенную выше архитектуру с разомкнутым контуром, в которой истинный выходной сигнал используется вместо обратной передачи расчетного выходного сигнала. Это имеет два преимущества. Первый заключается в том, что вход в сеть прямой связи является более точным. Вторая заключается в том, что результирующая сеть имеет архитектуру чисто прямой связи, и поэтому для обучения можно использовать более эффективный алгоритм. Эта сеть более подробно обсуждается в «NARX Network» (narxnet, closeloop).

    Количество скрытых нейронов по умолчанию равно 10. По умолчанию количество задержек равно 2. Измените это значение на 4. Вы можете изменить эти цифры, если производительность обучения в сети плохая.

  7. Нажмите кнопку Далее.

  8. Выберите алгоритм обучения и нажмите Train. Левенберг-Марквардт (trainlm) рекомендуется для большинства проблем, но для некоторых шумных и небольших проблем байесовская регуляризация (trainbr) может занять больше времени, но получить лучшее решение. Однако для больших проблем масштабированный сопряженный градиент (trainscg) рекомендуется, поскольку он использует градиентные вычисления, которые эффективнее памяти, чем якобинские вычисления, используемые двумя другими алгоритмами. В этом примере используется значение по умолчанию Levenberg-Marquardt.

    Обучение продолжалось до тех пор, пока ошибка проверки не была уменьшена в течение шести итераций (остановка проверки).

  9. В разделе Графики (Plots) щелкните Автокорреляция ошибок (Error Autocorrelation). Используется для проверки производительности сети.

    На следующем графике показана функция автокорреляции ошибок. В нем описывается, как ошибки прогнозирования связаны во времени. Для совершенной модели прогнозирования должно быть только одно ненулевое значение автокорреляционной функции, и оно должно происходить с нулевым запаздыванием. (Это среднеквадратическая ошибка.) Это означает, что ошибки предсказания полностью не коррелировали друг с другом (белый шум). Если была значительная корреляция в ошибках предсказания, то должна быть возможность улучшить предсказание - возможно, за счет увеличения числа задержек в отведенных линиях задержки. В этом случае корреляции, за исключением корреляции с нулевым запаздыванием, находятся приблизительно в пределах 95% доверительных пределов вокруг нуля, поэтому модель кажется адекватной. Если требовались еще более точные результаты, можно было переобучить сеть, щелкнув Переучить в ntstool. Это приведет к изменению начальных весов и смещений сети и может привести к улучшению сети после переподготовки.

  10. Просмотрите функцию взаимной корреляции «ошибка ввода» для получения дополнительной проверки производительности сети. На панели Графики (Plots) щелкните Взаимная корреляция ввода-ошибки (Input-Error Cross-correlation).

    Эта функция взаимной корреляции «входная ошибка» иллюстрирует, как ошибки коррелируются с входной последовательностью x (t). Для идеальной модели прогнозирования все корреляции должны быть равны нулю. Если входной сигнал коррелирует с ошибкой, то должна быть возможность улучшить предсказание, возможно, за счет увеличения числа задержек в отводимых линиях задержки. В этом случае все корреляции находятся в пределах доверительных границ вокруг нуля.

  11. В разделе Графики (Plots) щелкните Ответ временного ряда (Time Series Response). Здесь отображаются входные данные, цели и ошибки в зависимости от времени. Он также указывает, какие моменты времени были выбраны для обучения, тестирования и проверки.

  12. Нажмите кнопку Next в приложении Neural Network Time Series App для оценки сети.

    На этом этапе можно протестировать сеть на соответствие новым данным.

    Если вы недовольны производительностью сети в отношении исходных или новых данных, вы можете выполнить одно из следующих действий:

    • Тренируйте снова.

    • Увеличьте количество нейронов и/или количество задержек.

    • Получите больший набор учебных данных.

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

  13. Если вы удовлетворены производительностью сети, нажмите кнопку Далее.

  14. Эта панель используется для создания функции MATLAB или диаграммы Simulink ® для моделирования нейронной сети. Можно использовать сгенерированный код или диаграмму, чтобы лучше понять, как нейронная сеть вычисляет выходные данные на основе входных данных, или развернуть сеть с помощью инструментов MATLAB Compiler™ и других инструментов генерации кода MATLAB и Simulink.

  15. Используйте кнопки на этом экране для создания сценариев или сохранения результатов.

    • Можно щелкнуть Простой сценарий (Simple Script) или Расширенный сценарий (Advanced Script), чтобы создать код MATLAB, который можно использовать для воспроизведения всех предыдущих шагов из командной строки. Создание кода MATLAB может быть полезно, если вы хотите узнать, как использовать функциональность командной строки панели инструментов для настройки процесса обучения. В разделе Использование функций командной строки более подробно рассматриваются созданные сценарии.

    • Можно также сохранить сеть как net в рабочей области. На нем можно выполнить дополнительные тесты или поставить его для работы на новых входах.

  16. После создания кода MATLAB и сохранения результатов нажмите кнопку Готово.

Использование функций командной строки

Самый простой способ научиться использовать функции командной строки панели инструментов - это создавать сценарии из GUI, а затем изменять их для настройки сетевого обучения. В качестве примера рассмотрим простой сценарий, созданный на шаге 15 предыдущего раздела.

% Solve an Autoregression Problem with External 
% Input with a NARX Neural Network
% Script generated by NTSTOOL
%
% This script assumes the variables on the right of 
% these equalities are defined:
%
%   phInputs - input time series.
%   phTargets - feedback time series.

inputSeries = phInputs;
targetSeries = phTargets;

% Create a Nonlinear Autoregressive Network with External Input
inputDelays = 1:4;
feedbackDelays = 1:4;
hiddenLayerSize = 10;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);

% Prepare the Data for Training and Simulation
% The function PREPARETS prepares time series data 
% for a particular network, shifting time by the minimum 
% amount to fill input states and layer states.
% Using PREPARETS allows you to keep your original 
% time series data unchanged, while easily customizing it 
% for networks with differing numbers of delays, with
% open loop or closed loop feedback modes.
[inputs,inputStates,layerStates,targets] = ... 
    preparets(net,inputSeries,{},targetSeries);

% Set up Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
[net,tr] = train(net,inputs,targets,inputStates,layerStates);

% Test the Network
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotregression(targets,outputs)
% figure, plotresponse(targets,outputs)
% figure, ploterrcorr(errors)
% figure, plotinerrcorr(inputs,errors)

% Closed Loop Network
% Use this network to do multi-step prediction.
% The function CLOSELOOP replaces the feedback input with a direct
% connection from the output layer.
netc = closeloop(net);
netc.name = [net.name ' - Closed Loop'];
view(netc)
[xc,xic,aic,tc] = preparets(netc,inputSeries,{},targetSeries);
yc = netc(xc,xic,aic);
closedLoopPerformance = perform(netc,tc,yc)

% Early Prediction Network
% For some applications it helps to get the prediction a 
% timestep early.
% The original network returns predicted y(t+1) at the same 
% time it is given y(t+1).
% For some applications such as decision making, it would 
% help to have predicted y(t+1) once y(t) is available, but 
% before the actual y(t+1) occurs.
% The network can be made to return its output a timestep early 
% by removing one delay so that its minimal tap delay is now 
% 0 instead of 1.  The new network returns the same outputs as 
% the original network, but outputs are shifted left one timestep.
nets = removedelay(net);
nets.name = [net.name ' - Predict One Step Ahead'];
view(nets)
[xs,xis,ais,ts] = preparets(nets,inputSeries,{},targetSeries);
ys = nets(xs,xis,ais);
earlyPredictPerformance = perform(nets,ts,ys)

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

  1. Сценарий предполагает, что входные и целевые векторы уже загружены в рабочую область. Если данные не загружены, их можно загрузить следующим образом:

    load ph_dataset
    inputSeries = phInputs;
    targetSeries = phTargets;
    
  2. Создание сети. Сеть NARX, narxnet, является сетью прямой связи с функцией передачи по умолчанию tan-sigmoid на скрытом уровне и функцией линейной передачи на выходном уровне. Эта сеть имеет два входа. Один из них является внешним входом, а другой - соединением обратной связи с выходом сети. (После обучения сети это соединение обратной связи может быть закрыто, как вы увидите на следующем шаге.) Для каждого из этих входов имеется линия задержки с отводом для хранения предыдущих значений. Чтобы назначить архитектуру сети для сети NARX, необходимо выбрать задержки, связанные с каждой выделенной линией задержки, а также количество нейронов скрытого уровня. На следующих шагах вы назначаете задержки ввода и задержки обратной связи в диапазоне от 1 до 4, а количество скрытых нейронов - 10.

    inputDelays = 1:4;
    feedbackDelays = 1:4;
    hiddenLayerSize = 10;
    net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);
    

    Примечание

    Увеличение числа нейронов и количества задержек требует большего количества вычислений, и это имеет тенденцию к перевыполнению данных, когда числа установлены слишком высокими, но это позволяет сети решать более сложные задачи. Большее количество уровней требует большего количества вычислений, но их использование может привести к более эффективному решению сложных проблем в сети. Чтобы использовать несколько скрытых слоев, введите размеры скрытых слоев в качестве элементов массива в fitnet команда.

  3. Подготовьте данные для обучения. При обучении сети, содержащей отводимые линии задержки, необходимо заполнить задержки начальными значениями входов и выходов сети. Существует команда панели инструментов, которая облегчает этот процесс - preparets. Эта функция имеет три входных аргумента: сеть, входная последовательность и целевая последовательность. Функция возвращает начальные условия, необходимые для заполнения отводимых линий задержки в сети, и измененные входные и целевые последовательности, где исходные условия были удалены. Функцию можно вызвать следующим образом:

    [inputs,inputStates,layerStates,targets] = ...
        preparets(net,inputSeries,{},targetSeries);
    
  4. Настройка разделения данных.

    net.divideParam.trainRatio = 70/100;
    net.divideParam.valRatio   = 15/100;
    net.divideParam.testRatio  = 15/100;
    

    При этих настройках входные векторы и целевые векторы будут разделены случайным образом: 70% используются для обучения, 15% для проверки и 15% для тестирования.

  5. Обучение сети. Сеть использует алгоритм Левенберга-Марквардта по умолчанию (trainlm) для обучения. Для проблем, в которых Левенберг-Марквардт не дает столь точных результатов, как требуется, или для больших проблем с данными, рассмотрите возможность установки функции обучения сети на байесовскую регуляризацию (trainbr) или Масштабированный сопряженный градиент (trainscg), соответственно, с одним

    net.trainFcn = 'trainbr';
    net.trainFcn = 'trainscg';

    Для обучения сети введите:

    [net,tr] = train(net,inputs,targets,inputStates,layerStates);
    

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

    Это обучение остановилось, когда ошибка проверки увеличилась для шести итераций, которые произошли в итерации 44.

  6. Протестируйте сеть. После обучения сети ее можно использовать для вычисления сетевых выходов. Следующий код вычисляет сетевые выходы, ошибки и общую производительность. Следует отметить, что для моделирования сети с отводимыми линиями задержки необходимо назначить начальные значения для этих отложенных сигналов. Это делается с помощью inputStates и layerStates предоставлены preparets на более ранней стадии.

    outputs = net(inputs,inputStates,layerStates);
    errors = gsubtract(targets,outputs);
    performance = perform(net,targets,outputs)
    
    performance =
    
        0.0042
    
    
  7. Просмотрите схему сети.

    view(net)
    

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

    figure, plotperform(tr)
    

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

    Все обучение выполняется в открытом цикле (также называемом последовательно-параллельной архитектурой), включая этапы проверки и тестирования. Типичный рабочий процесс состоит в том, чтобы полностью создать сеть в разомкнутом цикле, и только после обучения (которое включает в себя этапы проверки и тестирования) она преобразуется в замкнутый цикл для многоступенчатого прогнозирования. Аналогично, R значения в GUI вычисляются на основе результатов обучения с разомкнутым контуром.

  9. Замкните петлю в сети NARX. Когда петля обратной связи открыта в сети NARX, она выполняет предсказание на один шаг вперед. Это предсказание следующего значения y (t) из предыдущих значений y (t) и x (t). С замкнутым контуром обратной связи его можно использовать для выполнения многошаговых прогнозов. Это связано с тем, что прогнозы y (t) будут использоваться вместо фактических будущих значений y (t). Для закрытия цикла и расчета производительности замкнутого цикла можно использовать следующие команды:

    netc = closeloop(net);
    netc.name = [net.name ' - Closed Loop'];
    view(netc)
    [xc,xic,aic,tc] = preparets(netc,inputSeries,{},targetSeries);
    yc = netc(xc,xic,aic);
    perfc = perform(netc,tc,yc)
    
    perfc =
    
        2.8744
    
    

  10. Удалите задержку из сети, чтобы получить прогноз на один шаг раньше.

    nets = removedelay(net);
    nets.name = [net.name ' - Predict One Step Ahead'];
    view(nets)
    [xs,xis,ais,ts] = preparets(nets,inputSeries,{},targetSeries);
    ys = nets(xs,xis,ais);
    earlyPredictPerformance = perform(nets,ts,ys)
    
    earlyPredictPerformance =
    
        0.0042
    
    

    На этом рисунке видно, что сеть идентична предыдущей сети с разомкнутым контуром, за исключением того, что одна задержка была удалена с каждой из линий задержки. Выход сети тогда равен y (t + 1) вместо y (t). Иногда это может быть полезно при развертывании сети для определенных приложений.

Если производительность сети неудовлетворительна, можно попробовать любой из следующих подходов:

  • Сбросить начальные веса сети и смещения на новые значения с помощью init и снова тренируйтесь (см. «Инициализация весов» (init)).

  • Увеличьте количество скрытых нейронов или количество задержек.

  • Увеличение числа векторов обучения.

  • При наличии более подробной информации увеличьте количество входных значений.

  • Попробуйте другой алгоритм обучения (см. раздел «Алгоритмы обучения»).

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

  • Во время обучения откройте окно графика (например, график корреляции ошибок) и посмотрите, как он анимируется.

  • Печать из командной строки с такими функциями, как plotresponse, ploterrcorr и plotperform. (Дополнительные сведения об использовании этих функций см. на справочных страницах.)

Кроме того, дополнительные параметры см. в расширенном сценарии при обучении в командной строке.

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

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