训练DQN人员平衡车杆系统
这个例子展示了如何训练深度q学习网络(DQN)代理来平衡MATLAB®建模的车杆系统。
有关DQN代理的更多信息,请参见Deep Q-Network (DQN)代理商.有关在Simulink®中训练DQN代理的示例,请参见金宝app训练DQN代理人摆动和平衡摆.
车杆MATLAB环境
本例的强化学习环境是一根杆子连接在一辆小车上的一个未驱动关节上,它沿着无摩擦的轨道移动。训练目标是使杆子直立不倒。
对于这种环境:
向上平衡杆位置为0弧度,向下悬挂位置为
π
弧度。极点以-0.05到0.05弧度之间的初始角度开始直立。
从代理到环境的力动作信号是-10或10 N。
从环境中观测到的是小车的位置和速度,极角和极角导数。
如果杆子偏离垂直方向超过12度,或者推车从原来的位置移动超过2.4米,则该事件终止。
每一步杆子保持直立,奖励为+1。当杆子下落时,惩罚为-5。
有关此模型的更多信息,请参见负载预定义控制系统环境.
创建环境界面
为系统创建预定义的环境接口。
环境= rlPredefinedEnv(“CartPole-Discrete”)
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 MassPole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 ThetaThresholdRadians: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -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"
getActionInfo(env)
actInfo = rlFiniteSetSpec与属性:元素:[-10 10]名称:"CartPole Action"描述:[0x0 string]尺寸:[1 1]数据类型:"double"
固定随机生成器种子的再现性。
rng (0)
创建DQN Agent
DQN代理可以使用矢量q值函数批评,这通常比可比的单输出批评更有效。矢量q值函数评论家将观测值作为输入,状态-动作值作为输出。每个输出元素表示从观察输入所指示的状态中采取相应离散行动所期望的累计长期奖励。有关创建值函数的更多信息,请参见创建策略和值函数.
为了在评论家中近似q值函数,使用带有一个输入通道(4维观察状态向量)和一个带有两个元素(一个用于10 N动作,另一个用于-10 N动作)的输出通道的神经网络。将网络定义为层对象的数组,并从环境规范对象中获得观察空间的维度和可能的动作数。
net = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(20) reluLayer fullyConnectedLayer(length(actInfo.Elements))];
转换为dlnetwork
并显示权重的数量。
Net = dlnetwork(Net);总结(净)
初始化:true可学习的数量:142输入:1 '输入' 4个特征
查看网络配置。
情节(净)
使用创建临界逼近器网
以及环境规范。有关更多信息,请参见rlVectorQValueFunction
.
rlVectorQValueFunction(net,obsInfo,actInfo);
用随机的观察输入检查评论家。
getValue(评论家,{兰德(obsInfo.Dimension)})
ans =2x1个单列向量-0.2257 - 0.4299
使用创建DQN代理评论家
.有关更多信息,请参见rlDQNAgent
.
agent = rlDQNAgent(批评家);
用随机观测输入检查代理。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[10]}
指定DQN代理选项,包括评论家的培训选项。或者,您可以使用rlDQNAgentOptions
而且rlOptimizerOptions
对象。
agent.AgentOptions.UseDoubleDQN = false;agent.AgentOptions.TargetSmoothFactor = 1;agent.AgentOptions.TargetUpdateFrequency = 4;agent.AgentOptions.ExperienceBufferLength = 1e5;agent.AgentOptions.MiniBatchSize = 256;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1e-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 = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“MATLABCartpoleDQNMulti.mat”,“代理”)结束
模拟DQN Agent
为了验证训练过的智能体的性能,在车杆环境中进行了仿真。有关代理模拟的详细信息,请参见rlSimulationOptions
而且sim卡
.即使模拟时间增加到500步,智能体也能平衡车杆。
simOptions = rlSimulationOptions(MaxSteps=500);experience = sim(env,agent,simOptions);
totalReward =总和(经验。奖励)
totalReward = 500