这个例子说明了如何训练中的Simulink车道保持辅助系统(LKA)使用并行训练了深刻的Q学习网络(DQN)代理。金宝app举一个例子,说明如何来训练剂而不使用并行训练,见火车DQN代理车道保持辅助.
有关DQN代理的更多信息,请参阅深Q-网络代理.举一个例子说列车MATLAB®一个DQN剂,参见火车DQN代理余额车极点系统.
在DQN代理中,每个工作人员从其代理副本和环境中生成新的体验。以后N
步骤中,工作人员将经验发送给客户机代理(与启动培训的MATLAB®过程相关联的代理)。客户机代理更新其参数如下。
对于异步培训,客户端代理从接收到的经验中学习,而无需等待所有工作人员发送经验,并将更新的参数发送回提供经验的工作人员。然后,工作人员继续使用更新的参数从其环境中生成经验。
对于同步培训,客户机代理等待从所有工人那里获得经验,并从这些经验中学习。然后,客户机将更新的参数同时发送给所有工人。然后,所有工作人员继续使用更新的参数生成体验。
有关同步与异步并行化的更多信息,请参见使用并行计算和GPU训练代理.
本例中的强化学习环境是一个用于自我车辆动力学的简单自行车模型。培训目标是通过调整前转向角,使ego车辆沿车道中心线行驶。此示例使用与相同的车型火车DQN代理车道保持辅助.
m=1575;%车辆总质量(kg)IZ = 2875;%偏航惯性矩(mNs^2)lf=1.2;从重力前轮胎的中心纵向%的距离(米)LR = 1.6;%从重力后轮胎的中心纵向距离(米)Cf=19000;%前轮胎的侧偏刚度(N /弧度)Cr=33000;%后轮胎的侧偏刚度(N /弧度)VX = 15;%纵向速度(m/s)
定义采样时间TS.
和模拟持续时间T
几秒钟之内。
Ts=0.1;T=15;
LKA系统的输出是ego汽车的前转向角。要模拟ego汽车的物理转向限制,请将转向角限制在范围内[–0.5,0.5]
弧度。
u_min=-0.5;u_max=0.5;
道路的曲率由一个常数0.001(定义
)。对于横向偏差的初始值是0.2
m,相对偏航角的初始值为–0.1
弧度。
RHO = 0.001;e1_initial = 0.2;e2_initial = -0.1;
打开模型。
mdl =“rlLKAMdl”;open_system(MDL)agentblk = [MDL“/RL代理”];
对于这个模型:
从agent到环境的转向角动作信号为–15度到15度。
从环境中观察到的是横向偏差 相对偏航角 ,它们的衍生物 和 ,以及它们的积分 和 .
当出现横向偏差时,模拟终止
奖赏 ,在每个时间步骤中提供 , 是
在哪里 是来自上一时间步的控制输入 .
创建自身车辆的增强学习环境界面。
定义观测信息。
observationInfo = rlNumericSpec([6 1],“假定下限”,-INF *也是(6,1),“上限”,inf*one(6,1));observationInfo.Name=“意见”; 观测信息描述=“上的横向偏差和相对偏航角信息”;
定义操作信息。
actionInfo = rlFiniteSetSpec(( - 15:15)* PI / 180);actionInfo.Name =“转向”;
创建环境接口。
env=rlSi金宝appmulinkEnv(mdl、agentblk、observationInfo、actionInfo);
该界面有一个离散的动作空间,在该空间中,代理可以应用-15度到15度之间的31个可能转向角中的一个。观测是包含横向偏差、相对偏航角及其对时间的导数和积分的六维向量。
要定义的横向偏差和相对偏航角的初始状态下,使用匿名功能句柄指定环境复位功能。localResetFcn
,将初始横向偏差和相对偏航角随机化。
env.ResetFcn=@(in)localResetFcn(in);
修复随机生成器种子以获得再现性。
RNG(0)
DQN剂可以使用多输出Q值评论家逼近,这通常是更有效的。一种多输出逼近具有观察作为输入和状态动作值作为输出。每个输出元素表示用于取相应的离散动作从状态由观测输入指示的预期累积长期奖励。
要创建批评家,首先创建一个包含一个输入(六维观察状态)和一个包含31个元素(均匀分布的转向角为-15到15度)的输出向量的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和价值功能交涉.
nI=观测信息尺寸(1);%输入数量(6)nL=120;神经元的数量%否= numel(actionInfo.Elements);%产出数量(31)dnn=[featureInputLayer(nI,'正常化',“没有”,“姓名”,'状态')fullyConnectedLayer(NL,“姓名”,'FC1')雷卢耶(“姓名”,“relu1”)fullyConnectedLayer(NL,“姓名”,“F” c2)雷卢耶(“姓名”,'relu2')完全连接层(编号:,“姓名”,'FC3')];
查看网络配置。
图形绘图(图层图(dnn))
使用指定批评家表示的选项rlRepresentationOptions
.
criticOptions = rlRepresentationOptions(“LearnRate”,1E-4,“梯度阈值”1.“L2调节因子”,1e-4);
创建使用指定的深层神经网络和选项的评论家表示。您还必须指定评论家,你从环境中获取界面操作和观察信息。有关更多信息,请参阅rlQValueRepresentation
.
批评家=rlQValueRepresentation(dnn、observationInfo、actionInfo、,“观察”{'状态'},批评);
要创建DQN剂,采用先指定DQN代理选项rlDQNAgentOptions
.
agentOpts=rlDQNAgentOptions(......“采样时间”,TS,......“UsedDoubledQn”,真的,......'TargetSmoothFactor',1E-3,......“折扣演员”,0.99,......“经验缓冲长度”,1e6,......'MiniBatchSize',256); agentOpts.epsilongreedexploration.EpsilonDecay=1e-4;
然后使用指定的批评家表示和代理选项创建DQN代理。有关更多信息,请参阅rlDQNAgent
.
代理=rlDQNAgent(评论家、代理);
要培训代理,请首先指定培训选项。对于本例,请使用以下选项。
每次训练最多进行一次10000
发作,用每集最持久ceil(T/Ts)
时间步长。
仅在“事件管理器”对话框中显示培训进度(设置地块
和冗长的
相应的选项)。
当情节奖励达到时停止训练-1
.
为累积奖励大于100的每集保存一份代理副本。
有关更多信息,请参阅RL培训选项
.
最大事件数=10000;最大步骤数=ceil(T/Ts);训练选项数=RL训练选项(......“最大集”,maxepisodes,......“MaxStepsPerEpisode”,maxsteps,......'verbose',错误的,......“情节”,“训练进度”,......“停止培训标准”,“情节报酬”,......'StopTrainingValue', -1,......'SaveAgentCriteria',“情节报酬”,......“SaveAgentValue”,100);
要并行培训代理,请指定以下培训选项。
设定使用并行
选择真的
.
通过设置在平行培养剂异步ParallelizationOptions.Mode
选择“异步”
.
每30步后,每个工人将体验到客户端。
DQN代理需要工人送“经验”
给客户。
trainOpts.usepallel=true;trainOpts.ParallelizationOptions.Mode=“异步”; trainOpts.ParallelizationOptions.DataToSendFromWorkers=“经验”; trainOpts.ParallelizationOptions.StepsUntilDataIsSent=32;
有关更多信息,请参阅RL培训选项
.
使用火车
作用训练代理是一个计算密集型过程,需要几分钟才能完成。要在运行此示例时节省时间,请通过设置溺爱
到错误的
.为了训练自己的代理,集溺爱
到真的
.由于平行训练的随机性,你可以期望从下面的情节不同的训练效果。图中显示的有四个工人训练的结果。
doTraining = FALSE;如果溺爱%培训代理。trainingStats=列车(代理人、环境、列车员);其他的%负载预训练剂的例子。加载(“金宝appSimulinkLKADQNParallel.mat”,'代理人')终止
要验证经过培训的代理的性能,请取消注释以下两行并在环境中模拟代理。有关代理模拟的更多信息,请参阅模拟选项
和模拟
.
%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 * RAND));用于横向偏差%随机值在= setVariable(在,“e2_首字母”,0.1*(-1+2*兰德));%相对偏航角的随机值终止