本示例展示了如何在Simulink®中使用并行训练训练深度q学习网络(DQN)代理进行车道保持辅助(LKA)。万博1manbetx有关如何在不使用并行训练的情况下训练代理的示例,请参见培训DQN代理保持车道辅助.
有关DQN代理的更多信息,请参见深度q -网络代理.有关在MATLAB®中训练DQN代理的示例,请参见训练DQN人员平衡车杆系统.
在DQN代理中,每个工作者从其代理和环境的副本中生成新的经验。在每一个N
步骤中,工作人员将经验发送给客户端代理(与开始培训的MATLAB®过程相关的代理)。客户端代理更新参数如下。
对于异步训练,客户端代理从接收到的经验中学习,而不需要等待所有工人发送经验,并将更新后的参数发送回提供经验的工人。然后,工作人员继续使用更新的参数从其环境中生成经验。
对于同步培训,客户端代理等待所有工作人员的经验,并从这些经验中学习。然后客户端同时将更新后的参数发送给所有工作人员。然后,所有工作人员继续使用更新的参数生成经验。
有关同步与异步并行的更多信息,请参见使用并行计算和图形处理器训练代理.
本例的强化学习环境是自我车辆动力学的简单自行车模型。训练目标是通过调整前转向角度,使车辆沿着车道的中心线行驶。本例使用相同的车辆模型培训DQN代理保持车道辅助.
M = 1575;车辆总质量百分比(kg)Iz = 2875;%横摆惯性矩(mNs^2)Lf = 1.2;重心到前轮纵向距离% (m)Lr = 1.6;重心到后轮纵向距离% (m)Cf = 19000;前轮胎转弯刚度% (N/rad)Cr = 33000;后轮胎转弯刚度% (N/rad)Vx = 15;纵向速度% (m/s)
定义采样时间Ts
以及模拟持续时间T
在几秒钟内。
Ts = 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。
Rho = 0.001;E1_initial = 0.2;E2_initial = -0.1;
打开模型。
mdl =“rlLKAMdl”;Open_system (mdl) agentblk = [mdl . txt]' / RL代理'];
对于这个模型:
从药剂到环境的转向角动作信号为-15度到15度。
从环境中观测到的是横向偏差 ,相对偏航角 ,它们的导数 而且 和它们的积分 而且 .
当侧向偏移时,模拟终止
奖励 ,在每个时间步提供 ,是
在哪里 控制输入来自前一个时间步长吗 .
为自我飞行器创建一个强化学习环境界面。
定义观测信息。
observationInfo = rlNumericSpec([6 1],“LowerLimit”,负无穷* (6,1),“UpperLimit”,正* (6,1));observationInfo。Name =“观察”;observationInfo。描述=横向偏差和相对偏航角的信息;
定义操作信息。
actionInfo = rlFiniteSetSpec((-15:15)*pi/180);actionInfo。Name =“转向”;
创建环境接口。
env = rl万博1manbetxSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
该界面有一个离散的动作空间,代理可以应用31个可能的转向角度中的一个,从-15度到15度。观测是六维矢量,包含横向偏差,相对偏航角,以及它们对时间的导数和积分。
若要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境重置函数。localResetFcn
,在本例结束时定义,随机化初始横向偏差和相对偏航角。
env。ResetFcn = @ localResetFcn(in);
固定随机生成器种子的再现性。
rng (0)
DQN代理可以使用多输出q值临界逼近器,这通常更有效。多输出逼近器将观测值作为输入,状态动作值作为输出。每个输出元素表示从观察输入所指示的状态中采取相应离散行动所期望的累计长期奖励。
为了创建评论家,首先创建一个深度神经网络,它有一个输入(六维观察状态)和一个包含31个元素的输出向量(从-15到15度的均匀间隔转向角)。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数表示.
nI = observationInfo.Dimension(1);输入数% (6)nL = 120;神经元数目%nO =数字(actionInfo.Elements);输出数% (31)dnn = [featureInputLayer(nI,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer(问,“名字”,“fc1”) reluLayer (“名字”,“relu1”) fullyConnectedLayer(问,“名字”,“取得”) reluLayer (“名字”,“relu2”) fullyConnectedLayer(不,“名字”,“一个fc3”文件));
查看网络配置。
图绘制(layerGraph(款)
使用指定评论家表示的选项rlRepresentationOptions
.
criticOptions = rlRepresentationOptions(“LearnRate”1的军医,“GradientThreshold”, 1“L2RegularizationFactor”1的军医);
使用指定的深度神经网络和选项创建评论家表示。您还必须为评论家指定操作和观察信息,这些信息是您从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
.
评论= rlQValueRepresentation(dnn,observationInfo,actionInfo,“观察”, {“状态”}, criticOptions);
要创建DQN代理,首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions(...“SampleTime”Ts,...“UseDoubleDQN”,真的,...“TargetSmoothFactor”1 e - 3,...“DiscountFactor”, 0.99,...“ExperienceBufferLength”1 e6,...“MiniBatchSize”, 256);agentopt . epsilongreedyexploration . epsilondecay = 1e-4;
然后使用指定的临界表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
agent = rlDQNAgent(批评家,agentOpts);
要培训代理,首先指定培训选项。对于本例,使用以下选项。
每次训练最多跑一次10000
集,每集最多装天花板(T / T)
时间的步骤。
仅在“事件管理器”对话框中显示培训进度情节
而且详细的
相应的选项)。
当情节奖励达到时停止训练-1
.
为累积奖励大于100的每一集保存一份代理副本。
有关更多信息,请参见rlTrainingOptions
.
Maxepisodes = 10000;maxsteps = ceil(T/Ts);trainOpts = rlTrainingOptions(...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“EpisodeReward”,...“StopTrainingValue”, 1...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”, 100);
要并行地训练代理,请指定以下训练选项。
设置UseParallel
选项真正的
.
属性异步地并行训练代理ParallelizationOptions。模式
选项“异步”
.
每隔30步,每个工人将经验发送给客户端。
DQN代理要求工人发送“体验”
到客户端。
trainOpts。UseParallel = true;trainOpts.ParallelizationOptions.Mode =“异步”;trainOpts.ParallelizationOptions.DataToSendFromWorkers =“经验”;trainoptions . parallelizationoptions . stepsuntildataissent = 32;
有关更多信息,请参见rlTrainingOptions
.
培训代理使用火车
函数。训练代理是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.由于并行训练的随机性,您可以从下面的图中预期不同的训练结果。该图显示了四名工人的培训结果。
doTraining = false;如果doTraining培训代理。trainingStats = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“万博1manbetxSimulinkLKADQNParallel.mat”,“代理”)结束
为了验证经过训练的代理的性能,取消下面两行注释,并在环境中模拟代理。有关代理模拟的详细信息,请参见rlSimulationOptions
而且sim卡
.
% simOptions = rlSimulationOptions('MaxSteps', MaxSteps);% experience = sim(env,agent,simOptions);
为了演示使用确定性初始条件训练的智能体,在Simulink中对模型进行仿真。万博1manbetx
E1_initial = -0.4;E2_initial = 0.2;sim (mdl)
如下图所示,横向误差(中间图)和相对偏航角(底部图)均被驱动为零。车辆从偏离中心线(-0.4米)和非零偏航角误差(0.2 rad)开始。LKA使自我车在2.5秒后沿着中心线行驶。转向角度(上图)显示控制器在2秒后达到稳态。
函数in = localResetFcn(in)%重置in = setVariable(in,“e1_initial”, 0.5 *(1 + 2 *兰德));%横向偏差的随机值in = setVariable(in,“e2_initial”, 0.1 *(1 + 2 *兰德));%相对偏航角的随机值结束