exponenta event banner

Маглев Моделирование

В этом примере показано, как нейронная сеть NARX (Nonlinear AutoRegressive with eXternal input) может моделировать динамическую систему магнитной левитации.

Проблема: модель магнитной системы левитации

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

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

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

Почему нейронные сети?

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

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

Подготовка данных

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

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

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

Здесь загружается такой набор данных.

[x,t] = maglev_dataset;

Мы можем просмотреть размеры входов X и целей T.

Обратите внимание, что и X, и T имеют 4001 столбец. Они представляют 4001 временной интервал управляющего тока и положения магнита.

size(x)
size(t)
ans =

           1        4001


ans =

           1        4001

Моделирование временных рядов с помощью нейронной сети

Следующий шаг - создание нейронной сети, которая научится моделировать, как магнит меняет положение.

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

setdemorandstream(491218381)

Двухслойные (то есть однослойные) нейронные сети NARX могут соответствовать любому динамическому соотношению «вход-выход», учитывая достаточное количество нейронов в скрытом слое. Слои, которые не являются выходными слоями, называются скрытыми слоями.

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

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

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

Выход y (t) также является входом, отложенная версия которого подается обратно в сеть.

net = narxnet(1:2,1:2,10);
view(net)

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

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

Функция PREPARETS подготавливает для нас данные временных рядов для моделирования и обучения. Xs будут состоять из сдвинутых входных и целевых рядов, которые будут представлены сети. Xi - начальное состояние задержки на входе. Ai - состояния задержки уровня (пустые в этом случае, поскольку нет задержек уровня к уровню), а 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(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)

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

Изучите другие примеры и документацию для более глубокого понимания нейронных сетей и их приложений.