Этот пример показывает, как обучить, подтвердить и протестировать глубокую нейронную сеть (DNN), которая имитирует поведение нелинейного прогнозирующего контроллера модели для летающего робота. Затем он сравнивает поведение глубокой нейронной сети с поведением исходного контроллера. Чтобы обучить глубокую нейронную сеть, этот пример использует подход агрегирования данных (DAgger), как в [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 можно научиться политике интерактивным методом демонстратора. DAgger является итерационным методом, где DNN запускается в окружении с обратной связью. Эксперт, в данном случае контроллер NLMPC, выводит действия на основе состояний, посещаемых DNN. Таким образом, больше обучающих данных агрегируется, и DNN переобучается для улучшенной производительности. Для получения дополнительной информации см. раздел [1].
Обучите глубокую нейронную сеть с помощью DAggerTrainNetwork
функция. Он создает DAggerImFlyingRobotDNNObj.mat
файл, содержащий следующую информацию.
DatasetPath:
путь, где сохранен набор данных, соответствующий каждой итерации
policyObjs:
политики, которые были обучены в каждой итерации
finalData:
общее количество обучающих данных, собранных до окончательной итерации
finalPolicy:
лучшая политика среди всех собранных политик
Во-первых, создайте и инициализируйте параметры для обучения. Используйте сеть, обученную с помощью клонирования поведения (imitateMPCNetBehaviorCloningObj
) как начальная точка для обучения DAgger.
[dataStruct,nlmpcStruct,tuningParamsStruct,neuralNetStruct] = loadDAggerParameters(existingData, ...
numCol,nlobj,umax,options,imitateMPCNetBehaviorCloningObj);
Чтобы сэкономить время, загрузите предварительно обученную нейронную сеть путем установки doTraining
на false
. Чтобы обучить DAgger самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining DAgger = DAggerTrainNetwork(nlmpcStruct,dataStruct,neuralNetStruct,tuningParamsStruct); else load('DAggerImFlyingRobotDNNObj.mat'); end DNN = DAgger.finalPolicy;
В качестве альтернативы можно обучить нейронную сеть с измененным правилом обновления политики с помощью DAggerModifiedTrainNetwork
функция. В этой функции после каждые 20 итераций обучения DNN устанавливается на наиболее оптимальнейшее строение от предыдущих 20 итераций. Чтобы запустить этот пример с объектом нейронной сети с измененным подходом DAgger, используйте DAggerModifiedImFlyingRobotDNNObj.mat
файловой .
Чтобы сравнить эффективность контроллера 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 46.217801 seconds.
Запустите симуляцию обученной сети DAgger с обратной связью.
tic [xHistoryDNN,uHistoryDNN] = simModelDAggerImFlyingRobot(x0,u0,DNN,Ts,Tf); toc
Elapsed time is 0.889781 seconds.
Постройте график результатов и сравните NLMPC и обученные траектории DNN.
plotSimResultsImFlyingRobot(nlobj,xHistoryMPC,uHistoryMPC,xHistoryDNN,uHistoryDNN,umax,Tf)
Нейронная сеть DAgger успешно имитирует поведение контроллера NLMPC. Состояния летающего робота и управляйте траекториями действия для контроллера и глубокой нейронной сети DAgger тесно совпадают. Время симуляции с обратной связью для 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, Takayuki, Joni Pajarinen, Gerhard Neumann, J. Andrew Bagnell, Pieter Abbeel, and Jan Peters. «Algorithmic Perspective on Imitation Learning». Основы и тренды в робототехнике 7, № 1-2 (2018): 1-179. https://doi.org/10.1561/2300000053.