В этом примере показано, как обучаться, подтвердите и протестируйте глубокую нейронную сеть (DNN), которая подражает поведению нелинейного прогнозирующего контроллера модели для летающего робота. Это затем сравнивает поведение глубокой нейронной сети с тем из исходного контроллера. Чтобы обучить глубокую нейронную сеть, этот пример использует агрегацию данных (Крестик) подход как в [1].
Нелинейное прогнозирующее управление модели (NLMPC) решает ограниченную нелинейную задачу оптимизации в режиме реального времени на основе текущего состояния объекта. Поскольку NLMPC решает свою задачу оптимизации способом разомкнутого контура, существует потенциал, чтобы заменить контроллер на обученный DNN. Выполнение так является привлекательной опцией, начиная с оценки DNN может быть более в вычислительном отношении эффективным, чем решение нелинейной задачи оптимизации в режиме реального времени.
Если обученный DNN обоснованно аппроксимирует поведение контроллера, можно затем развернуть сеть для приложения управления. Можно также использовать сеть в качестве точки "теплого" запуска для того, чтобы обучить сеть агента агента обучения с подкреплением. Для примера, который делает так с DNN, обученным приложению MPC, смотрите, Обучают Агента DDPG с Предварительно обученной Сетью Агента.
Спроектируйте нелинейный контроллер MPC для летающего робота. Движущие силы для летающего робота совпадают с в Оптимизации Траектории и Управлении Летающего Робота Используя Нелинейный MPC (Model Predictive Control Toolbox) примером. Во-первых, задайте предел для контрольных переменных, которые являются уровнями тяги робота.
umax = 3;
Создайте нелинейный контроллер MPC объект nlobj
. Чтобы сократить командное окно выход, отключите сообщения обновления MPC.
mpcverbosity off;
nlobj = createMPCobjImFlyingRobot(umax);
Загрузите входные данные от DAggerInputDataFileImFlyingRobot.mat
. Столбцы набора данных содержат:
положение робота вдоль оси X.
положение робота вдоль оси Y.
ориентация робота.
скорость робота вдоль оси X.
скорость робота вдоль оси Y.
скорость вращения робота.
тяга на левой стороне летающего робота
тяга на правой стороне летающего робота
тяга на левой стороне, вычисленной NLMPC
тяга на правой стороне, вычисленной NLMPC
Данные в DAggerInputDataFileImFlyingRobot.mat
создается путем вычисления действия управления NLMPC для случайным образом сгенерированных состояний (, , , , , ), и предыдущие действия управления (, ). Чтобы сгенерировать ваши собственные обучающие данные, используйте collectDataImFlyingRobot
функция.
Загрузите входные данные.
fileName = 'DAggerInputDataFileImFlyingRobot.mat';
DAggerData = load(fileName);
data = DAggerData.data;
existingData = data;
numCol = size(data,2);
Архитектура глубоких нейронных сетей использует следующие типы слоев.
imageInputLayer
входной слой нейронной сети.
fullyConnectedLayer
умножает вход на матрицу веса и затем добавляет вектор смещения.
reluLayer
функция активации нейронной сети.
tanhLayer
ограничивает значение к области значений к [-1,1].
scalingLayer
масштабирует значение к области значений к [-3,3].
regressionLayer
задает функцию потерь нейронной сети.
Создайте глубокую нейронную сеть, которая будет подражать контроллеру NLMPC после обучения.
numObservations = numCol-2; numActions = 2; hiddenLayerSize = 256; imitateMPCNetwork = [ featureInputLayer(numObservations,'Normalization','none','Name','observation') fullyConnectedLayer(hiddenLayerSize,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(hiddenLayerSize,'Name','fc2') reluLayer('Name','relu2') fullyConnectedLayer(hiddenLayerSize,'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(hiddenLayerSize,'Name','fc4') reluLayer('Name','relu4') fullyConnectedLayer(hiddenLayerSize,'Name','fc5') reluLayer('Name','relu5') fullyConnectedLayer(hiddenLayerSize,'Name','fc6') reluLayer('Name','relu6') fullyConnectedLayer(numActions,'Name','fcLast') tanhLayer('Name','tanhLast') scalingLayer('Name','ActorScaling','Scale',umax) regressionLayer('Name','routput')];
Постройте сеть.
plot(layerGraph(imitateMPCNetwork))
Один подход к изучению опытной политики с помощью контролируемого изучения является методом клонирования поведения. Этот метод делит опытные демонстрации (действия управления NLMPC в ответ на наблюдения) в пары состояния активности и применяет контролируемое обучение обучить сеть.
Задайте опции обучения.
% intialize validation cell array validationCellArray = {0,0}; options = trainingOptions('adam', ... 'Verbose', false, ... 'Plots', 'training-progress', ... 'Shuffle', 'every-epoch', ... 'MiniBatchSize', 512, ... 'ValidationData', validationCellArray, ... 'InitialLearnRate', 1e-3, ... 'ExecutionEnvironment', 'cpu', ... 'GradientThreshold', 10, ... 'MaxEpochs', 40 ... );
Можно обучить поведение, клонирующее нейронную сеть следующим ниже шагов
Соберите данные с помощью collectDataImFlyingRobot
функция.
Обучите сеть клонирования поведения использование behaviorCloningTrainNetwork
функция.
Обучение DNN является в вычислительном отношении интенсивным процессом. Чтобы сэкономить время, загрузите предварительно обученный объект нейронной сети.
load('behaviorCloningMPCImDNNObject.mat');
imitateMPCNetBehaviorCloningObj = behaviorCloningNNObj.imitateMPCNetObj;
Обучение DNN использование клонирования поведения уменьшает разрыв между DNN и эффективностью NLMPC. Однако поведению, клонирующему нейронную сеть, не удается подражать поведению контроллера NLMPC правильно на некоторых случайным образом сгенерированных данных.
Чтобы улучшать производительность DNN, можно изучить политику с помощью интерактивного метода демонстранта. Крестик является итерационным методом, куда DNN запущен в среде с обратной связью. Эксперт, в этом случае диспетчер NLMPC, выходные действия на основе состояний посещает DNN. Этим способом больше обучающих данных агрегировано, и DNN переобучен для улучшенной производительности. Для получения дополнительной информации см. [1].
Обучите глубокую нейронную сеть с помощью DAggerTrainNetwork
функция. Это создает DAggerImFlyingRobotDNNObj.mat
файл, который содержит следующую информацию.
DatasetPath:
путь, где набор данных, соответствующий каждой итерации, хранится
policyObjs:
политики, которые были обучены в каждой итерации
finalData:
общие обучающие данные собраны до итоговой итерации
finalPolicy:
лучшая политика среди всех собранных политик
Во-первых, создайте и инициализируйте параметры для обучения. Используйте сеть, обученную с помощью клонирования поведения (imitateMPCNetBehaviorCloningObj
) как начальная точка для обучения Крестика.
[dataStruct,nlmpcStruct,tuningParamsStruct,neuralNetStruct] = loadDAggerParameters(existingData, ...
numCol,nlobj,umax,options,imitateMPCNetBehaviorCloningObj);
Чтобы сэкономить время, загрузите предварительно обученную нейронную сеть установкой doTraining
к false
. Чтобы обучить Крестик самостоятельно, установите doTraining
к true
.
doTraining = false; if doTraining DAgger = DAggerTrainNetwork(nlmpcStruct,dataStruct,neuralNetStruct,tuningParamsStruct); else load('DAggerImFlyingRobotDNNObj.mat'); end DNN = DAgger.finalPolicy;
Как альтернатива, можно обучить нейронную сеть с модифицированным правилом обновления политики с помощью DAggerModifiedTrainNetwork
функция. В этой функции, после каждых 20 учебных итераций, DNN установлен в самую оптимальную настройку от предыдущих 20 итераций. Чтобы запустить этот пример с объектом нейронной сети с модифицированным подходом Крестика, используйте DAggerModifiedImFlyingRobotDNNObj.mat
file.
Чтобы сравнить эффективность контроллера NLMPC и обученного DNN, запустите симуляции с обратной связью с летающей моделью робота.
Установите начальное условие для состояний летающего робота (, , , , , ) и контрольные переменные летающего робота (, ).
x0 = [-1.8200 0.5300 -2.3500 1.1700 -1.0400 0.3100]'; u0 = [-2.1800 -2.6200]';
Запустите симуляцию с обратной связью контроллера NLMPC.
% Duration Tf = 15; % Sample time Ts = nlobj.Ts; % Simulation steps Tsteps = Tf/Ts+1; % Run NLMPC in closed loop. tic [xHistoryMPC,uHistoryMPC] = simModelMPCImFlyingRobot(x0,u0,nlobj,Tf); toc
Elapsed time is 16.401473 seconds.
Запустите симуляцию с обратной связью обученной сети DAgger.
tic [xHistoryDNN,uHistoryDNN] = simModelDAggerImFlyingRobot(x0,u0,DNN,Ts,Tf); toc
Elapsed time is 0.919362 seconds.
Постройте результаты и сравните NLMPC и обученные траектории DNN.
plotSimResultsImFlyingRobot(nlobj,xHistoryMPC,uHistoryMPC,xHistoryDNN,uHistoryDNN,umax,Tf)
Нейронная сеть Крестика успешно подражает поведению контроллера NLMPC. Летающие состояния робота и траектории действия управления для контроллера и глубокой нейронной сети Крестика практически ориентированы. Время симуляции с обратной связью для DNN значительно меньше времени симуляции контроллера NLMPC.
Чтобы подтвердить эффективность обученного DNN, анимируйте летающего робота с данными из симуляции с обратной связью DNN. Летающий робот приземляется в начале координат успешно.
Lx = 5; Ly = 5; for ct = 1:Tsteps x = xHistoryDNN(ct,1); y = xHistoryDNN(ct,2); theta = xHistoryDNN(ct,3); tL = uHistoryDNN(ct,1); tR = uHistoryDNN(ct,2); rl.env.viz.plotFlyingRobot(x,y,theta,tL,tR,Lx,Ly); pause(0.05); end
% Turn on MPC messages mpcverbosity on;
[1] Osa, Такаюки, Джони Пэджэринен, Герхард Нейман, Дж. Эндрю Бэгнелл, Питер Аббеель и Ян Питерс. ‘Алгоритмический Взгляд на Изучение Имитации’. Основы и Тренды в Робототехнике 7, № 1-2 (2018): 1–179. https://doi.org/10.1561/2300000053.