До сих пор эта тема описывала процедуры обучения для нескольких конкретных динамических сетевых архитектур. Однако любая сеть, которая может быть создана на панели инструментов, может быть обучена с использованием функций обучения, описанных в многоуровневых неглубоких нейронных сетях и обучении обратному распространению, при условии, что компоненты сети различимы. В этом разделе приведен пример создания и обучения пользовательской архитектуры. Пользовательская архитектура, которую вы будете использовать, - это система эталонного адаптивного управления модели (MRAC), которая подробно описана в Design Model-Reference Neural Controller in Simulink.
Как можно видеть в Design Model-Reference Neural Controller in 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 внутрь. Начните с сети прямой связи, а затем добавьте соединения обратной связи. Также отключите обучение в подсети модели завода, так как она уже обучена. На следующем этапе обучения будет обучаться только подсеть контроллера.
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'])

На рисунке показано, что выходные данные модели завода соответствуют ссылочному входному сигналу с правильным критически затухающим откликом, даже если входная последовательность не совпадает с входной последовательностью в учебных данных. Реакция устойчивого состояния не идеально подходит для каждого шага, но это может быть улучшено с помощью большего тренировочного набора и, возможно, более скрытых нейронов.
Целью этого примера было показать, что можно создать собственную пользовательскую динамическую сеть и обучить ее с помощью стандартных функций обучения инструментария без каких-либо изменений. Любой сетевой график, который можно создать на панели инструментов, может быть обучен стандартным функциям обучения, если каждый компонент сетевого графика имеет определенную производную.
Следует отметить, что повторяющиеся сети, как правило, труднее поддаются обучению, чем сети прямой связи. Подробнее об этих трудностях обучения см. [HDH09].