До сих пор эта тема описала методы обучения для нескольких определенной динамической сетевой архитектуры. Однако любая сеть, которая может быть создана в тулбоксе, может быть обучена с помощью учебных функций, описанных в Многоуровневых Мелких Нейронных сетях и Обучении Обратной связи, пока компоненты сети дифференцируемы. В этом разделе приведены пример того, как создать и обучить пользовательскую архитектуру. Пользовательская архитектура, которую вы будете использовать, является системой адаптивного управления моделью - ссылкой (MRAC), которая описана подробно в Нейроконтроллере Модели - ссылки Проекта в Simulink.
Как вы видите в Нейроконтроллере Модели - ссылки Проекта в Simulink, архитектура управления модели - ссылки имеет две подсети. Одна подсеть является моделью объекта, которым вы хотите управлять. Другая подсеть является контроллером. Вы начнете путем обучения сети NARX, которая станет подсетью модели объекта управления. В данном примере вы будете использовать манипулятор, чтобы представлять объект, как описано в Нейроконтроллере Модели - ссылки Проекта в Simulink. Следующий код загрузит данные, собранные от манипулятора, и создаст и обучит сеть NARX. Для этой простой проблемы вы не должны предварительно обрабатывать данные, и все данные могут использоваться в обучении, таким образом, никакое деление данных не необходимо.
[u,y] = robotarm_dataset;
d1 = [1:2];
d2 = [1:2];
S1 = 5;
narx_net = narxnet(d1,d2,S1);
narx_net.divideFcn = '';
narx_net.inputs{1}.processFcns = {};
narx_net.inputs{2}.processFcns = {};
narx_net.outputs{2}.processFcns = {};
narx_net.trainParam.min_grad = 1e-10;
[p,Pi,Ai,t] = preparets(narx_net,u,{},y);
narx_net = train(narx_net,p,t,Pi);
narx_net_closed = closeloop(narx_net);
view(narx_net_closed)
Получившаяся сеть показана на рисунке.
Теперь, когда модель объекта управления NARX обучена, можно создать общую систему MRAC и вставить модель NARX внутри. Начните с сети feedforward, и затем добавьте связи обратной связи. Кроме того, выключите изучение в подсети модели объекта управления, поскольку это было уже обучено. Следующий этап обучения обучит только подсеть контроллера.
mrac_net = feedforwardnet([S1 1 S1]); mrac_net.layerConnect = [0 1 0 1;1 0 0 0;0 1 0 1;0 0 1 0]; mrac_net.outputs{4}.feedbackMode = 'closed'; mrac_net.layers{2}.transferFcn = 'purelin'; mrac_net.layerWeights{3,4}.delays = 1:2; mrac_net.layerWeights{3,2}.delays = 1:2; mrac_net.layerWeights{3,2}.learn = 0; mrac_net.layerWeights{3,4}.learn = 0; mrac_net.layerWeights{4,3}.learn = 0; mrac_net.biases{3}.learn = 0; mrac_net.biases{4}.learn = 0;
Следующий код выключает деление данных и предварительную обработку, которые не нужны для этой проблемы в качестве примера. Это также устанавливает задержки, необходимые для определенных слоев, и называет сеть.
mrac_net.divideFcn = ''; mrac_net.inputs{1}.processFcns = {}; mrac_net.outputs{4}.processFcns = {}; mrac_net.name = 'Model Reference Adaptive Control Network'; mrac_net.layerWeights{1,2}.delays = 1:2; mrac_net.layerWeights{1,4}.delays = 1:2; mrac_net.inputWeights{1}.delays = 1:2;
Чтобы сконфигурировать сеть, вам нужны некоторые демонстрационные обучающие данные. Следующий код загружает и отображает обучающие данные на графике и конфигурирует сеть:
[refin,refout] = refmodel_dataset; ind = 1:length(refin); plot(ind,cell2mat(refin),ind,cell2mat(refout)) mrac_net = configure(mrac_net,refin,refout);
Вы хотите, чтобы система MRAC с обратной связью ответила таким же образом как эталонная модель, которая использовалась, чтобы сгенерировать эти данные. (См. Использование диспетчер Модели - ссылки Блок для описания эталонной модели.)
Теперь вставьте веса от обученной сети модели объекта управления в соответствующее местоположение системы MRAC.
mrac_net.LW{3,2} = narx_net_closed.IW{1}; mrac_net.LW{3,4} = narx_net_closed.LW{1,2}; mrac_net.b{3} = narx_net_closed.b{1}; mrac_net.LW{4,3} = narx_net_closed.LW{2,1}; mrac_net.b{4} = narx_net_closed.b{2};
Можно установить выходные веса сети контроллера обнулять, который даст объекту начальный вход нуля.
mrac_net.LW{2,1} = zeros(size(mrac_net.LW{2,1})); mrac_net.b{2} = 0;
Можно также сопоставить любые графики и учебную функцию, которой вы желаете к сети.
mrac_net.plotFcns = {'plotperform','plottrainstate',... 'ploterrhist','plotregression','plotresponse'}; mrac_net.trainFcn = 'trainlm';
Итоговая сеть MRAC может быть просмотрена со следующей командой:
view(mrac_net)
Слой 3 и слой 4 (выход) составляют подсеть модели объекта управления. Слой 1 и слой 2 составляют контроллер.
Можно теперь подготовить обучающие данные и обучить сеть.
[x_tot,xi_tot,ai_tot,t_tot] = ...
preparets(mrac_net,refin,{},refout);
mrac_net.trainParam.epochs = 50;
mrac_net.trainParam.min_grad = 1e-10;
[mrac_net,tr] = train(mrac_net,x_tot,t_tot,xi_tot,ai_tot);
Заметьте, что вы используете trainlm
учебная функция здесь, но любая из учебных функций, обсужденных в Многоуровневых Мелких Нейронных сетях и Обучении Обратной связи, могла использоваться также. Любая сеть, которую можно создать в тулбоксе, может быть обучена с любой из тех учебных функций. Единственное ограничение - то, что все части сети должны быть дифференцируемыми.
Вы найдете, что обучение системы MRAC берет намного дольше что обучение модели объекта управления NARX. Это вызвано тем, что сеть является текущей, и динамическая обратная связь должна использоваться. Это определяется автоматически программным обеспечением тулбокса и не требует никакого вмешательства пользователя. Существует несколько реализаций динамической обратной связи (см. [DeHa07]), и программное обеспечение тулбокса автоматически определяет самый эффективный для выбранной сетевой архитектуры и учебного алгоритма.
После того, как сеть была обучена, можно протестировать операцию путем применения тестового воздействия к сети MRAC. Следующий код создает skyline
функция ввода, которая является серией шагов случайной высоты и ширины, и применяет его к обученной сети MRAC.
testin = skyline(1000,50,200,-.7,.7); testinseq = con2seq(testin); testoutseq = mrac_net(testinseq); testout = cell2mat(testoutseq); figure plot([testin' testout'])
От фигуры вы видите, что модель объекта управления, выход действительно следует за ссылочным входом с правильным критически ослабленным ответом, даже при том, что входная последовательность не была тем же самым как входной последовательностью в обучающих данных. Ответ устойчивого состояния не совершенен для каждого шага, но это могло быть улучшено с большим набором обучающих данных и возможно более скрытыми нейронами.
Цель этого примера состояла в том, чтобы показать, что можно создать собственную динамическую сеть и обучаться, это с помощью стандартного обучения тулбокса функционирует без любых модификаций. Любая сеть, которую можно создать в тулбоксе, может быть обучена со стандартными учебными функциями, пока каждый компонент сети имеет заданную производную.
Нужно отметить, что текущие сети обычно больше затрудняют, чтобы обучаться, чем сети feedforward. См. [HDH09] для некоторого обсуждения этих учебных трудностей.