В этом примере показано, как обучить агента глубокой Q-образовательной-сети (DQN) хранению маршрута помогает (LKA) в Simulink® с помощью параллельного обучения. Для примера, который показывает, как обучить агента, не используя параллельное обучение, смотрите, Обучаются, Агент DQN для Хранения Маршрута Помогают (Reinforcement Learning Toolbox).
Для получения дополнительной информации об агентах DQN смотрите Глубоких Агентов Q-сети (Reinforcement Learning Toolbox). Для примера, который обучает агента DQN в MATLAB®, смотрите, Обучают Агента DQN Балансировать Систему Тележки с шестом (Reinforcement Learning Toolbox).
В агенте DQN каждый рабочий генерирует новые события из его копии агента и среды. После каждого N
шаги, рабочий отправляет события в агента хоста. Агент хоста обновляет свои параметры можно следующим образом.
Для асинхронного обучения агент хоста учится на полученном опыте, не ожидая всех рабочих, чтобы отправить события и передает обновленные параметры обратно рабочему, который обеспечил события. Затем рабочий продолжает генерировать события его средой с помощью обновленных параметров.
Для синхронного обучения агент хоста ожидает, чтобы получить события от всех рабочих и учится на этом опыте. Хост затем отправляет обновленные параметры всем рабочим одновременно. Затем все рабочие продолжают генерировать события с помощью обновленных параметров.
Среда обучения с подкреплением для этого примера является простой моделью велосипеда для динамики автомобиля, оборудованного датчиком. Цель обучения должна сохранить автомобиль, оборудованный датчиком, перемещающийся вдоль средней линии маршрутов путем корректировки переднего руководящего угла. Этот пример использует ту же модель транспортного средства, как Обучаются, Агент DQN для Хранения Маршрута Помогают (Reinforcement Learning Toolbox).
m = 1575; % total vehicle mass (kg) Iz = 2875; % yaw moment of inertia (mNs^2) lf = 1.2; % longitudinal distance from center of gravity to front tires (m) lr = 1.6; % longitudinal distance from center of gravity to rear tires (m) Cf = 19000; % cornering stiffness of front tires (N/rad) Cr = 33000; % cornering stiffness of rear tires (N/rad) Vx = 15; % longitudinal velocity (m/s)
Задайте шаг расчета Ts
и длительность симуляции T
в секундах.
Ts = 0.1; T = 15;
Выход системы LKA является передним руководящим углом автомобиля эго. Чтобы симулировать физические руководящие пределы автомобиля эго, ограничьте держащийся угол к области значений [–0.5,0.5]
рад.
u_min = -0.5; u_max = 0.5;
Искривление дороги задано постоянными 0.001 (). Начальным значением для бокового отклонения является 0.2
m и начальное значение для относительного угла рыскания –0.1
рад.
rho = 0.001; e1_initial = 0.2; e2_initial = -0.1;
Откройте модель.
mdl = 'rlLKAMdl'; open_system(mdl) agentblk = [mdl '/RL Agent'];
Для этой модели:
Сигнал действия руководящего угла от агента до среды от –15 градусов до 15 градусов.
Наблюдения средой являются боковым отклонением , относительный угол рыскания , их производные и , и их интегралы и .
Симуляция отключена когда боковое отклонение
Вознаграждение , если на каждом временном шаге ,
где вход управления от предыдущего временного шага .
Создайте интерфейс среды обучения с подкреплением для автомобиля, оборудованного датчиком.
Задайте информацию о наблюдении.
observationInfo = rlNumericSpec([6 1],'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1)); observationInfo.Name = 'observations'; observationInfo.Description = 'information on lateral deviation and relative yaw angle';
Задайте информацию о действии.
actionInfo = rlFiniteSetSpec((-15:15)*pi/180);
actionInfo.Name = 'steering';
Создайте интерфейс среды.
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
Интерфейс имеет дискретное пространство действий, где агент может применить один из 31 возможного руководящего угла от –15 градусов до 15 градусов. Наблюдение является шестимерным вектором, содержащим боковое отклонение, относительный угол рыскания, а также их производные и интегралы относительно времени.
Чтобы задать начальное условие для бокового отклонения и относительного угла рыскания, задайте функцию сброса среды использование указателя анонимной функции. localResetFcn
, то, которое задано в конце этого примера, рандомизирует начальное боковое отклонение и относительный угол рыскания.
env.ResetFcn = @(in)localResetFcn(in);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агенты DQN могут использовать мультивыходные аппроксимации критика Q-значения, которые обычно более эффективны. Мультивыходная аппроксимация имеет наблюдения как входные параметры и значения состояния активности как выходные параметры. Каждый выходной элемент представляет ожидаемое совокупное долгосрочное вознаграждение за принятие соответствующих дискретных мер от состояния, обозначенного входными параметрами наблюдения.
Чтобы создать критика, сначала создайте глубокую нейронную сеть с одним входом (шестимерное наблюдаемое состояние) и один выходной вектор с 31 элементом (равномерно распределенные держащиеся углы от-15 до 15 градусов). Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают политику и Представления Функции ценности (Reinforcement Learning Toolbox).
nI = observationInfo.Dimension(1); % number of inputs (6) nL = 120; % number of neurons nO = numel(actionInfo.Elements); % number of outputs (31) dnn = [ featureInputLayer(nI,'Normalization','none','Name','state') fullyConnectedLayer(nL,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(nL,'Name','fc2') reluLayer('Name','relu2') fullyConnectedLayer(nO,'Name','fc3')];
Просмотрите конфигурацию сети.
figure plot(layerGraph(dnn))
Задайте опции для представления критика с помощью rlRepresentationOptions
(Reinforcement Learning Toolbox).
criticOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlQValueRepresentation
(Reinforcement Learning Toolbox).
critic = rlQValueRepresentation(dnn,observationInfo,actionInfo,'Observation',{'state'},criticOptions);
Чтобы создать агента DQN, сначала задайте опции агента DQN с помощью rlDQNAgentOptions
(Reinforcement Learning Toolbox).
agentOpts = rlDQNAgentOptions(... 'SampleTime',Ts,... 'UseDoubleDQN',true,... 'TargetSmoothFactor',1e-3,... 'DiscountFactor',0.99,... 'ExperienceBufferLength',1e6,... 'MiniBatchSize',256); agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1e-4;
Затем создайте агента DQN с помощью заданного представления критика и опций агента. Для получения дополнительной информации смотрите rlDQNAgent
(Reinforcement Learning Toolbox).
agent = rlDQNAgent(critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции.
Запустите каждое обучение в большей части 10000
эпизоды, с каждым эпизодом, длящимся в большей части ceil(T/Ts)
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager только (установите Plots
и Verbose
опции соответственно).
Остановите обучение, когда вознаграждение эпизода достигнет -1
.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше 100.
Для получения дополнительной информации смотрите rlTrainingOptions
(Reinforcement Learning Toolbox).
maxepisodes = 10000; maxsteps = ceil(T/Ts); trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes, ... 'MaxStepsPerEpisode',maxsteps, ... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','EpisodeReward',... 'StopTrainingValue', -1,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',100);
Чтобы обучить агента параллельно, задайте следующие опции обучения.
Установите UseParallel
опция к true
.
Обучите агента параллельно асинхронно путем установки ParallelizationOptions.Mode
опция к "async"
.
После каждых 30 шагов каждый рабочий отправляет события в хост.
Агент DQN требует, чтобы рабочие отправили "experiences"
к хосту.
trainOpts.UseParallel = true; trainOpts.ParallelizationOptions.Mode = "async"; trainOpts.ParallelizationOptions.DataToSendFromWorkers = "experiences"; trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
Для получения дополнительной информации смотрите rlTrainingOptions
(Reinforcement Learning Toolbox).
Обучите агента с помощью train
(Reinforcement Learning Toolbox) функция. Обучение агент является в вычислительном отношении интенсивным процессом, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining
к false
. Чтобы обучить агента самостоятельно, установите doTraining
к true
. Из-за случайности параллельного обучения, можно ожидать, что различное обучение следует из графика ниже. График показывает результат обучения с четырьмя рабочими.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load pretrained agent for the example. load('SimulinkLKADQNParallel.mat','agent') end
Чтобы подтвердить производительность обученного агента, не прокомментируйте следующие две линии и симулируйте агента в среде. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
(Reinforcement Learning Toolbox) и sim
(Reinforcement Learning Toolbox).
% simOptions = rlSimulationOptions('MaxSteps',maxsteps); % experience = sim(env,agent,simOptions);
Чтобы продемонстрировать обученного агента с помощью детерминированных начальных условий, симулируйте модель в Simulink.
e1_initial = -0.4; e2_initial = 0.2; sim(mdl)
Как показано ниже, боковая ошибка (средний график) и относительный угол рыскания (нижний график) оба управляется, чтобы обнулить. Транспортное средство начинает с от средней линии (-0.4 м) и ненулевая угловая погрешность рыскания (0,2 рад). LKA позволяет автомобилю эго переместиться вдоль средней линии после 2,5 секунд. Держащийся угол (главный график) показывает, что контроллер достигает устойчивого состояния после 2 секунд.
function in = localResetFcn(in) % reset in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % random value for lateral deviation in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); % random value for relative yaw angle end
train
(Reinforcement Learning Toolbox)