利用并行计算训练DQN代理进行车道保持辅助
本例展示了如何在Simulink®中使用并行训练的方法训练用于车道保持辅助(LKA)的深度q学习网络(DQN)代理。有关演示如何在不使用并行训练的情况下训练代理的示例,请参见培训DQN人员协助保持车道.
有关DQN代理的更多信息,请参见DQN (Deep Q-Network)代理.关于在MATLAB®中训练DQN代理的例子,请参见训练DQN代理平衡车杆系统.
DQN并行训练概述
在DQN代理中,每个工作者从其代理副本和环境中生成新的经验。在每一个N
步骤,工作者将经验发送到主机代理。主机代理的参数更新如下。
对于异步训练,主机代理从接收到的经验中学习,而不等待所有的工作者发送经验,并将更新的参数发送回提供经验的工作者。然后,工作人员继续使用更新的参数从其环境中生成经验。
对于同步训练,宿主代理等待从所有工作人员那里接收经验,并从这些经验中学习。然后,主机将更新后的参数同时发送给所有工作者。然后,所有的工作人员继续使用更新后的参数生成经验。
自我汽车的Simulink模型
本例的强化学习环境是自我车辆动力学的一个简单自行车模型。训练目标是通过调整前转向角度,保持自我车辆沿车道中心线行驶。此示例使用与。相同的车辆模型培训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 .' / RL代理'];
对于这个模型:
从代理到环境的转向角动作信号从-15度到15度。
从环境中观察到的是横向偏差 ,相对偏航角 ,他们的衍生品 而且 和它们的积分 而且 .
当侧向偏移时,模拟终止
奖励 ,每个时间步提供 ,是
在哪里 控制输入是否来自前一个时间步骤 .
创建环境接口
为自我载体创建强化学习环境界面。
定义观测信息。
observationInfo = rlNumericSpec([6 1],“LowerLimit”,负无穷* (6,1),“UpperLimit”,正* (6,1));observationInfo。Name =“观察”;observationInfo。描述=“横向偏差及相对偏航角资料”;
定义操作信息。
actionInfo = rlFiniteSetSpec((15:15) *π/ 180);actionInfo。Name =“转向”;
创建环境接口。
env = rlSimulinkEnv (mdl agentblk、observationInfo actionInfo);
该界面有一个离散的动作空间,代理可以应用31个可能的转向角度之一,从-15度到15度。观测结果是包含横向偏差、相对偏航角以及它们对时间的导数和积分的六维向量。
要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境重置函数。localResetFcn
,在本例末尾定义,随机化初始横向偏移和相对偏航角。
env。ResetFcn = @(在)localResetFcn(的);
固定随机生成器种子的再现性。
rng (0)
创建DQN代理
DQN代理可以使用多输出q值临界逼近器,这通常更有效。多输出近似器将观测值作为输入,将状态动作值作为输出。每个输出元素代表从观察输入指示的状态中采取相应离散行动的预期累积长期回报。
要创建评论,首先创建一个深度神经网络,它有一个输入(6维观察状态)和一个输出向量(31个元素)(从-15到15度均匀间隔的转向角)。有关创建深度神经网络值函数表示的更多信息,请参见创建政策和价值功能.
倪= observationInfo.Dimension (1);输入数百分比(6)问= 120;神经元百分数没有=元素个数(actionInfo.Elements);输出的百分比(31)dnn = [featureInputLayer(nI,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer(问,“名字”,“fc1”) reluLayer (“名字”,“relu1”) fullyConnectedLayer(问,“名字”,“取得”) reluLayer (“名字”,“relu2”) fullyConnectedLayer(不,“名字”,“一个fc3”文件));款= dlnetwork(款);
查看网络配置。
图绘制(layerGraph(款)
指定所使用的批评家优化器的选项rlOptimizerOptions
.
criticOptions = rlOptimizerOptions (“LearnRate”1的军医,“GradientThreshold”, 1“L2RegularizationFactor”1的军医);
使用指定的深度神经网络和选项创建批评家表示。您还必须为批评者指定操作和观察信息,这些信息将从环境接口获得。有关更多信息,请参见rlVectorQValueFunction
.
评论家= rlVectorQValueFunction(款、observationInfo actionInfo);
要创建DQN代理,首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions (...“SampleTime”Ts,...“UseDoubleDQN”,真的,...“CriticOptimizerOptions”criticOptions,...“ExperienceBufferLength”1 e6,...“MiniBatchSize”, 256);agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1的军医;
然后使用指定的批评家表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
培训方案
要培训代理,首先要指定培训选项。对于本例,使用以下选项。
每次训练最多跑一次
10000
每集最多持续一集装天花板(T / T)
时间的步骤。仅在“插曲管理器”对话框中显示训练进度
情节
而且详细的
相应的选项)。当剧情奖励达到时停止训练
-1
.为每一集累积奖励大于100的场景保存一份代理副本。
有关更多信息,请参见rlTrainingOptions
.
maxepisodes = 10000;maxsteps =装天花板(T / T);trainOpts = rlTrainingOptions (...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“详细”假的,...“阴谋”,“没有”,...“StopTrainingCriteria”,“EpisodeReward”,...“StopTrainingValue”, 1...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”, 100);
并行训练选项
要并行地培训代理,请指定以下培训选项。
设置
UseParallel
选项真正的
.的并行异步训练代理
ParallelizationOptions。模式
选项“异步”
.
trainOpts。UseParallel = true;trainOpts.ParallelizationOptions.Mode =“异步”;
有关更多信息,请参见rlTrainingOptions
.
火车代理
训练代理使用火车
函数。训练代理是一个计算密集的过程,需要几分钟才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.由于并行训练的随机性,您可以从下图中预期不同的训练结果。图中显示了四名工人的培训结果。
doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainOpts);其他的为示例加载经过训练的代理。负载(“SimulinkLKADQNParallel.mat”,“代理”)结束
模拟DQN代理
要验证经过训练的代理的性能,取消以下两行注释并在环境中模拟代理。有关代理模拟的更多信息,请参见rlSimulationOptions
而且sim卡
.
% simOptions = rlSimulationOptions('MaxSteps', MaxSteps);% experience = sim(env,agent,simOptions);
为了使用确定性初始条件来演示训练过的智能体,在Simulink中对模型进行了仿真。
e1_initial = -0.4;e2_initial = 0.2;sim (mdl)
如下图所示,横向误差(中间图)和相对偏航角(底部图)均被驱动为零。车辆从偏离中心线(-0.4米)和非零偏航角误差(0.2 rad)开始。LKA使自我车在2.5秒后沿着中心线行驶。转向角度(顶部图)显示控制器在2秒后达到稳态。
本地函数
函数= localResetFcn(中)%重置= setVariable (,“e1_initial”, 0.5 *(1 + 2 *兰德));横向偏差%随机值= setVariable (,“e2_initial”, 0.1 *(1 + 2 *兰德));%随机值为相对偏航角结束