Этот пример иллюстрирует, как NARX (Нелинейный AutoRegressive с внешним входом) нейронная сеть может смоделировать магнитное поднятие динамическая система.
В этом примере мы пытаемся создать нейронную сеть, которая может предсказать динамическое поведение магнита, поднимаемого с помощью текущего управления.
Система характеризуется положением магнита и текущим управлением, оба из которых определяют, где магнит будет момент спустя.
Это - пример проблемы временных рядов, где прошлые значения временных рядов обратной связи (магнитное положение) и внешний входной ряд (текущее управление) используются, чтобы предсказать будущие значения ряда обратной связи.
Нейронные сети очень хороши в проблемах временных рядов. Нейронная сеть с достаточным количеством элементов (названный нейронами) может смоделировать динамические системы с произвольной точностью. Они особенно хорошо подходят для рассмотрения нелинейных динамических проблем. Нейронные сети являются хорошим кандидатом на то, чтобы решить эту задачу.
Сеть будет спроектирована при помощи записей положения фактического поднимаемого магнита, отвечающего на текущее управление.
Данные для функции подходящие проблемы настраиваются для нейронной сети путем организации данных в две матрицы, входные временные ряды X и целевые временные ряды T.
Входная серия X является массивом ячейки строки, где каждым элементом является связанный такт текущего управления.
Целевая серия T является массивом ячейки строки, где каждым элементом является связанный такт поднимаемого магнитного положения.
Здесь такой набор данных загружается.
[x,t] = maglev_dataset;
Мы можем просмотреть размеры входных параметров X и предназначаемся для T.
Обратите внимание на то, что и X и T имеют 4 001 столбец. Они представляют 4 001 такт текущего управления и магнитное положение.
size(x) size(t)
ans = 1 4001 ans = 1 4001
Следующий шаг должен создать нейронную сеть, которая будет учиться моделировать, как магнит меняет положение.
Поскольку нейронная сеть запускается со случайных начальных весов, результаты этого примера будут отличаться немного каждый раз, когда это запущено. Случайный seed собирается избежать этой случайности. Однако это не необходимо для ваших собственных приложений.
setdemorandstream(491218381)
2D слой (т.е. один скрытый слой) нейронные сети NARX может соответствовать любому динамическому отношению ввода - вывода, учитывая достаточные нейроны в скрытом слое. Слои, которые не являются выходными слоями, называются скрытыми слоями.
Мы попробуем один скрытый слой 10 нейронов для этого примера. В общем случае более трудные проблемы требуют большего количества нейронов, и возможно большего количества слоев. Более простые проблемы требуют меньшего количества нейронов.
Мы также попытаемся использовать задержки касания с двумя задержками внешнего входа (управляйте текущий), и обратная связь (магнитное положение). Больше задержек позволяет сети моделировать более комплексные динамические системы.
Ввод и вывод имеет размеры 0, потому что сеть еще не была сконфигурирована, чтобы совпадать с нашим входом и целевыми данными. Это произойдет, когда сеть будет обучена.
Выход y (t) является также входом, задержанная версия которого возвращена в сеть.
net = narxnet(1:2,1:2,10); view(net)
Прежде чем мы сможем обучить сеть, мы должны использовать первые два такта внешнего входа и временных рядов обратной связи, чтобы заполнить два состояния задержки касания сети.
Кроме того, мы должны использовать ряд обратной связи и в качестве входного ряда и в качестве целевого ряда.
Функциональный PREPARETS готовит данные временных рядов к симуляции и обучению нам. Xs будет состоять из переключенного входа и предназначаться для ряда, который будет представлен сети. Кси является начальными входными состояниями задержки. Ай состояния задержки слоя (пустой в этом случае, когда нет никаких задержек от слоя к слою), и Ts является переключенным рядом обратной связи.
[Xs,Xi,Ai,Ts] = preparets(net,x,{},t);
Теперь сеть готова быть обученной. Такты автоматически разделены на обучение, валидацию и наборы тестов. Набор обучающих данных используется, чтобы преподавать сеть. Обучение продолжается, пока сеть продолжает изменять к лучшему набор валидации. Набор тестов обеспечивает абсолютно независимую меру сетевой точности.
Инструмент Обучения Нейронной сети показывает обученную сеть, и алгоритмы раньше обучали его. Это также отображает учебное состояние во время обучения и критериев, которые остановились, обучение будет подсвечено в зеленом.
Кнопки в нижней части открывают полезные графики, которые могут быть открыты в течение и после обучения. Ссылки рядом с именами алгоритма и кнопками графика открывают документацию относительно тех предметов.
[net,tr] = train(net,Xs,Ts,Xi,Ai); nntraintool
nntraintool('close')
Чтобы видеть, как производительность сети, улучшаемая во время обучения, или, нажимает кнопку "Performance" в учебном инструменте или вызывает PLOTPERFORM.
Уровень измерен в терминах среднеквадратической ошибки и показан в логарифмической шкале. Это быстро уменьшилось, когда сеть была обучена.
Производительность показывают для каждого обучения, валидации и наборов тестов.
plotperform(tr)
Среднеквадратическая ошибка обученной нейронной сети в течение всех тактов может теперь быть измерена.
Y = net(Xs,Xi,Ai); perf = mse(net,Ts,Y)
perf = 2.9245e-06
PLOTRESPONSE покажет нам ответ сети по сравнению с фактическим магнитным положением. Если модель будет точна '+', то точки отследят ромбовидные точки, и ошибки на нижней оси будут очень малы.
plotresponse(Ts,Y)
PLOTERRCORR показывает корреляцию ошибки во время t, e (t) с ошибками по различным задержкам, e (t+lag). Центральная линия показывает среднеквадратическую ошибку. Если сеть была обучена хорошо, все другие линии будут намного короче, и большинство, если не все будут находиться в пределах красных пределов достоверности.
Функциональный GSUBTRACT используется, чтобы вычислить ошибку. Эта функция обобщает вычитание, чтобы поддержать различия между данными о массиве ячеек.
E = gsubtract(Ts,Y); ploterrcorr(E)
Точно так же PLOTINERRCORR показывает корреляцию ошибки относительно входных параметров с различными степенями задержки. В этом случае большинство или все линии должны находиться в пределах пределов достоверности, включая центральную линию.
plotinerrcorr(Xs,E)
Сеть была обучена в форме разомкнутого цикла, где цели использовались в качестве входных параметров обратной связи. Сеть может также быть преобразована в форму замкнутого цикла, где ее собственные предсказания становятся входными параметрами обратной связи.
net2 = closeloop(net); view(net2)
Мы можем симулировать сеть в форме замкнутого цикла. В этом случае сети только дают начальные магнитные положения, и затем должна использовать его собственные предсказанные положения рекурсивно, чтобы предсказать новые положения.
Это быстро приводит к плохой подгонке между предсказанным и фактическим ответом. Это произойдет, даже если модель будет очень хороша. Но интересно, чтобы видеть, как много шагов они соответствуют перед разделением.
Снова, PREPARETS делает работу подготовки данных временных рядов для нас учитывающий измененную сеть.
[Xs,Xi,Ai,Ts] = preparets(net2,x,{},t); Y = net2(Xs,Xi,Ai); plotresponse(Ts,Y)
Если приложение потребовало, чтобы мы получили доступ к предсказанному магниту, располагают такт перед тем, когда это на самом деле происходит, мы можем удалить задержку из сети так в любой момент времени t, выход является оценкой положения во время t+1.
net3 = removedelay(net); view(net3)
Снова мы используем PREPARETS, чтобы подготовить временные ряды к симуляции. На этот раз сеть снова очень точна, когда она делает предсказание разомкнутого цикла, но выход смещен один такт.
[Xs,Xi,Ai,Ts] = preparets(net3,x,{},t); Y = net3(Xs,Xi,Ai); plotresponse(Ts,Y)
Этот пример проиллюстрировал, как спроектировать нейронную сеть, которая моделирует поведение динамической магнитной системы поднятия.
Исследуйте другие примеры и документацию для большего понимания нейронных сетей и их приложений.