Динамические нейронные сети способны к предсказанию timeseries. Чтобы видеть примеры использования сетей NARX, применяемых в многошаговом прогнозировании разомкнутой и замкнутой обратной связи, см. Многоступенчатое Предсказание Нейронной сети.
Совет
Для глубокого обучения для данных временных рядов смотрите вместо этого Классификацию Последовательностей Используя Глубокое обучение.
Предположим, например, что у вас есть данные из процесса нейтрализации pH. Вы хотите спроектировать сеть, которая может предсказать pH решения в баке от прошлых значений pH и прошлых значений кислотной и основной скорости потока жидкости в бак. У вас есть в общей сложности 2 001 временной шаг, для которых у вас есть те ряды.
Можно решить эту задачу двумя способами:
Используйте приложение Neural Net Time Series, как описано в Подходящих Данных временных рядов Используя Neural Net Time Series App.
Используйте функции командной строки, как описано в Подходящих Данных временных рядов Используя Функции Командной строки.
Обычно лучше запуститься с приложения, и затем использовать приложение, чтобы автоматически сгенерировать скрипты командной строки. Перед использованием любого метода сначала опишите задачу путем выбора набора данных. Каждое из приложений нейронной сети имеет доступ к нескольким наборам выборочных данных, которые можно использовать, чтобы экспериментировать с тулбоксом (см. Наборы Выборочных данных для Мелких Нейронных сетей). Если у вас есть определенная задача, которую вы хотите решить, можно загрузить собственные данные в рабочую область.
Можно обучить нейронную сеть, чтобы решить три типа проблем временных рядов.
В первом типе проблемы временных рядов требуется предсказать будущие значения временных рядов y (t) от прошлых значений тех временных рядов и прошлых значений серии x второго раза (t). Эта форма предсказания называется нелинейная авторегрессивный с внешним (внешним) входом или NARX (см. Ряд Времени проектирования Нейронные сети Обратной связи NARX), и может быть записан можно следующим образом:
y (t) = f (y (t – 1)..., y (t – d), x (t – 1)..., (t – d))
Используйте эту модель, чтобы предсказать будущие значения запаса или связи, на основе таких экономических переменных как показатели безработицы, GDP, и т.д. Можно также использовать эту модель для системы идентификации, в которой модели разрабатываются, чтобы представлять динамические системы, такие как химические процессы, производственные системы, робототехника, космические транспортные средства, и т.д.
Во втором типе проблемы временных рядов существует только один включенный ряд. Будущие значения временных рядов 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.
Чтобы описать задачу временных рядов для тулбокса, расположите набор векторов предиктора временных рядов как столбцы в массиве ячеек. Затем расположите другой набор векторов отклика временных рядов (правильные векторы отклика для каждого из векторов предиктора) во второй массив ячеек. Кроме того, существуют случаи, в которых у вас только должен быть набор данных ответа. Например, можно описать следующую задачу временных рядов, в которой вы хотите использовать предыдущие значения ряда, чтобы предсказать следующее значение:
responses = {1 2 3 4 5};
Следующий раздел показывает, как обучить сеть, чтобы соответствовать набору данных временных рядов, с помощью приложения Neural Net Time Series. Этот пример использует данные в качестве примера, которым предоставляют тулбокс.
В этом примере показано, как обучить мелкую нейронную сеть, чтобы соответствовать данным временных рядов с помощью приложения Neural Net Time Series.
Откройте приложение Neural Net Time Series с помощью ntstool
.
ntstool
Выберите Network
Можно использовать приложение Neural Net Time Series, чтобы решить три различных видов проблем временных рядов.
В первом типе проблемы временных рядов требуется предсказать будущие значения временных рядов от прошлых значений тех временных рядов и прошлых значений ряда второго раза . Эта форма предсказания называется нелинейной авторегрессивной сетью с внешним (внешним) входом или NARX.
Во втором типе проблемы временных рядов существует только один включенный ряд. Будущие значения временных рядов предсказаны только от прошлых значений того ряда. Эта форма предсказания называется нелинейная авторегрессивный, или NAR.
Третья проблема временных рядов похожа на первый тип, в тех двух рядах включены, входной ряд (предикторы) и выходной ряд (ответы) . Здесь вы хотите предсказать значения от предыдущих значений , но без ведома предыдущих значений .
В данном примере используйте сеть NARX. Нажмите Select Network> NARX Network.
Выберите Data
Приложение Neural Net Time Series имеет данные в качестве примера, чтобы помочь вам начать обучать нейронную сеть.
Чтобы импортировать данные о процессе нейтрализации pH в качестве примера, выберите Import> More Example Data Sets> Набор данных Нейтрализации pH Import. Можно использовать этот набор данных, чтобы обучить нейронную сеть, чтобы предсказать pH решения с помощью кислотного и основного потока решения. Если вы импортируете свои собственные данные из файла или рабочей области, необходимо задать предикторы и ответы.
Информация об импортированных данных появляется в Сводных данных Модели. Этот набор данных содержит 2 001 временной шаг. Предикторы имеют две функции (кислотный и основной поток решения), и ответы имеют одну функцию (pH решения).
Разделите данные в обучение, валидацию и наборы тестов. Сохраните настройки по умолчанию. Данные разделены в:
70% для обучения.
15%, чтобы подтвердить это сеть делают вывод и остановить обучение перед сверхподбором кривой.
15%, чтобы независимо протестировать сетевое обобщение.
Для получения дополнительной информации о делении данных смотрите, Делят Данные для Оптимального Обучения Нейронной сети.
Создайте сеть
Стандартная сеть NARX является 2-х слойной сетью прямого распространения с сигмоидальной передаточной функцией в скрытом слое и линейной передаточной функцией в выходном слое. Эта сеть также использует коснувшиеся линии задержки, чтобы сохранить предыдущие значения и последовательности. Обратите внимание на то, что выход сети NARX, , возвращен к входу сети (через задержки), с тех пор функция . Однако для эффективного обучения эта обратная связь может быть открыта.
Поскольку истинный выход доступен во время обучения сети, можно использовать архитектуру разомкнутого контура, показанную ниже, в котором истинный выход используется вместо того, чтобы возвратить предполагаемый выход. Это имеет два преимущества. Прежде всего, вход к сети прямого распространения более точен. Второе - то, что получившаяся сеть имеет чистую архитектуру прямого распространения, и поэтому более эффективный алгоритм может использоваться для обучения. Эта сеть обсуждена более подробно в Ряду Времени проектирования Нейронные сети Обратной связи NARX.
Значение размера Слоя задает количество скрытых нейронов. Сохраните размер слоя по умолчанию, 10
. Измените значение С временной задержкой в 4
. Вы можете хотеть настроить эти числа, если сетевая производительность обучения плоха.
Вы видите сетевую архитектуру в Сетевой панели.
Обучение сети
Чтобы обучить сеть, выберите Train> Train with Levenberg-Marquardt. Это - алгоритм настройки по умолчанию и то же самое как нажатие Train.
Обучение с Levenberg-Marquardt (trainlm
) рекомендуется для большинства проблем. Для шумных или небольших проблем, Байесова Регуляризация (trainbr
) может получить лучшее решение, за счет занимания больше времени. Для больших проблем, Масштабированный Метод сопряженных градиентов (trainscg
) рекомендуется, когда это использует вычисления градиента, которые используют память более эффективно, чем вычисления Якобиана другие два использования алгоритмов.
В Учебной панели вы видите процесс обучения. Обучение продолжается, пока одному из критерия остановки не соответствуют. В этом примере продолжается обучение, пока ошибка валидации не увеличивается последовательно для шести итераций ("Соответствовал критерию валидации").
Анализ результатов
Сводные данные Модели содержат информацию об алгоритме настройки и учебных результатах для каждого набора данных.
Можно далее анализировать результаты путем генерации графиков. Чтобы построить ошибочную автокорреляцию, в разделе Plots, нажимают Error Autocorrelation. График автокорреляции описывает, как ошибки предсказания связаны во времени. Для совершенной модели предсказания должно только быть одно ненулевое значение автокорреляционной функции, и это должно произойти в нулевой задержке (это - среднеквадратичная погрешность). Это означало бы, что ошибки предсказания были абсолютно некоррелироваными друг с другом (белый шум). Если бы была значительная корреляция по ошибкам предсказания, то должно быть возможно улучшить предсказание - возможно, путем увеличения числа задержек коснувшихся линий задержки. В этом случае корреляции, за исключением той в нулевой задержке, падают приблизительно в 95% пределов достоверности вокруг нуля, таким образом, модель, кажется, соответствует. Если бы еще более точные результаты требовались, вы могли бы переобучить сеть. Это изменит начальные веса и смещения сети, и может произвести улучшенную сеть после переобучения.
Просмотрите график взаимной корреляции входной ошибки получить дополнительную верификацию производительности сети. В разделе Plots нажмите Input-Error Correlation. График взаимной корреляции входной ошибки иллюстрирует, как ошибки коррелируются с входной последовательностью . Для совершенной модели предсказания все корреляции должны быть нулем. Если вход коррелируется с ошибкой, то должно быть возможно улучшить предсказание, возможно, путем увеличения числа задержек коснувшихся линий задержки. В этом случае большинство корреляций находится в пределах доверительных границ вокруг нуля.
В разделе Plots нажмите Response. Это отображает выводы, ответы (цели) и ошибки по сравнению со временем. Это также указывает, какие моменты времени были выбраны для обучения, тестирования и валидации.
Если вы недовольны производительностью сети, можно выполнить одно из следующих действий:
Обучите сеть снова.
Увеличьте число скрытых нейронов.
Используйте больший обучающий набор данных.
Если эффективность на наборе обучающих данных хороша, но эффективность набора тестов плоха, это могло бы указать, что модель сверхсоответствует. Уменьшение размера слоя, и поэтому сокращение числа нейронов, могут уменьшать сверхподбор кривой.
Можно также оценить производительность сети на дополнительном наборе тестов. Чтобы загрузить дополнительные тестовые данные, чтобы оценить сеть с, в Экспериментальном участке, нажимают Test. Сводные данные Модели отображают дополнительные результаты тестовых данных. Можно также сгенерировать графики анализировать дополнительные результаты тестовых данных.
Сгенерируйте код
Выберите Generate Code> Generate Simple Training Script, чтобы создать код MATLAB, чтобы воспроизвести предыдущие шаги от командной строки. Создание кода MATLAB может быть полезным, если вы хотите изучить, как использовать функциональность командной строки тулбокса, чтобы настроить учебный процесс. В Подходящих Данных временных рядов Используя Функции Командной строки вы исследуете сгенерированные скрипты более подробно.
Сеть экспорта
Можно экспортировать обучивший сеть в рабочую область или Simulink®. Можно также развернуть сеть с инструментами MATLAB Compiler™ и другими инструментами генерации кода MATLAB. Чтобы экспортировать ваш обучивший сеть и результаты, выберите Export Model> Export to Workspace.
Самый легкий способ изучить, как использовать функциональность командной строки тулбокса, состоит в том, чтобы сгенерировать скрипты из приложений, и затем изменить их, чтобы настроить сетевое обучение. Как пример, посмотрите на простой скрипт, который был сгенерирован в предыдущем разделе с помощью приложения Neural Net Time Series.
% Solve an Autoregression Problem with External Input with a NARX Neural Network % Script generated by Neural Time Series app % Created 13-May-2021 17:34:27 % % This script assumes these variables are defined: % % phInputs - input time series. % phTargets - feedback time series. X = phInputs; T = phTargets; % Choose a Training Function % For a list of all training functions type: help nntrain % 'trainlm' is usually fastest. % 'trainbr' takes longer but may be better for challenging problems. % 'trainscg' uses less memory. Suitable in low memory situations. trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation. % Create a Nonlinear Autoregressive Network with External Input inputDelays = 1:4; feedbackDelays = 1:4; hiddenLayerSize = 10; net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize,'open',trainFcn); % Prepare the Data for Training and Simulation % The function PREPARETS prepares timeseries 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. [x,xi,ai,t] = preparets(net,X,{},T); % Setup 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,x,t,xi,ai); % Test the Network y = net(x,xi,ai); e = gsubtract(t,y); performance = perform(net,t,y) % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, ploterrhist(e) %figure, plotregression(t,y) %figure, plotresponse(t,y) %figure, ploterrcorr(e) %figure, plotinerrcorr(x,e) % 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,X,{},T); yc = netc(xc,xic,aic); closedLoopPerformance = perform(net,tc,yc) % Step-Ahead 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,X,{},T); ys = nets(xs,xis,ais); stepAheadPerformance = perform(nets,ts,ys)
Можно сохранить скрипт, и затем запустить его из командной строки, чтобы воспроизвести результаты предыдущего сеанса приложения. Можно также отредактировать скрипт, чтобы настроить учебный процесс. В этом случае выполните каждый из шагов в скрипте.
Скрипт принимает, что предиктор и векторы отклика уже загружаются в рабочую область. Если данные не загружаются, можно загрузить их можно следующим образом:
load ph_dataset
pHInputs
и ответы pHTargets
в рабочую область.Этот набор данных является одним из наборов выборочных данных, который является частью тулбокса. Для получения информации о доступных наборах данных смотрите Наборы Выборочных данных для Мелких Нейронных сетей. Можно также видеть список всех доступных наборов данных путем ввода команды help nndatasets
. Можно загрузить переменные из любого из этих наборов данных с помощью собственных имен переменных. Например, команда
[X,T] = ph_dataset;
X
и ответы набора данных pH в массив ячеек T
.Задайте алгоритм настройки. Сеть использует алгоритм Levenberg-Marquardt по умолчанию (trainlm
) для обучения.
trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation.
Для проблем, в которых Levenberg-Marquardt не производит, когда точные результаты, как желаемый, или для больших проблем данных, рассматривают установку сетевой учебной функции к Байесовой Регуляризации (trainbr
) или масштабированный метод сопряженных градиентов (trainscg
), соответственно, с также
net.trainFcn = 'trainbr'; net.trainFcn = 'trainscg';
Создайте сеть. Сеть NARX, narxnet
, сеть прямого распространения с коричнево-сигмоидальной передаточной функцией по умолчанию в скрытом слое и линейной передаточной функцией в выходном слое. Эта сеть имеет два входных параметров. Каждый - внешний вход, и другой соединение обратной связи от сетевого выхода. После того, как сеть была обучена, это соединение обратной связи может быть закрыто, как вы будете видеть на более позднем шаге. Для каждых из этих входных параметров существует коснувшаяся линия задержки, чтобы сохранить предыдущие значения. Чтобы присвоить сетевую архитектуру для сети NARX, необходимо выбрать задержки, сопоставленные с каждой коснувшейся линией задержки, и также количеством нейронов скрытого слоя. В следующих шагах вы присваиваете входные задержки и задержки обратной связи, чтобы лежать в диапазоне от 1 до 4 и количество скрытых нейронов, чтобы быть 10.
inputDelays = 1:4;
feedbackDelays = 1:4;
hiddenLayerSize = 10;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize,'open',trainFcn);
Примечание
Увеличение числа нейронов и количества задержек требует большего количества расчета, и это имеет тенденцию сверхсоответствовать данным, когда номера определяются слишком высоко, но это позволяет сети решать более сложные задачи. Больше слоев требует большего количества расчета, но их использование может привести к сети, решающей комплексные задачи более эффективно. Чтобы использовать больше чем один скрытый слой, введите размеры скрытого слоя как элементы массива в narxnet
команда.
Подготовьте данные к обучению. Когда обучение сеть, содержащая коснувшиеся линии задержки, необходимо заполнить задержки начальными значениями предикторов и ответами сети. Существует команда тулбокса, которая упрощает этот процесс - preparets
. Эта функция имеет три входных параметра: сеть, предикторы и ответы. Функция возвращает начальные условия, которые необходимы, чтобы заполнить коснувшиеся линии задержки в сети, и измененный предиктор и последовательности ответа, куда начальные условия были удалены. Можно вызвать функцию можно следующим образом:
[x,xi,ai,t] = preparets(net,X,{},T);
Создайте деление данных.
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
С этими настройками данные будут случайным образом разделены, с 70%, используемыми для обучения, 15% для валидации и 15% для тестирования.
Обучите сеть.
[net,tr] = train(net,x,t,xi,ai);
Во время обучения открывается следующее учебное окно. Это окно отображает прогресс обучения и позволяет вам прерывать обучение в любой точке путем нажатия на Stop Training.
Это обучение, остановленное, когда ошибка валидации, увеличенная последовательно для шести итераций.
Протестируйте сеть. После того, как сеть была обучена, можно использовать ее, чтобы вычислить сетевые выходные параметры. Следующий код вычисляет сетевые выходные параметры, ошибки и общую производительность. Обратите внимание на то, что, чтобы симулировать сеть с коснувшимися линиями задержки, необходимо присвоить начальные значения для этих задержанных сигналов. Это сделано с состояниями ввода (xi
) и состояния слоя (ai
) если preparets
в более ранней стадии.
y = net(x,xi,ai); e = gsubtract(t,y); performance = perform(net,t,y)
performance = 0.0147
Просмотрите сетевой график.
view(net)
Постройте запись обучения эффективности, чтобы проверять на потенциальный сверхподбор кривой.
figure, plotperform(tr)
Этот рисунок показывает что обучение и ошибочное уменьшение валидации до подсвеченной эпохи. Не кажется, что любой сверхподбор кривой произошел, потому что ошибка валидации не увеличивается перед этой эпохой.
Все обучение сделано в разомкнутом контуре (также названный последовательно-параллельной архитектурой), включая валидацию и тестирующие шаги. Типичный рабочий процесс должен полностью создать сеть в разомкнутом контуре, и только когда это было обучено (который включает валидацию и тестирующие шаги), это преобразовывается к замкнутому циклу для многоступенчатого вперед предсказания. Аналогично, R
значения в приложении Neural Net Times Series вычисляются на основе результатов обучения разомкнутого контура.
Замкните круг в сети 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,X,{},T);
yc = netc(xc,xic,aic);
closedLoopPerformance = perform(net,tc,yc)
closedLoopPerformance = 1.3979
Удалите задержку из сети, чтобы получить предсказание один временной шаг рано.
nets = removedelay(net);
nets.name = [net.name ' - Predict One Step Ahead'];
view(nets)
[xs,xis,ais,ts] = preparets(nets,X,{},T);
ys = nets(xs,xis,ais);
stepAheadPerformance = perform(nets,ts,ys)
stepAheadPerformance = 0.0147
От этого рисунка вы видите, что сеть идентична предыдущей сети разомкнутого контура, за исключением того, что одна задержка была удалена из каждой из коснувшихся линий задержки. Выходом сети является затем y (t + 1) вместо y (t). Это может иногда быть полезно, когда сеть развертывается для определенных приложений.
Если производительность сети не является удовлетворительной, вы могли бы попробовать любой из этих подходов:
Сбросьте начальные сетевые веса и смещения к новым значениям с init
и обучайтесь снова.
Увеличьте число скрытых нейронов или количество задержек.
Используйте больший обучающий набор данных.
Увеличьте число входных значений, если более релевантная информация доступна.
Попробуйте различный алгоритм настройки (см. Алгоритмы настройки).
Чтобы получить больше опыта в операциях командной строки, попробуйте некоторые из этих задач:
Во время обучения, открытого окно графика (такое как ошибочный график корреляции), и, смотрят, что он анимирует.
Постройте из командной строки с функциями такой как plotresponse
, ploterrcorr
и plotperform
.
Каждый раз нейронная сеть обучена, может привести к различному решению из-за случайного начального веса и сместить значения и различные деления данных в обучение, валидацию и наборы тестов. В результате различные нейронные сети, обученные на той же проблеме, могут дать различные выходные параметры для того же входа. Чтобы гарантировать, что нейронная сеть хорошей точности была найдена, переобучайтесь несколько раз.
Существует несколько других методов для того, чтобы улучшить начальные решения, если более высокая точность желаема. Для получения дополнительной информации смотрите, Улучшают Мелкое Обобщение Нейронной сети и Стараются не Сверхсоответствовать.
Neural Net Fitting | Neural Net Time Series | Neural Net Pattern Recognition | Neural Net Clustering | train
| preparets
| narxnet
| closeloop
| perform
| removedelay