训练DQN代理平衡车杆系统
本示例演示了如何训练深度q学习网络(DQN)代理来平衡MATLAB®建模的车-杆系统。
有关DQN代理的更多信息,请参见DQN (Deep Q-Network)代理.有关在Simulink®中训练DQN代理的示例,请参见训练DQN代理上摆和平衡摆.
Cart-Pole MATLAB环境
本例的强化学习环境是一根杆子,拴在小车上的一个不受驱动的关节上,小车沿着无摩擦的轨道移动。训练目标是使杆子直立而不跌倒。
对于这个环境:
向上的平衡杆位置为0弧度,向下的悬挂位置为
π
弧度。极点开始直立,初始角度在-0.05到0.05弧度之间。
从代理到环境的力动作信号是-10或10牛。
从环境中观察到的是推车的位置和速度、极点角和极点角的导数。
如果极点与垂直的距离超过12度,或者如果推车移动到距离原来位置超过2.4米,则事件终止。
杆子保持直立的每一步奖励+1。当杆子掉落时,会受到-5的惩罚。
有关此模型的更多信息,请参见负载预定义控制系统环境.
创建环境接口
为系统创建一个预定义的环境接口。
env = rlPredefinedEnv (“CartPole-Discrete”)
env = cartpoledistteaction with properties: Gravity: 9.8000 MassCart: 1 masspoole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 thetathresholdraans: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 pendtyforfalling: -5 State: [4x1 double]
该界面有一个离散的动作空间,代理可以在其中向推车施加两种可能的力值之一,-10或10 N。
获取观察和行动规范信息。
obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec属性:LowerLimit: -Inf UpperLimit: Inf名称:"CartPole States"描述:"x, dx, theta, dtheta"尺寸:[4 1]数据类型:"double"
actInfo = getActionInfo (env)
元素:[-10 10]名称:"CartPole Action"描述:[0x0 string]尺寸:[1 1]数据类型:"double"
固定随机生成器种子的再现性。
rng (0)
创建DQN代理
DQN代理可以使用矢量q -值函数批评,这通常比可比的单输出批评更有效。向量q值函数批评家将观测值作为输入,将状态动作值作为输出。每个输出元素代表从观察输入指示的状态中采取相应离散行动的预期累积长期回报。有关创建价值功能的更多信息,请参见创建政策和价值功能.
为了近似临界内的q -值函数,使用具有一个输入通道(4维观察状态向量)和一个带有两个元素的输出通道(一个用于10 N的动作,另一个用于-10 N的动作)的神经网络。将网络定义为层对象的数组,并从环境规范对象中获取观察空间的维度和可能的操作数量。
net = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(20) reluLayer fullyConnectedLayer(length(actInfo.Elements))];
转换为dlnetwork
并显示权重的数量。
网= dlnetwork(净);总结(净)
可学习的数量:142输入:1 '输入' 4个特性
查看网络配置。
情节(净)
使用创建临界逼近器网
以及环境规格。有关更多信息,请参见rlVectorQValueFunction
.
评论家= rlVectorQValueFunction(网,obsInfo, actInfo);
用随机的观察输入检查批评家。
getValue(评论家,{兰德(obsInfo.Dimension)})
ans =2x1单列向量-0.2257 - 0.4299
使用创建DQN代理评论家
.有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(批评);
用随机观测输入检查代理。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1 x1单元阵列{[10]}
指定DQN代理选项,包括批评家的培训选项。或者,您也可以使用rlDQNAgentOptions
而且rlOptimizerOptions
对象。
agent.AgentOptions.UseDoubleDQN = false;agent.AgentOptions.TargetSmoothFactor = 1;agent.AgentOptions.TargetUpdateFrequency = 4;agent.AgentOptions.ExperienceBufferLength = 1 e5;agent.AgentOptions.MiniBatchSize = 256;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1 e - 3;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;
火车代理
要培训代理,首先要指定培训选项。对于本例,使用以下选项:
运行一个包含最多1000集的训练课程,每集持续最多500个时间步。
在“集训管理器”对话框中显示训练进度
情节
选项)并禁用命令行显示(设置详细的
选项假
).当代理收到移动平均累积奖励大于480时停止训练。在这一点上,代理可以在直立位置平衡车杆系统。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...MaxEpisodes = 1000,...MaxStepsPerEpisode = 500,...Verbose = false,...情节=“训练进步”,...StopTrainingCriteria =“AverageReward”,...StopTrainingValue = 480);
可以可视化车杆系统,可以通过使用情节
在训练或模拟中发挥作用。
情节(env)
训练代理使用火车
函数。训练这个代理是一个计算密集的过程,需要几分钟才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainOpts);其他的为示例加载预先训练过的代理。负载(“MATLABCartpoleDQNMulti.mat”,“代理”)结束
模拟DQN代理
为了验证训练过的代理的性能,在车杆环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptions
而且sim卡
.即使模拟时间增加到500步,代理也能平衡车杆。
simOptions = rlSimulationOptions (MaxSteps = 500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = 500