До сих пор эта тема описывала процедуры обучения для нескольких конкретных динамических архитектур сетей. Однако любая сеть, которая может быть создана в тулбоксе, может быть обучена с помощью функций обучения, описанных в Multilayer Shallow Neural Networks и Backpropagation Training, пока компоненты сети дифференцируемы. В этом разделе приведен пример создания и обучения пользовательской архитектуры. Пользовательская архитектура, которую вы будете использовать, является моделью-ссылкой системой адаптивного управления (MRAC), которая подробно описана в Проект Модели-ссылки Neural Контроллера в Simulink.
Как видно Проект Модели-ссылки Neural Контроллера в Simulink, архитектура управления модели-ссылки имеет две подсети. Одна подсеть является моделью объекта, которым вы хотите управлять. Другой подсетью является контроллер. Вы начнете с обучения сети NARX, которая станет подсетью модели объекта управления. В этом примере вы будете использовать руку робота для представления объекта, как описано в Design Model-Reference Neural Controller в 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
функция обучения здесь, но можно также использовать любую из функций обучения, обсуждаемых в Multilayer Shallow Neural Networks and Backpropagation Training. Любая сеть, которую можно создать в тулбоксе, может быть обучена с помощью любой из этих функций обучения. Единственным ограничением является то, что все части сети должны быть дифференцируемыми.
Вы обнаружите, что обучение системы 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].