这个例子展示了如何训练一个深度确定性策略梯度(DDPG) agent来控制一个在MATLAB®中建模的二阶动态系统。
有关DDPG代理的更多信息,请参见深度确定性策略梯度代理.有关如何在Simulink®中培训DDPG代理的示例,请参见金宝app训练DDPG Agent上摆和平衡摆.
本例的强化学习环境是一个具有增益的二阶双积分系统。训练目标是通过施加一个力输入来控制质量在二阶系统中的位置。
对于这个环境:
质量从-4到4个单位的初始位置开始。
agent对环境的力作用信号为-2到2 N。
从环境中观察到的是物体的位置和速度。
如果质量偏离原位置超过5米或 .
奖励 ,在每个时间步,是离散化的 :
在这里:
是质量的状态向量。
为作用于物体上的力。
为对控制性能的权重; .
是控制重量的努力; .
有关此模型的更多信息,请参见加载预定义的控制系统环境.
为双集成商系统创建预定义的环境接口。
env = rlPredefinedEnv (“DoubleIntegrator-Continuous”)
env = DoubleIntegratorContinuousAction with properties: Gain: 1 Ts: 0.1000 MaxDistance: 5 GoalThreshold: 0.0100 Q: [2x2 double] R: 0.0100 MaxForce: Inf State: [2x1 double]
env。MaxForce =正;
界面有一个连续的作用空间,在这个空间中,代理可以从-施加力值正
来正
的质量。
从环境界面获取观察和行动信息。
obsInfo = getObservationInfo (env);numObservations = obsInfo.Dimension (1);actInfo = getActionInfo (env);numActions =元素个数(actInfo);
修复随机生成器种子的再现性。
rng (0)
DDPG代理使用批判价值函数表示来近似给定的观察和行动的长期回报。要创建批评家,首先要创建一个有两个输入(状态和动作)和一个输出的深度神经网络。有关创建神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
statePath = featureInputLayer (numObservations,“归一化”,“没有”,“名字”,“状态”);actionPath = featureInputLayer (numActions,“归一化”,“没有”,“名字”,“行动”);commonPath = [concatenationLayer(1、2、“名字”,“concat”) quadraticLayer (“名字”,“二次”) fullyConnectedLayer (1,“名字”,“StateValue”,“BiasLearnRateFactor”,0,“偏见”, 0)];criticNetwork = layerGraph (statePath);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = addLayers (criticNetwork commonPath);criticNetwork = connectLayers (criticNetwork,“状态”,“concat /三机一体”);criticNetwork = connectLayers (criticNetwork,“行动”,“concat / in2”);
查看critical网络配置。
图绘制(criticNetwork)
为使用的批评家表示指定选项rlRepresentationOptions
.
criticOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);
使用指定的神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
.
评论家= rlQValueRepresentation (criticNetwork obsInfo actInfo,“观察”, {“状态”},“行动”, {“行动”}, criticOpts);
DDPG代理在给定的观察结果下,使用actor表示来决定采取什么行动。要创建参与者,首先要创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。
以与评论家相似的方式构造行动者。
actorNetwork = [featureInputLayer(numobobservations,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (numActions“名字”,“行动”,“BiasLearnRateFactor”,0,“偏见”, 0)];actorOpts = rlRepresentationOptions (“LearnRate”1 e-04“GradientThreshold”1);演员= rlDeterministicActorRepresentation (actorNetwork obsInfo actInfo,“观察”, {“状态”},“行动”, {“行动”}, actorOpts);
要创建DDPG代理,首先使用rlDDPGAgentOptions
.
agentOpts = rlDDPGAgentOptions (...“SampleTime”env。Ts,...“TargetSmoothFactor”1 e - 3,...“ExperienceBufferLength”1 e6,...“DiscountFactor”, 0.99,...“MiniBatchSize”、32);agentOpts.NoiseOptions.Variance = 0.3;agentOpts.NoiseOptions.VarianceDecayRate = 1 e-6;
使用指定的参与者表示、评论家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
代理= rlDDPGAgent(演员、评论家、agentOpts);
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
在训练过程中最多跑1000集,每集最多持续200步。
在“插曲管理器”对话框中显示培训进度(设置情节
选项),并禁用命令行显示(设置详细的
选项)。
当代理获得大于-66的移动平均累积奖励时停止训练。在这一点上,代理可以用最小的控制努力控制质量的位置。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...“MaxEpisodes”, 5000,...“MaxStepsPerEpisode”, 200,...“详细”假的,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, -66);
您可以通过使用情节
在训练或模拟过程中发挥作用。
情节(env)
训练代理人使用火车
函数。训练这个代理是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining
来假
.自己训练代理人,设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainOpts);其他的%加载示例的预训练代理。负载(“DoubleIntegDDPG.mat”,“代理”);结束
为了验证训练过的代理的性能,在双积分器环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.
simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward =单-65.9933