此示例显示如何使用并行培训在Simulink®中为车道保持辅助(LKA)培训深度Q学习网络(DQN)代理。有关如何在不使用并行培训的情况下培训代理的示例,请参阅金宝app为车道保持辅助培训DQN代理.
有关DQN代理的更多信息,请参见深度Q网络代理。有关在MATLAB®中培训DQN代理的示例,请参阅培训DQN代理以平衡大车杆系统.
在DQN代理中,每个工作者从其代理和环境的副本生成新的体验。在每一个N
步骤,工人将经验发送给客户端代理(与MATLAB®进程相关的代理,启动培训)。客户端代理更新其参数如下。
对于异步培训,客户端代理从接收到的经验中学习,而不需要等待所有的工作者发送经验,并将更新后的参数发送回提供经验的工作者。然后,工作人员继续使用更新后的参数从其环境中生成经验。
对于同步培训,客户代理等待从所有工作人员那里获得经验并从这些经验中学习。然后,客户端同时将更新后的参数发送给所有工作人员。然后,所有工作人员使用更新后的参数继续生成体验。
有关同步与异步并行化的更多信息,请参见使用并行计算和GPU训练代理.
本例的强化学习环境是一个简单的自我车辆动力学自行车模型。训练的目标是通过调整前转向角度来使自我车辆沿着车道的中心线行驶。这个例子使用了与为车道保持辅助培训DQN代理.
m = 1575;车辆总质量(kg)Iz=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]
拉德。
u_min = -0.5;u_max = 0.5;
道路的曲率由常数0.001定义(
).横向偏差的初始值为0.2
M,相对偏航角的初始值为-0.1
拉德。
rho=0.001;e1_初始值=0.2;e2_初始值=-0.1;
打开模型。
mdl=“rlLKAMdl”;开放式系统(mdl)代理LK=[mdl' / RL代理'];
对于此型号:
从agent到环境的转向角动作信号为-15°到15°。
从环境中观察到的是横向偏差 ,相对偏航角 ,他们的衍生品 和 ,以及它们的积分 和 .
当出现横向偏差时,模拟终止
奖励 ,在每个时间步提供 是
哪里 控制输入是否来自前一个时间步骤 .
为ego车辆创建强化学习环境界面。
定义观测信息。
observationInfo=rlNumericSpec([6 1],“LowerLimit”,-inf*one(6,1),“UpperLimit”,正* (6,1));observationInfo。Name =“观察”;observationInfo。描述=“关于横向偏差和相对偏航角的信息”;
定义操作信息。
actionInfo=rlFiniteSetSpec(-15:15)*pi/180);actionInfo.Name=“转向”;
创建环境接口。
env = rl金宝appSimulinkEnv (mdl agentblk、observationInfo actionInfo);
该界面有一个离散的行动空间,代理人可以应用31个可能的转向角度之一从-15度到15度。观测结果是包含侧向偏差、相对偏航角以及它们对时间的导数和积分的六维矢量。
要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境重置函数。本地重置FCN
,在这个例子的最后定义,随机初始横向偏差和相对偏航角。
env。ResetFcn = @(在)localResetFcn(的);
修复随机生成器种子的再现性。
rng(0)
DQN代理可以使用多输出Q值批评近似器,通常效率更高。多输出近似器将观察值作为输入,将状态动作值作为输出。每个输出元素表示从观察值指示的状态采取相应离散动作的预期累积长期报酬投入。
要创建批评家,首先创建一个具有一个输入(六维观察状态)和一个具有31个元素(从-15到15度均匀间隔的转向角度)的输出向量的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数表示.
倪= observationInfo.Dimension (1);%输入次数(6)问= 120;%神经元数目否=numel(actionInfo.Elements);%输出数量(31)dnn = [featureputlayer (nI,“正常化”,“没有”,“名字”,“国家”)完全连接层(nL,“名字”,“fc1”) reluLayer (“名字”,“relu1”)完全连接层(nL,“名字”,“fc2”) reluLayer (“名字”,“relu2”) fullyConnectedLayer(不,“名字”,“fc3”)];
查看网络配置。
图绘制(layerGraph(款)
为使用的批评家表示指定选项rlRepresentationOptions
.
临界点=rlRepresentationOptions(“LearnRate”,1e-4,“GradientThreshold”, 1“L2RegularizationFactor”1的军医);
使用指定的深度神经网络和选项创建批评家表示。还必须指定批评家的操作和观察信息,这些信息是从环境界面获得的。有关更多信息,请参阅rlQValueRepresentation
.
评论家= rlQValueRepresentation(款、observationInfo actionInfo,“观察”,{“国家”}, criticOptions);
要创建DQN代理,请首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions (...“SampleTime”,Ts,...“UseDoubleDQN”符合事实的...“目标平滑因子”,1e-3,...“DiscountFactor”, 0.99,...“ExperienceBufferLength”1 e6,...“MiniBatchSize”, 256);agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1的军医;
然后使用指定的批评家表示和代理选项创建DQN代理。有关详细信息,请参阅rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
每次训练最多跑一次10000
每集,每集最多持续一次装天花板(T / T)
时间的步骤。
仅在“章节管理器”对话框中显示培训进度(设置阴谋
和详细的
相应的选项)。
当情节奖励达到时停止训练-1
.
当累计奖励大于100时,为每一集保存一份代理。
有关更多信息,请参见RL培训选项
.
maxepisodes = 10000;maxsteps =装天花板(T / T);trainOpts = rlTrainingOptions (...“MaxEpisodes”,每集,...“MaxStepsPerEpisode”,maxsteps,...“冗长”错误的...“阴谋”,“培训进度”,...“StopTrainingCriteria”,“EpisodeReward”,...“停止训练值”, 1...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”, 100);
要并行地培训代理,请指定以下培训选项。
设定UseParallel
选项符合事实的
.
通过设置ParallelizationOptions。模式
选项“异步”
.
每30个步骤后,每个工作人员都会向客户发送体验。
DQN代理要求工人发送“经验”
给客户端。
trainOpts。UseParallel = true;trainOpts.ParallelizationOptions.Mode =“异步”;trainOpts.ParallelizationOptions.DataToSendFromWorkers =“经验”;trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
有关更多信息,请参见RL培训选项
.
训练代理人使用火车
函数。训练代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining
到假
. 要亲自训练特工,设置doTraining
到符合事实的
.由于平行培训的随机性,您可以从下图中看到不同的培训结果。下图显示了四名工人的培训结果。
doTraining=false;如果doTraining%培训代理人。trainingStats =火车(代理,env, trainOpts);其他的%为示例加载预训练代理。装载(“金宝appSimulinkLKADQNParallel.mat”,“代理人”)结束
要验证经过训练的代理的性能,取消注释以下两行,并在环境中模拟该代理。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.
% simOptions = rlSimulationOptions('MaxSteps', MaxSteps);% experience = sim(env,agent,simOptions);
为了演示使用确定性初始条件训练的agent,在Simulink中模拟该模型。金宝app
e1_初始值=-0.4;e2_初始值=0.2;sim(mdl)
如下图所示,横向误差(中间图)和相对偏航角(底部图)都被驱动到零。车辆从偏离中心线(-0.4米)和非零偏航角误差(0.2 rad)开始。LKA使ego汽车在2.5秒后沿着中心线行驶。转向角度(顶部图)显示控制器在2秒后达到稳定状态。
作用in=localResetFcn(in)%重置in=设置变量(in,“e1_initial”,0.5*(-1+2*兰德));%横向偏差的随机值in=设置变量(in,“e2_initial”, 0.1 *(1 + 2 *兰德));%相对偏航角的随机值结束