Этот пример расширяет Train в качестве примера, Агент DQN для Хранения Маршрута Помогает демонстрировать параллельное обучение агенту глубокой Q-образовательной-сети (DQN) для хранения маршрута помогает (LKA) в Simulink®.
Для получения дополнительной информации об агентах DQN смотрите Глубокие Агенты Q-сети. Для примера, который обучает агент DQN в MATLAB®, смотрите Train Агент DQN, чтобы Сбалансировать полюсную Корзиной Систему.
Для DQN каждый рабочий генерирует новые события из его копии агента и среды. После каждого N
шаги рабочий отправляет события в агент хоста. Агент хоста будет обновлять свои параметры можно следующим образом:
Для асинхронного обучения агент хоста учится на полученном опыте и передает обновленные параметры обратно рабочему, который обеспечил события. Затем рабочий продолжает генерировать события от его среды с помощью обновленных параметров.
Для синхронного обучения агент хоста ожидает, чтобы получить события от всех рабочих и учится на этом опыте. Хост затем отправляет обновленные параметры всем рабочим одновременно. Затем все рабочие продолжают генерировать события с помощью обновленных параметров.
Среда обучения укрепления для этого примера является простой моделью велосипеда для динамики автомобиля, оборудованного датчиком. Учебная цель состоит в том, чтобы сохранить автомобиль, оборудованный датчиком, перемещающийся вдоль средней линии маршрутов путем корректировки переднего руководящего угла. Этот пример использует ту же модель автомобиля в качестве в Train, которому Помогает Агент DQN для Хранения Маршрута.
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 м, и начальное значение для относительного угла отклонения от курса является-0.1 радами.
rho = 0.001; e1_initial = 0.2; e2_initial = -0.1;
Откройте модель.
mdl = 'rlLKAMdl'; open_system(mdl) agentblk = [mdl '/RL Agent'];
Для этой модели:
Сигнал действия руководящего угла от агента до среды от-15 градусов до 15 градусов.
Наблюдения от среды являются боковым отклонением , относительный угол отклонения от курса , их производные и , и их интегралы и .
Симуляция отключена когда боковое отклонение
Вознаграждение , если на каждом временном шаге :
где вход управления от предыдущего временного шага .
Создайте интерфейс среды RL для автомобиля, оборудованного датчиком.
% create observation info 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'; % create action Info actionInfo = rlFiniteSetSpec((-15:15)*pi/180); actionInfo.Name = 'steering'; % define environment env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
Интерфейс имеет дискретный пробел действия, где агент может применить один из 31 возможного руководящего угла от-15 градусов до 15 градусов.
Чтобы задать начальное условие для бокового отклонения и относительного угла отклонения от курса, задайте функцию сброса среды использование указателя анонимной функции.
% randomize initial values for lateral deviation and relative yaw angle
env.ResetFcn = @(in)localResetFcn(in);
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Агент DQN аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выводом. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
L = 24; % number of neurons statePath = [ imageInputLayer([6 1 1],'Normalization','none','Name','state') fullyConnectedLayer(L,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(L,'Name','fc2') additionLayer(2,'Name','add') reluLayer('Name','relu2') fullyConnectedLayer(L,'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(1,'Name','fc4')]; actionPath = [ imageInputLayer([1 1 1],'Normalization','none','Name','action') fullyConnectedLayer(L, 'Name', 'fc5')]; criticNetwork = layerGraph(statePath); criticNetwork = addLayers(criticNetwork,actionPath); criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');
Задайте опции для представления критика с помощью rlRepresentationOptions
.
criticOpts = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,observationInfo,actionInfo,'Observation',{'state'},'Action',{'action'},criticOpts);
Чтобы создать агент DQN, сначала задайте опции агента DQN с помощью rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions(... 'SampleTime',Ts,... 'UseDoubleDQN',true,... 'TargetSmoothFactor',1e-3,... 'DiscountFactor',0.99,... 'ExperienceBufferLength',1e6,... 'MiniBatchSize',64);
Затем создайте агент DQN с помощью заданного представления критика и опций агента. Для получения дополнительной информации смотрите rlDQNAgent
.
agent = rlDQNAgent(critic,agentOpts);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение самое большее 5 000 эпизодов с каждым эпизодом, длящимся самое большее 150 временных шагов.
Отобразите учебный прогресс диалогового окна Episode Manager.
Остановите обучение, когда вознаграждение эпизода достигнет-1.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше, чем -2.5
.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 5000; maxsteps = ceil(T/Ts); trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes, ... 'MaxStepsPerEpisode',maxsteps, ... 'Verbose',false, ... 'Plots','training-progress',... 'StopTrainingCriteria','EpisodeReward',... 'StopTrainingValue', -1,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',-2.5);
Чтобы обучить агент параллельно, задайте следующие опции обучения.
Установите опцию UseParallel
на Истинный.
Обучите агент параллельно асинхронно путем установки опции ParallelizationOptions.Mode
на "async"
.
После каждых 30 шагов каждый рабочий отправляет события в хост.
Агент DQN требует, чтобы рабочие отправили "experiences"
в хост.
trainOpts.UseParallel = true; trainOpts.ParallelizationOptions.Mode = "async"; trainOpts.ParallelizationOptions.DataToSendFromWorkers = "experiences"; trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 30; trainOpts.ParallelizationOptions.WorkerRandomSeeds = -1;
Для получения дополнительной информации смотрите rlTrainingOptions
.
Обучите агент с помощью функции train
. Это - в вычислительном отношении интенсивный процесс, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученный агент установкой 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
и sim
.
% simOptions = rlSimulationOptions('MaxSteps',maxsteps); % experience = sim(env,agent,simOptions);
Чтобы продемонстрировать обученный агент на детерминированных начальных условиях, моделируйте модель в Simulink.
e1_initial = -0.4; e2_initial = 0.2; sim(mdl)
Как показано ниже, боковая ошибка (средний график) и относительный угол отклонения от курса (нижний график) оба управляется, чтобы обнулить. Автомобиль начинает с от средней линии (-0.4 м) и ненулевая угловая погрешность отклонения от курса (0,2 рада). Хранение маршрута помогает, делает автомобиль эго, перемещающийся вдоль средней линии приблизительно 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
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.