用训练有素的演员网络培训DDPG特工
本例展示了如何在Simulink中训练用于车道保持辅助的深度确定性策略梯度(DDPG)代理。为了使训练更有效,DDPG代理的参与者使用一个深度神经网络进行初始化,该神经网络之前使用监督学习进行过训练。这个演员训练有素模拟MPC控制器的车道保持辅助的例子。
有关DDPG代理的更多信息,请参见深度确定性策略梯度(DDPG)代理.
仿真软件模型
保持车道应用的训练目标是通过调整前转向角来保持自我车辆沿车道中心线行驶。这个例子使用了相同的自我车辆动力学和传感器动力学培训DQN人员协助保持车道的例子。
m = 1575;车辆总质量% (kg)工业区= 2875;%偏航惯性矩(mNs^2)如果= 1.2;%重心到前轮胎纵向距离(m)lr = 1.6;%从重心到后轮胎的纵向距离(m)Cf = 19000;前轮胎转弯刚度% (N/rad)Cr = 33000;后轮胎转弯刚度% (N/rad)Vx = 15;%纵向速度(m/s)
定义样本时间,Ts
,模拟持续时间,T
,在几秒钟内。
t = 0.1;T = 15;
LKA系统的输出是自我车辆的前转向角。考虑到自我车辆的物理局限性,将其转向角度限制在[-60,60]度范围内。指定以弧度为单位的约束。
u_min = -1.04;u_max = 1.04;
定义道路的曲率为常数0.001( ).
ρ= 0.001;
设置横向偏移的初始值(e1_initial
)和相对偏航角(e2_initial
).在训练过程中,这些初始条件被设置为每个训练集的随机值。
e1_initial = 0.2;e2_initial = -0.1;
打开模型。
mdl =“rlActorLKAMdl”;open_system (mdl)
在模型中定义到RL Agent块的路径。
agentblk = [mdl' / RL代理'];
创建环境
为自我载体创建强化学习环境界面。为此,首先定义观察和操作规范。这些观察和动作与监督学习中使用的特征相同模拟MPC控制器的车道保持辅助.
环境的六个观测值是横向速度 ,偏航率 ,横向偏差 ,相对偏航角 ,前一步转向角度 ,曲率 .
observationInfo = rlNumericSpec([6 1],...LowerLimit =无穷*的(6,1),...UpperLimit =正*的(6,1))
observationInfo = rlNumericSpec with properties: LowerLimit: [6x1 double] UpperLimit: [6x1 double]名称:[0x0 string]描述:[0x0 string]维度:[6 1]DataType: "double"
observationInfo。Name =“观察”;
对环境起作用的是前转向角。在创建动作规范对象时指定转向角度约束。
actionInfo = rlNumericSpec([1 1],...LowerLimit = u_min,...UpperLimit = u_max);actionInfo。Name =“转向”;
模型中,LKA块的信号处理(Signal Processing for LKA block)生成观测向量信号,计算奖励函数,计算停止信号。
奖励 ,每个时间步提供 ,为,其中 控制输入是否来自前一个时间步骤 .
当模拟停止时 .
创造强化学习环境。
env = rlSimulinkEnv (mdl agentblk,...observationInfo actionInfo);
要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境重置函数。的localResetFcn
函数将初始横向偏差和相对偏航角设置为随机值,该函数在示例的最后定义。
env。ResetFcn = @(在)localResetFcn(的);
固定随机生成器种子的再现性。
rng (0)
创建DDPG代理
DDPG代理使用临界价值函数表示来近似给出观察和行动的长期奖励。要创建批评家,首先创建一个具有两个输入(状态和行为)和一个输出的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建政策和价值功能.
[评论家,criticOptions] = createLaneKeepingCritic (...observationInfo actionInfo);
DDPG代理使用参与者表示来决定执行给定的观察结果。要创建参与者,首先创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。
(演员,actorOptions) = createLaneKeepingActor (...observationInfo actionInfo);
这些初始的演员和评论家网络具有随机的初始参数值。
要创建DDPG代理,首先指定DDPG代理选项。
agentOptions = rlDDPGAgentOptions (...SampleTime = Ts,...ActorOptimizerOptions = actorOptions,...CriticOptimizerOptions = criticOptions,...ExperienceBufferLength = 1 e6);agentOptions.NoiseOptions.Variance = 0.3;agentOptions.NoiseOptions.VarianceDecayRate = 1 e-5;
使用指定的参与者表示、批评家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
代理= rlDDPGAgent(演员、评论家、agentOptions);
火车代理
作为基线,使用具有随机初始参数的参与者来训练代理。要培训代理,首先要指定培训选项。对于本例,使用以下选项。
跑步训练最多50000集,每集持续最多150个时间步。
在“集训管理器”对话框中显示训练进度。
当剧情奖励达到-1时停止训练。
为累积奖励大于-的每一集保存代理的副本
2.5
.
有关更多信息,请参见rlTrainingOptions
.
maxepisodes = 50000;maxsteps = T / T;trainingOpts = rlTrainingOptions (...MaxEpisodes = MaxEpisodes,...MaxStepsPerEpisode = maxsteps,...Verbose = false,...情节=“训练进步”,...StopTrainingCriteria =“EpisodeReward”,...StopTrainingValue = 1,...SaveAgentCriteria =“EpisodeReward”,...SaveAgentValue = -2.5);
训练代理使用火车
函数。训练是一个计算密集的过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainingOpts);其他的为示例加载经过训练的代理。负载(“ddpgFromScratch.mat”);结束
训练代理人与训练有素的演员
您可以将代理的行动者网络设置为先前训练过的深度神经网络。对于这个例子,使用深度神经网络模拟MPC控制器的车道保持辅助的例子。利用监督学习训练该网络模拟模型预测控制器。
加载预训练的参与者网络。
负载(“imitateMPCNetActorObj.mat”,“imitateMPCNetObj”);
使用预先训练过的参与者创建参与者表示。
supervisedActor = rlContinuousDeterministicActor (...imitateMPCNetObj,...observationInfo,...actionInfo);
检查使用的网络supervisedActor
就是上膛的那把。为此,请使用相同的随机输入观测对网络和代理进行评估。
testData =兰德(6,1);
评估深度神经网络。
predictImNN =预测(imitateMPCNetObj testData”);
评估的演员。
evaluateRLRep = getAction (supervisedActor {testData});
比较结果。
error = evaluateRLRep{:} - predictImNN . error = evaluateRLRep{:
错误=单1.4901 e-08
使用预先训练过的参与者创建DDPG代理。
代理= rlDDPGAgent (supervisedActor,评论家,agentOptions);
减少训练集的最大数目,并使用火车
函数。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.
trainingOpts。MaxEpisodes = 5000;doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainingOpts);其他的为示例加载经过训练的代理。负载(“ddpgFromPretrained.mat”);结束
通过使用预训练行为体网络,提高了DDPG代理训练的效率。总训练时间和总训练步骤数都提高了约20%。此外,接近最佳结果附近的训练次数从大约4500减少到大约3500。
模拟DDPG代理
要验证经过训练的代理的性能,取消以下两行注释并在环境中模拟它。有关代理模拟的更多信息,请参见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 rad)。车道保持控制器让自我车辆在大约两秒后沿着中心线行驶。转向角度(顶部图)显示控制器在大约两秒钟后达到稳定状态。
关闭Simulink模型,不保存任何更改。
bdclose (mdl)
本地函数
函数= localResetFcn(中)设置横向偏差的随机值。= setVariable (,“e1_initial”, 0.5 *(1 + 2 *兰德));设置相对偏航角的随机值。= setVariable (,“e2_initial”, 0.1 *(1 + 2 *兰德));结束