训练DDPG代理控制双积分器系统
这个例子展示了如何训练一个深度确定性策略梯度(DDPG)代理来控制MATLAB®中建模的二阶线性动态系统。该示例还将DDPG代理与LQR控制器进行比较。
有关DDPG代理的更多信息,请参见深度确定性策略梯度(DDPG)代理.有关演示如何在Simulink®中训练DDPG代理的示例,请参见训练DDPG代理上摆和平衡摆.
双积分器MATLAB环境
本例的强化学习环境是带有增益的二阶双积分器系统。训练目标是通过施加一个力的输入来控制一个质量在二阶系统中的位置。
对于这个环境:
质量从-4到4单位之间的初始位置开始。
从环境中观察到的是物体的位置和速度。
如果物体从原来的位置移动超过5米,或者如果 .
奖励 的离散化 :
在这里:
是质量的状态向量。
是作用在物体上的力。
为控制性能权重矩阵; .
是控制力度上的重量; .
有关此模型的更多信息,请参见负载预定义控制系统环境.
在这个例子中,环境是一个线性动力系统,直接观察环境状态,奖励是观察和行动的二次函数。因此,寻找使累积长期奖励最小的动作序列的问题是一个离散时间的线性-二次最优控制问题,其最优动作已知是系统状态的线性函数。这个问题也可以使用线性-二次调节器(LQR)设计来解决,在本例的最后一部分中,您可以将代理与LQR控制器进行比较。
创建环境接口
为双积分器系统创建一个预定义的环境接口。
env = rlPredefinedEnv (“DoubleIntegrator-Continuous”)
env = DoubleIntegratorContinuousAction with properties:增益:1 Ts: 0.1000 MaxDistance: 5 GoalThreshold: 0.0100 Q: [2x2 double] R: 0.0100 MaxForce: Inf State: [2x1 double]
该接口具有一个连续的操作空间,代理可以在其中从-应用力值正
来正
的质量。采样时间存储在env。Ts
,而连续时间代价函数矩阵存储在env。问
而且env。R
分别。
从环境接口获取观测和动作信息。
obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "states" Description: "x, dx" Dimension: [2 1] DataType: "double"
actInfo = getActionInfo (env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "force" Description: [0x0 string] Dimension: [1 1] DataType: "double"
重置环境并获得其初始状态。
x0 =重置(env)
x0 =2×14 0
固定随机生成器种子的再现性。
rng (0)
创建DDPG代理
DDPG代理使用Q-value-function评价来近似折现累积长期报酬。q -值函数批评家必须接受一个观察结果和一个操作作为输入,并返回一个标量(估计的贴现累积长期奖励)作为输出。为了近似临界条件下的q值函数,可以使用神经网络。最优策略的值函数已知是二次的,使用具有二次层的网络(输出一个二次单项的向量,如中所述quadraticLayer
)和一个完全连接层(提供其输入的线性组合)。
将每个网络路径定义为层对象的数组,并从环境规范对象中获取观察和操作空间的维度。为网络输入层分配名称,这样您就可以将它们连接到输出路径,然后显式地将它们与适当的环境通道关联起来。由于不需要偏差项,将偏差项设为零(偏见= 0
),并防止其发生变化(BiasLearnRateFactor = 0
).
有关创建值函数逼近器的更多信息,请参见创建政策和价值功能.
观察和行动路径obsPath = featureInputLayer (obsInfo.Dimension (1) Name =“obsIn”);actPath = featureInputLayer (actInfo.Dimension (1) Name =“肌动蛋白”);%的共同路径commonPath = [concatenationLayer(1,2,Name= .“concat”) quadraticLayer fullyConnectedLayer (Name =“价值”,...BiasLearnRateFactor = 0,偏见= 0)];添加图层到layerGraph对象criticNet = layerGraph (obsPath);criticNet = addLayers (criticNet actPath);criticNet = addLayers (criticNet commonPath);%连接层criticNet = connectLayers (criticNet,“obsIn”,“concat /三机一体”);criticNet = connectLayers (criticNet,“肌动蛋白”,“concat / in2”);
查看批评家网络配置。
图绘制(criticNet)
转换为dlnetwork
并显示权重的数量。
criticNet = dlnetwork (criticNet);总结(criticNet)
初始化:true可学习数:7 input: 1 'obsIn' 2 features 2 'actIn' 1 features
使用创建临界近似器对象criticNet
、环境观测和动作规范,以及与环境观测和动作通道相连接的网络输入层名称。有关更多信息,请参见rlQValueFunction
.
评论家= rlQValueFunction (criticNet,...obsInfo actInfo,...ObservationInputNames =“obsIn”ActionInputNames =“肌动蛋白”);
用随机的观察和行动输入检查批评者。
getValue(评论家,{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =单-0.3977
DDPG代理使用一种参数化的连续确定性策略,该策略由连续确定性参与者实现。这个参与者必须接受一个观察作为输入,并返回一个操作作为输出。为了在参与者内部近似策略函数,可以使用神经网络。因为对于本例,最优策略已知在状态下是线性的,所以使用具有完全连接层的浅网络来提供两个网络输入的线性组合。
将网络定义为层对象的数组,并从环境规范对象中获取观察和操作空间的维度。既然不需要偏见项,就像对评论家所做的那样,将偏见项设为零(偏见= 0
),并防止其发生变化(BiasLearnRateFactor = 0
).有关参与者的更多信息,请参见创建政策和价值功能.
actorNet = [featureInputLayer(obsInfo.Dimension(1)) fulllyconnectedlayer (actInfo.Dimension(1)),...BiasLearnRateFactor = 0,偏见= 0)];
转换为dlnetwork
并显示权重的数量。
actorNet = dlnetwork (actorNet);总结(actorNet)
可学习的数量:3 input: 1 'input' 2个特性
使用以下命令创建actoractorNet
以及观察和行动规范。有关更多信息,请参见rlContinuousDeterministicActor
.
演员= rlContinuousDeterministicActor (actorNet obsInfo actInfo);
用随机的观察输入检查actor。
getAction(演员,{兰德(obsInfo.Dimension)})
ans =1 x1单元阵列{[0.3493]}
使用参与者和批评家创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
代理= rlDDPGAgent(演员、批评);
使用点符号为代理指定选项,包括批评家的训练选项。或者,您也可以使用rlDDPGAgentOptions
,rlOptimizerOptions
对象,然后创建代理。
agent.AgentOptions.SampleTime = env.Ts;agent.AgentOptions.ExperienceBufferLength = 1 e6;agent.AgentOptions.MiniBatchSize = 32;agent.AgentOptions.NoiseOptions.Variance = 0.3;agent.AgentOptions.NoiseOptions.VarianceDecayRate = 1 e;agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1的军医;agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 5 e - 3;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;
初始化代理参数
参与者实现的策略是 ,在那里反馈获得 而且 是演员网络的两个权重。可以看出,当这些增益为负值时闭环系统是稳定的,因此将其初始化为负值可以加快收敛速度。
q -值函数的结构如下:
在哪里 为全连通层的权值。或者,以矩阵形式:
对于固定的保险单 ,累积的长期回报(即保单的价值)变成:
由于奖励总是负的,适当地近似累积奖励两者 而且 一定是负定的。因此,为了加快收敛速度,需要初始化临界网络权值 这 是负的。
创建具有负特征值的对角矩阵W = -single(diag([1,1])+0.1)
W =3 x3单一矩阵-1.1000 -0.1000 -0.1000 -0.1000 -1.1000 -0.1000 -0.1000 -0.1000 -1.1000
提取3 × 3矩阵上三角部分的索引idx = triu(真(3))
idx =3 x3逻辑阵列1 1 1 0 1 1 0 0 1
更新actor和批评家中的参数。票面价值= getLearnableParameters(代理);par.Actor{1} = -single([1 1]);par.Critic {1} = W (idx) ';setLearnableParameters(代理,票面价值);
用随机观测输入检查代理。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1 x1单元阵列{[-1.2857]}
火车代理
要培训代理,首先要指定培训选项。对于本例,使用以下选项。
运行在最
5000
训练课程中的章节,每章节最多持续一段时间200
时间的步骤。在“集训管理器”对话框中显示训练进度
情节
选项)并禁用命令行显示(详细的
选项)。当代理收到移动平均累积奖励大于时停止训练
-66年
.在这一点上,代理可以用最小的控制努力控制质量的位置。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...MaxEpisodes = 5000,...MaxStepsPerEpisode = 200,...Verbose = false,...情节=“训练进步”,...StopTrainingCriteria =“AverageReward”,...StopTrainingValue = -66);
方法可以可视化双积分器环境情节
在训练或模拟中发挥作用。
情节(env)
使用火车
.训练这个代理是一个计算密集的过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainOpts);其他的为示例加载预先训练过的代理。负载(“DoubleIntegDDPG.mat”,“代理”);结束
模拟DDPG代理
为了验证训练过的代理的性能,在双积分器环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptions
而且sim卡
.
simOptions = rlSimulationOptions (MaxSteps = 500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = -65.9849
解决问题等
这个函数lqrd
(控制系统工具箱)解决了一个离散的LQR问题,就像这个例子中展示的那样。该函数计算最佳离散时间增益矩阵Klqr
,以及Riccati方程的解Plqr
.当Klqr
通过负状态反馈连接到设备输入(力),其离散时间相当于由env。问
而且env。R
是最小化的。此外,从初始状态开始,从初始时间到无穷大的累积代价x0
等于* Plqr * x0 x0”
.
使用lqrd
来解决离散LQR问题。
[Klqr, Plqr] = lqrd ([0 1; 0 0], [0; env.Gain], env.Q, env.R, env.Ts);
在这里,[0 1; 0 0]
而且[0, env。获得)
分别为双积分器系统的连续时间跃迁矩阵和输入增益矩阵。
如果没有安装Control System Toolbox™,请使用默认示例值的解决方案。
Klqr = [17.8756 8.2283];Plqr = [4.1031 0.3376;0.3376 - 0.1351);
如果参与者策略 成功逼近最优策略,然后得到 一定很接近 (这个负号是由于 是假设负反馈连接计算的)。
如果评论家学习到最优值函数的一个很好的近似,那么结果 ,如之前定义的,必须接近 (负号是因为奖励被定义为成本的负数)。
比较DDPG代理和最优控制器
提取agent内部行动者和批评家的参数(权重)。
票面价值= getLearnableParameters(代理);
显示参与者权重。
K = par.Actor {1}
K =1x2单行向量-15.4622 - -7.2252
注意,增益接近于最优解的增益-Klqr
:
-Klqr
ans =1×2-17.8756 - -8.2283
重建矩阵 而且 分别定义了q值函数和值函数。首先,初始化 为零。
W = 0 (3);
将评价权放在Wc的上三角形部分。
W (idx) = par.Critic {1};
重新创建 之前定义。
W = (W + W')/2
W =3×3-4.9889 -0.7774 -0.0556 -0.7774 -0.3434 -0.0250 -0.0556 -0.0250 -0.0035
使用 而且 ,计算 之前定义。
P =[眼(2)K']*W*[眼(2);K]
P =2 x2单一矩阵-4.1008 -0.3772 -0.3772 -0.1633
注意,增益接近Riccati方程的解-Plqr
.
-Plqr
ans =2×2-4.1031 -0.3376 -0.3376 -0.1351
获取环境初始状态。
x0 =重置(env);
价值函数是在使用行为人制定的政策时,对未来累积的长期回报的估计。根据临界权值计算初始状态下的值函数。该值与训练窗口中显示的值相同集Q0.
q0 = x0 ' * P * x0
q0 =单-65.6130
注意,这个值非常接近验证模拟中获得的实际奖励,totalReward
,这表明评论家对行为人制定的政策的价值函数有一个很好的近似。
根据LQR控制器制定的真最优策略,计算初始状态的值。
* Plqr * x0 x0”
ans = -65.6494
这个值也非常接近验证模拟中得到的值,证实了行动者学习并制定的策略是真正最优策略的良好近似。