Мелкая нейронная сеть Timeseries Предсказания и моделирования

Динамические нейронные сети хороши при предсказании timeseries. Чтобы увидеть примеры использования сетей NARX, применяемых в разомкнутый контур форме, системе с обратной связью и многостадийном предсказании без обратной связи, см. Multistep Neural Network Prediction.

Совет

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

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

Решить эту задачу можно двумя способами:

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

Определение задачи

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

targets = {1 2 3 4 5};

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

Использование приложения Neural Network Временные ряды

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

    ntstool

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

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

      y (<reservedrangesplaceholder10>) = f (y (t – 1)..., y (t – d), x (t – 1)..., (t – d))

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

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

      y (<reservedrangesplaceholder6>) = f (y (t – 1)..., y (t – d))

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

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

      y (<reservedrangesplaceholder6>) = f (x (t – 1)..., x (t – d))

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

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

  3. Щелкните Загрузка Набора данных примера в окне Выбор данных. Откроется окно Выбор набора данных временных рядов.

    Примечание

    Используйте опции Inputs и Targets в окне Select Data, когда необходимо загрузить данные из MATLAB® рабочей области.

  4. Выберите pH Neutralization Process и нажмите Import. Это возвращает вас в окно Select Data.

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

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

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

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

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

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

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

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

    Стандартная сеть NARX является 2-х слойной сетью прямого распространения с передаточной функцией сигмоида в скрытом слое и линейной передаточной функцией в выход слое. Эта сеть также использует выделенные линии задержки для хранения предыдущих значений 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. Выберите алгоритм настройки, затем щелкните Обучить. Левенберг-Марквардт (trainlm) рекомендуется для большинства задач, но для некоторых шумных и небольших задач Байесовская Регуляризация (trainbr) может занять больше времени, но получить лучшее решение. Однако для больших задач масштабированный сопряженный градиент (trainscg) рекомендуется, так как использует градиентные вычисления, которые более эффективны для памяти, чем вычисления Якобиана, которые используют два других алгоритма. Этот пример использует Левенберг-Марквардт по умолчанию.

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

  9. В разделе Графики выберите Ошибка автокорреляции. Это используется для проверки эффективности сети.

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

  10. Просмотрите функцию перекрестной корреляции входной ошибки, чтобы получить дополнительную верификацию эффективности сети. На панели Графики нажмите Input-Error Cross-Correlation.

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

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

  12. Нажмите кнопку Далее в приложении Neural Network Time Series, чтобы оценить сеть.

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

    Если вы недовольны эффективностью сети на оригинальных или новых данных, то можете сделать любое из следующих:

    • Обучи его снова.

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

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

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

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

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

  15. Используйте кнопки на этом экране, чтобы сгенерировать скрипты или сохранить результаты.

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

    • Можно также сохранить сеть следующим образом net в рабочей области. Вы можете выполнить дополнительные тесты на нем или поставить его на работу с новыми входами.

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

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

Самый легкий способ научиться использовать функциональность командной строки тулбокса - сгенерировать скрипты из графические интерфейсы пользователя, а затем изменить их, чтобы настроить сетевое обучение. В качестве примера рассмотрим простой скрипт, который был создан на шаге 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, является сеть прямого распространения с передаточной функцией тан-сигмоида по умолчанию в скрытом слое и линейной передаточной функцией в выход слое. Эта сеть имеет два входа. Один из них является внешним входом, а другой - соединением обратной связи с выхода сети. (После обучения сети это соединение с обратной связью может быть закрыто, как вы увидите на более позднем шаге.) Для каждого из этих входов существует выделенная линия задержки для хранения предыдущих значений. Чтобы назначить сетевую архитектуру для сети NARX, необходимо выбрать задержки, связанные с каждой выделенной линией задержки, а также количество скрытых нейронов слоя. На следующих шагах вы присваиваете входные задержки и задержки обратной связи в диапазоне от 1 до 4, а количество скрытых нейронов - 10.

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

    Примечание

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

  3. Подготовить данные к обучению. При обучении сети, содержащей выделенные линии задержки, необходимо заполнить задержки начальными значениями входов и выходов сети. Существует команда toolbox, которая облегчает этот процесс - 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 значения в графический интерфейс пользователя вычисляются на основе результатов обучения без разомкнутого контура.

  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 и train еще раз (см. «Инициализация весов» (init)).

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

  • Увеличьте количество обучающих векторов.

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

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

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

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

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

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

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

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