这个例子展示了如何使用并行训练在Simulink®中训练一个深度q学习网络(DQN)代理保持车道辅助(LKA)。金宝app有关如何在不使用并行训练的情况下训练代理的示例,请参见对DQN代理进行车道保持协助培训.
有关DQN代理的更多信息,请参见深Q-Network代理.在MATLAB®中训练DQN代理的示例,请参见培训DQN员工平衡车杆系统.
在DQN代理中,每个工作人员从其代理副本和环境中生成新的体验。以后N
步骤中,工作人员将经验发送给客户机代理(与启动培训的MATLAB®过程相关联的代理)。客户机代理更新其参数如下。
对于异步培训,客户端代理从接收到的经验中学习,而无需等待所有工作人员发送经验,并将更新的参数发送回提供经验的工作人员。然后,工作人员继续使用更新的参数从其环境中生成经验。
对于同步培训,客户代理等待从所有工作人员那里获得经验并从这些经验中学习。然后,客户端同时将更新后的参数发送给所有工作人员。然后,所有工作人员使用更新后的参数继续生成体验。
有关同步与异步并行化的更多信息,请参见使用并行计算和gpu的列车代理.
本例的强化学习环境是一个简单的自我车辆动力学自行车模型。训练的目标是通过调整前转向角度来使自我车辆沿着车道的中心线行驶。这个例子使用了与对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系统的输出是自我汽车的前转向角度。为了模拟自我汽车的物理转向极限,限制转向角度到范围[-0.5, 0.5]
rad。
u_min = -0.5;u_max = 0.5;
道路的曲率定义为常数0.001 (
).横向偏差的初始值为0.2
m,相对偏航角的初始值为-0.1
rad。
ρ= 0.001;e1_initial = 0.2;e2_initial = -0.1;
打开模型。
mdl =“rlLKAMdl”;Open_system (mdl) agentblk = [mdl . Open_system (mdl)“/RL代理”];
对于这个模型:
从agent到环境的转向角动作信号为-15°到15°。
从环境中观察到的是横向偏差 ,相对偏航角 ,它们的衍生物 和 ,以及它们的积分 和 .
当出现横向偏差时,模拟终止
奖赏 ,提供在每个时间步骤 ,是
在哪里 是来自上一时间步的控制输入 .
为自我车辆创建一个强化学习环境界面。
定义观测信息。
observationInfo = rlNumericSpec([6 1],“LowerLimit”,负无穷* (6,1),“上限”,inf*one(6,1));observationInfo.Name=“观察”; 观测信息描述=“横向偏差和相对偏航角信息”;
定义操作信息。
actionInfo = rlFiniteSetSpec((15:15) *π/ 180);actionInfo。Name =“转向”;
创建环境接口。
env = rl金宝appSimulinkEnv (mdl agentblk、observationInfo actionInfo);
该界面有一个离散的行动空间,代理人可以应用31个可能的转向角度之一从-15度到15度。观测结果是包含侧向偏差、相对偏航角以及它们对时间的导数和积分的六维矢量。
若要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境复位函数。localResetFcn
,将初始横向偏差和相对偏航角随机化。
env.ResetFcn=@(in)localResetFcn(in);
修复随机生成器种子的再现性。
rng (0)
DQN代理可以使用多输出q值批判逼近器,这通常更有效。多输出近似器将观察值作为输入,状态行为值作为输出。每个输出元素表示从观察输入所指示的状态中采取相应离散行动的预期累积长期回报。
要创建批评家,首先创建一个包含一个输入(六维观察状态)和一个包含31个元素(均匀分布的转向角为-15到15度)的输出向量的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和价值功能表示.
nI=观测信息尺寸(1);%输入次数(6)nL=120;神经元百分数没有=元素个数(actionInfo.Elements);%产出数量(31)dnn=[featureInputLayer(nI,“归一化”,“没有”,“姓名”,“状态”) fullyConnectedLayer(问,“姓名”,“fc1”)雷卢耶(“姓名”,“relu1”) fullyConnectedLayer(问,“姓名”,“取得”)雷卢耶(“姓名”,“relu2”)完全连接层(编号:,“姓名”,“一个fc3”文件));
查看网络配置。
图形绘图(图层图(dnn))
使用指定批评家表示的选项rlRepresentationOptions
.
criticOptions = rlRepresentationOptions (“LearnRate”1的军医,“梯度阈值”,1,“L2RegularizationFactor”,1e-4);
使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
.
批评家=rlQValueRepresentation(dnn、observationInfo、actionInfo、,“观察”, {“状态”}, criticOptions);
要创建DQN代理,首先使用rlDQNAgentOptions
.
agentOpts=rlDQNAgentOptions(…“SampleTime”Ts,…“UsedDoubledQn”,真的,…“TargetSmoothFactor”1 e - 3,…“DiscountFactor”,0.99,…“经验缓冲长度”,1e6,…“MiniBatchSize”,256); agentOpts.epsilongreedexploration.EpsilonDecay=1e-4;
然后使用指定的评论家表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
每次训练最多跑一次10000
每集最多持续一集装天花板(T / T)
时间步长。
仅在“事件管理器”对话框中显示培训进度(设置情节
和详细的
相应的选项)。
当情节奖励达到时停止训练-1
.
为累积奖励大于100的每集保存一份代理副本。
有关更多信息,请参见rlTrainingOptions
.
最大事件数=10000;最大步骤数=ceil(T/Ts);训练选项数=RL训练选项(…“MaxEpisodes”maxepisodes,…“MaxStepsPerEpisode”maxsteps,…“详细”假的,…“情节”,“训练进步”,…“停止培训标准”,“情节报酬”,…“StopTrainingValue”, 1…“SaveAgentCriteria”,“情节报酬”,…“SaveAgentValue”, 100);
要并行培训代理,请指定以下培训选项。
设置使用并行
选项真正的
.
通过设置异步并行训练代理ParallelizationOptions。模式
选项“异步”
.
在每30个步骤之后,每个工作人员将体验发送给客户。
DQN代理要求工作人员发送体验”
给客户端。
trainOpts。UseParallel = true;trainOpts.ParallelizationOptions.Mode =“异步”;trainOpts.ParallelizationOptions.DataToSendFromWorkers =“经验”;trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
有关更多信息,请参见rlTrainingOptions
.
训练代理人使用火车
函数。训练代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理溺爱
来错误的
.自己训练代理人,设置溺爱
来真正的
.由于并行训练的随机性,您可以从下面的图中看到不同的训练结果。这张图显示了四名工人的培训结果。
doTraining = false;如果溺爱培训代理商。trainingStats =火车(代理,env, trainOpts);其他的%为示例加载预训练的代理。负载(“金宝appSimulinkLKADQNParallel.mat”,“代理”)终止
要验证经过培训的代理的性能,请取消注释以下两行并在环境中模拟代理。有关代理模拟的更多信息,请参阅rlSimulationOptions
和模拟
.
%simOptions=rlSimulationOptions('MaxSteps',MaxSteps);%经验=模拟(环境、代理、模拟选项);
要使用确定性初始条件演示经过训练的agent,请在Simulink中模拟该模型。金宝app
e1_initial = -0.4;e2_initial = 0.2;sim (mdl)
如下图所示,横向误差(中间图)和相对偏航角(底部图)均被驱动至零。车辆从偏离中心线(–0.4 m)和非零偏航角误差(0.2 rad)开始。LKA使ego车辆能够在2.5秒后沿中心线行驶。转向角(上图)显示控制器在2秒后达到稳定状态。
函数= localResetFcn(中)%重置= setVariable (,“e1_首字母”, 0.5 *(1 + 2 *兰德));%横向偏差的随机值= setVariable (,“e2_首字母”,0.1*(-1+2*兰德));%相对偏航角的随机值终止