Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (DDPG) для помощника по хранению маршрута (LKA) в Simulink. Чтобы сделать обучение более эффективным, актёр агента DDPG инициализируется глубокой нейронной сетью, которая ранее была обучена с помощью контролируемого обучения. Этот обученный актёр обучается на примере Imitate MPC Controller for Lane Keeping Assist.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики.
Цель обучения для приложения поддержания маршрута состоит в том, чтобы сохранить автомобиль , оборудованный датчиком, перемещающийся по осевой линии маршрута, путем регулировки угла поворота переднего руля. Этот пример использует ту же динамику автомобиля , оборудованного датчиком и динамику датчика, что и пример Train DQN Агента for Lane Keeping Assist.
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 является угол поворота автомобиля , оборудованного датчиком спереди. Учитывая физические ограничения автомобиля , оборудованного датчиком, ограничьте его угол поворота области значений [-60,60] степеней. Задайте ограничения в радианах.
u_min = -1.04; u_max = 1.04;
Задайте кривизну дороги как константу 0,001 ().
rho = 0.001;
Установите начальные значения для бокового отклонения (e1_initial
) и относительный угол рыскания (e2_initial
). Во время обучения эти начальные условия устанавливаются в случайные значения для каждого эпизода тренировки.
e1_initial = 0.2; e2_initial = -0.1;
Откройте модель.
mdl = 'rlActorLKAMdl';
open_system(mdl)
Определите путь к блоку Агент в модели.
agentblk = [mdl '/RL Agent'];
Создайте интерфейс окружения обучения с подкреплением для автомобиля , оборудованного датчиком. Для этого сначала задайте наблюдения и спецификации действия. Эти наблюдения и действия аналогичны функциям контролируемого обучения, используемым в Imitate MPC Controller for Lane Keeping Assist.
Шесть наблюдений для окружения являются поперечной скоростью , скорость рыскания , боковое отклонение , относительный угол рыскания , угол поворота на предыдущем шаге , и кривизны .
observationInfo = rlNumericSpec([6 1],... 'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1)); observationInfo.Name = 'observations';
Действие для окружения является углом наклона переднего руля. Задайте ограничения угла поворота при создании объекта спецификации действия.
actionInfo = rlNumericSpec([1 1],'LowerLimit',u_min,'UpperLimit',u_max); actionInfo.Name = 'steering';
В модели блок Signal Processing for LKA создает векторный сигнал наблюдения, вычисляет функцию вознаграждения и вычисляет стоповый сигнал.
Вознаграждение , предоставляется в каждый временной шаг , является следующим, где является управляющим входом от предыдущего временного шага .
Симуляция останавливается, когда .
Создайте окружение обучения с подкреплением.
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
Чтобы задать начальное условие для бокового отклонения и относительного угла рыскания, задайте функцию сброса окружения с помощью указателя анонимной функции. The localResetFcn
функция, заданная в конце примера, устанавливает начальное боковое отклонение и относительный угол рыскания в случайные значения.
env.ResetFcn = @(in)localResetFcn(in);
Исправьте начальное значение генератора для повторяемости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, заданное наблюдениями и действиями, используя представление функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети, смотрите, Создают политику и представления функции ценности.
critic = createLaneKeepingCritic(observationInfo,actionInfo);
Агент DDPG решает, какое действие взять заданные наблюдения, используя представление актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие).
[actor,actorOptions] = createLaneKeepingActor(observationInfo,actionInfo);
Эти начальные сети актёра и критика имеют случайные начальные значения параметров.
Чтобы создать агента DDPG, сначала укажите опции агента DDPG.
agentOptions = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99,... 'MiniBatchSize',64 ... ); agentOptions.NoiseOptions.StandardDeviation = 0.3; agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-5;
Создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Как базовая линия, обучите агента с актером, который имеет случайные начальные параметры. Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запустите обучение на самое большее 50000 эпизодах с каждым эпизодом, длящимся самое большее 150 временных шагов.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов.
Остановите обучение, когда вознаграждение эпизода достигнет -1.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше - 2.5
.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 50000; maxsteps = T/Ts; trainingOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','EpisodeReward',... 'StopTrainingValue',-1,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',-2.5);
Обучите агента с помощью train
функция. Обучение является интенсивным в вычислительном отношении процессом, который занимает несколько часов. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts); else % Load pretrained agent for the example. load('ddpgFromScratch.mat'); end
Можно задать сети актёра вашего агента глубокую нейронную сеть, которая была предварительно обучена. В данном примере используйте глубокую нейронную сеть из примера Imitate MPC Controller for Lane Keeping Assist. Эта сеть была обучена имитировать прогнозирующий контроллер модели, используя контролируемое обучение.
Загрузите предварительно обученную сеть актёра.
load('imitateMPCNetActorObj.mat','imitateMPCNetObj');
Создайте представление актера, используя предварительно обученного актёра.
supervisedActor = rlDeterministicActorRepresentation(imitateMPCNetObj,observationInfo,actionInfo, ... 'Observation',imitateMPCNetObj.InputNames,'Action',{'Scale1'},actorOptions);
Проверяйте, что сеть, используемая supervisedActor
- тот же самый, который был загружен. Для этого оцените и сеть, и агента, используя одно и то же случайное входное наблюдение.
testData = rand(6,1);
Оцените глубокую нейронную сеть.
predictImNN = predict(imitateMPCNetObj,testData','ExecutionEnvironment','cpu');
Оцените актёра.
evaluateRLRep = getAction(supervisedActor,{testData});
Сравните результаты.
error = evaluateRLRep{:} - predictImNN
error = single
0
Создайте агента DDPG, используя предварительно обученного актёра.
agent = rlDDPGAgent(supervisedActor,critic,agentOptions);
Уменьшите максимальное количество эпизодов тренировки и обучите агента, используя train
функция. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
trainingOpts.MaxEpisodes = 5000; doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts); else % Load pretrained agent for the example. load('ddpgFromPretrained.mat'); end
При помощи предварительно обученной сети актёра обучение агента DDPG является более эффективным. Как общее время обучения, так и общее количество шагов обучения улучшилось примерно на 20%. Кроме того, количество эпизодов для обучения, чтобы приблизиться к окрестностям оптимального результата, уменьшилось с приблизительно 4500 до приблизительно 3500.
Чтобы подтвердить производительность обученного агента, раскомментируйте следующие две линии и симулируйте их в окружении. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
% simOptions = rlSimulationOptions('MaxSteps',maxsteps); % experience = sim(env,agent,simOptions);
Чтобы проверить производительность обученного агента в модели Simulink, симулируйте модель с помощью ранее определенных начальных условий (e1_initial = 0.2
и e2_initial = -0.1
).
sim(mdl)
Как показано ниже, боковая ошибка (средний график) и относительный угол рыскания (нижний график) сведены к нулю. Начало транспортного средства - боковое отклонение от осевой линии (0,2 м) и ненулевая ошибка угла рыскания (-0,1 рад). Контроллер поддержания маршрута заставляет автомобиль , оборудованный датчиком перемещаться по осевой линии примерно через две секунды. Угол поворота руля (верхняя часть график) показывает, что контроллер достигает устойчивого состояния примерно через две секунды.
Закройте модель Simulink, не сохраняя никаких изменений.
bdclose(mdl)
function in = localResetFcn(in) % Set random value for lateral deviation. in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % Set random value for relative yaw angle. in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); end function agent = loadPretrainedParams(agent,actorParams,criticParams) % Set actor parameters. actor = getActor(agent); pretrainedActor = setLearnableParameters(actor,actorParams); % Set critic parameters. critic = getCritic(agent); pretrainedCritic = setLearnableParameters(critic,criticParams); % Set actor and critic representations in the agent. agent = setActor(agent,pretrainedActor); agent = setCritic(agent,pretrainedCritic); end