用基线训练PG Agent控制双积分系统
这个例子展示了如何训练一个具有基线的策略梯度(PG)代理来控制MATLAB®建模的二阶动态系统。
有关没有基线的基本PG代理的更多信息,请参见示例训练PG代理人平衡车杆系统.
双积分器MATLAB环境
本例的强化学习环境是一个带增益的二阶双积分系统。训练目标是通过施加一个力输入来控制一个质量在二阶系统中的位置。
对于这种环境:
质量从-2到2个单位之间的初始位置开始。
从agent到环境的力动作信号为-2 ~ 2n。
从环境中观测到的是物体的位置和速度。
如果物体从原始位置移动超过5米,或者如果 .
奖励 ,则为的离散化 :
在这里:
是质量的状态向量。
是作用在物体上的力。
是对控制性能的权重; .
是把重心放在控制努力上; .
有关此模型的更多信息,请参见负载预定义控制系统环境.
创建双积分器MATLAB环境界面
为摆创建一个预定义的环境接口。
环境= rlPredefinedEnv(“DoubleIntegrator-Discrete”)
env = DoubleIntegratorDiscreteAction with properties:增益:1 Ts: 0.1000 MaxDistance: 5 GoalThreshold: 0.0100 Q: [2x2 double] R: 0.0100 MaxForce: 2 State: [2x1 double]
该界面有一个离散的动作空间,代理可以在其中对质量施加三种可能的力值之一:- 2,0或2 N。
从环境接口获取观测和动作信息。
obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
固定随机生成器种子的再现性。
rng (0)
创建PG代理角色
对于策略梯度智能体,行为体执行随机策略,对于离散动作空间,行为体近似为离散类别行为体。这个参与者必须将观察信号作为输入,并返回每个操作的概率。
要在参与者中近似策略,请使用神经网络。将网络定义为具有一个输入(观察)和一个输出(动作)的层对象数组,并从环境规范对象中获得观察空间的维度和可能的动作数量。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数.
actorNet = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(nummel (actInfo.Elements))];
转换为dlnetwork
并显示权重的数量。
actorNet = dlnetwork(actorNet);总结(actorNet)
初始化:true可学习的数量:9输入:1 '输入' 2个特征
为演员指定训练选项。有关更多信息,请参见rlOptimizerOptions
.或者,您可以在创建代理后使用点表示法更改代理(包括演员和评论家)选项。
actorOpts = rlOptimizerOptions(...LearnRate = 5 e - 3,...GradientThreshold = 1);
使用神经网络和环境规范对象创建参与者表示。有关更多信息,请参见rlDiscreteCategoricalActor
.
actor = rlDiscreteCategoricalActor(actorNet,obsInfo,actInfo);
要返回作为随机观察的函数的可能操作的概率分布,并给定当前网络权重,使用评估
.
prb = evaluate(actor,{rand(obsInfo.Dimension)})
复审委员会=1x1单元阵列{3 x1单}
复审委员会{1}
ans =3x1单列向量0.4994 0.3770 0.1235
创建PG代理基线
PG Agent算法(也称为REINFORCE)返回的结果可以与依赖于状态的基线进行比较。这可以减少更新期望值的方差,从而提高学习速度。基线的一个可能选择是状态值函数[1]的估计值。
值-函数近似对象必须接受一个观测值作为输入,并返回一个单个标量(估计的折现累积长期奖励)作为输出。使用神经网络作为近似模型。将网络定义为层对象的数组,并从环境规范对象中获得观察空间的维度和可能的动作数。
baselineNet = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(8) reluLayer fullyConnectedLayer(1)];
转换为dlnetwork
并显示权重的数量。
baselineNet = dlnetwork(baselineNet);
使用创建基线值函数逼近器baselineNet
,以及观测规范。有关更多信息,请参见rlValueFunction
.
基线= rlValueFunction(baselineNet,obsInfo);
用随机观测输入检查基线。
getValue(基线,{兰德(obsInfo.Dimension)})
ans =单0.2152
为基线指定一些训练选项。
基线选项= rlOptimizerOptions(...LearnRate = 5 e - 3,...GradientThreshold = 1);
要创建具有基线的PG代理,使用指定PG代理选项rlPGAgentOptions
并设置UseBaseline
选项设置为真正的
.
agentOpts = rlPGAgentOptions(...UseBaseline = true,...ActorOptimizerOptions = actorOpts,...CriticOptimizerOptions = baselineOpts);
然后使用指定的参与者表示、基线表示和代理选项创建代理。有关更多信息,请参见rlPGAgent
.
agent = rlpagent (actor,baseline,agentOpts);
用随机观测输入检查代理。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[0]}
火车代理
要培训代理,首先指定培训选项。对于本例,使用以下选项。
最多运行1000集,每集最多持续200个时间步。
在“事件管理器”对话框中显示培训进度
情节
选项)并禁用命令行显示(设置详细的
选项)。当代理收到的移动平均累积奖励大于-45时停止训练。在这一点上,智能体可以用最小的控制努力控制质量的位置。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions(...MaxEpisodes = 1000,...MaxStepsPerEpisode = 200,...Verbose = false,...情节=“训练进步”,...StopTrainingCriteria =“AverageReward”,...StopTrainingValue = -43);
你可以用情节
在训练或模拟中发挥作用。
情节(env)
培训代理使用火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats = train(agent,env,trainOpts);其他的加载示例的预训练参数。负载(“DoubleIntegPGBaseline.mat”);结束
模拟PG Agent
为了验证训练代理的性能,在双积分器环境中进行仿真。有关代理模拟的详细信息,请参见rlSimulationOptions
而且sim卡
.
simOptions = rlSimulationOptions(MaxSteps=500);experience = sim(env,agent,simOptions);
totalReward =总和(经验。奖励)
totalReward = -39.9140
参考文献
[1]萨顿,理查德S和安德鲁g巴托。强化学习:简介.第二版。自适应计算和机器学习系列。马萨诸塞州剑桥:麻省理工学院出版社,2018年。