训练DDPG Agent控制双积分系统
这个例子展示了如何训练深度确定性策略梯度(DDPG)代理来控制MATLAB®建模的二阶线性动态系统。该示例还将DDPG代理与LQR控制器进行了比较。
有关DDPG代理的更多信息,请参见深度确定性策略梯度(DDPG)代理.有关显示如何在Simulink®中训练DDPG代理的示例,请参见金宝app训练DDPG代理人摆动和平衡摆.
双积分器MATLAB环境
本例的强化学习环境是一个带增益的二阶双积分系统。训练目标是通过施加一个力输入来控制一个质量在二阶系统中的位置。
对于这种环境:
质量从-4到4个单位之间的初始位置开始。
从环境中观测到的是物体的位置和速度。
如果物体从原始位置移动超过5米,或者如果 .
奖励 ,则为的离散化 :
在这里:
是质量的状态向量。
是作用在物体上的力。
为控制性能权重矩阵; .
是把重心放在控制努力上; .
有关此模型的更多信息,请参见负载预定义控制系统环境.
在这个例子中,环境是一个线性动力系统,环境状态是直接观察到的,奖励是观察和行动的二次函数。因此,寻找使累积长期奖励最小化的行动序列问题是一个离散线性二次型最优控制问题,其中最优行动是系统状态的线性函数。这个问题也可以使用线性二次调节器(LQR)设计来解决,在示例的最后一部分,您可以将代理与LQR控制器进行比较。
创建环境界面
为双积分器系统创建预定义的环境接口。
环境= 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名称:"states"描述:"x, dx"维度:[2 1]数据类型:"double"
getActionInfo(env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf名称:"force"描述:[0x0 string]维度:[1 1]数据类型:"double"
重置环境并获得其初始状态。
X0 = reset(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(1,Name=“价值”,...BiasLearnRateFactor = 0,偏见= 0)];将图层添加到layerGraph对象criticNet = layerGraph(obsPath);addLayers(criticNet,actPath);criticNet = addLayers(criticNet,commonPath);%连接层临界网络= connectLayers(临界网络,“obsIn”,“concat /三机一体”);临界网络= connectLayers(临界网络,“肌动蛋白”,“concat / in2”);
查看关键网络配置。
图绘制(criticNet)
转换为dlnetwork
并显示权重的数量。
criticNet = dlnetwork(criticNet);总结(criticNet)
初始化:true可学习数量:7 input: 1 'obsIn' 2 features 2 'actIn' 1 features
使用创建临界近似器对象criticNet
、环境观测和动作规范,以及分别与环境观测和动作通道相连的网络输入层名称。有关更多信息,请参见rlQValueFunction
.
评论= rlQValueFunction(批评网,...obsInfo actInfo,...ObservationInputNames =“obsIn”ActionInputNames =“肌动蛋白”);
用随机的观察和行动输入检查批评家。
getValue(评论家,{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =单-0.3977
DDPG代理使用一种参数化的连续确定性策略,该策略由连续确定性参与者实现。这个参与者必须接受一个观察作为输入,并返回一个操作作为输出。要在参与者中近似策略函数,请使用神经网络。由于在本例中,最优策略在状态下是线性的,因此使用具有全连接层的浅网络来提供两个网络输入的线性组合。
将网络定义为层对象的数组,并从环境规范对象中获取观察和操作空间的维度。由于不需要偏差项,就像对评论家所做的那样,将偏差项设置为零(偏见= 0
),并防止其改变(BiasLearnRateFactor = 0
).有关actor的更多信息,请参见创建策略和值函数.
actorNet = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(actInfo.Dimension(1)),...BiasLearnRateFactor = 0,偏见= 0)];
转换为dlnetwork
并显示权重的数量。
actorNet = dlnetwork(actorNet);总结(actorNet)
初始化:true可学习的数量:3输入:1 '输入' 2个特征
使用以下命令创建参与者actorNet
以及观察和行动规范。有关更多信息,请参见rlContinuousDeterministicActor
.
actor = rlContinuousDeterministicActor(actorNet,obsInfo,actInfo);
使用随机观察输入检查actor。
getAction(演员,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[0.3493]}
使用参与者和评论家创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
agent = rlDDPGAgent(演员,评论家);
使用点符号为代理指定选项,包括评论家的培训选项。或者,您可以使用rlDDPGAgentOptions
,rlOptimizerOptions
对象,然后再创建代理。
agent.AgentOptions.SampleTime = env.Ts;agent.AgentOptions.ExperienceBufferLength = 1e6;agent.AgentOptions.MiniBatchSize = 32;agent.AgentOptions.NoiseOptions.Variance = 0.3;agent.AgentOptions.NoiseOptions.VarianceDecayRate = 1e-7;agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1e-4;agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 5e-3;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;
初始化Agent参数
参与者实现的策略是 ,其中反馈获得 而且 是行动者网络的两个权重。可以证明,当这些增益为负值时,闭环系统是稳定的,因此,将它们初始化为负值可以加快收敛速度。
q值函数的结构如下:
在哪里 为全连通层的权值。或者,用矩阵形式表示:
对于一个固定的政策 时,累积的长期回报(即保单的价值)变为:
由于奖励总是负的,所以要适当地近似累积奖励 而且 肯定是否定的。因此,为了加快收敛速度,初始化临界网络权值 这 是负定的。
创建带有负特征值的对角线矩阵W = -single(diag([1 1 1])+0.1)
W =3x3单矩阵-1.1000 -0.1000 -0.1000 -0.1000 -1.1000 -0.1000 -0.1000 -1.1000
提取3 × 3矩阵上三角部分的指标Idx = triu(true(3))
idx =3x3逻辑阵列1 1 1 1 0 1 1 0 0 1
更新参与者和评论家中的参数参数= getLearnableParameters(代理);par.Actor{1} = -single([1 1]);par.Critic{1} = W(idx)';setLearnableParameters(代理,票面价值);
用随机观测输入检查代理。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[-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 = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“DoubleIntegDDPG.mat”,“代理”);结束
模拟DDPG Agent
为了验证训练代理的性能,在双积分器环境中进行仿真。有关代理模拟的详细信息,请参见rlSimulationOptions
而且sim卡
.
simOptions = rlSimulationOptions(MaxSteps=500);experience = sim(env,agent,simOptions);
totalReward =总和(经验。奖励)
totalReward = -65.9849
解决LQR问题
这个函数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代理和最优控制器
在代理中提取参与者和评论家的参数(权重)。
参数= 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 =2x2单矩阵-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
这个值也非常接近于在验证模拟中获得的值,确认了参与者学习和制定的策略与真正的最优策略很接近。