训练DQN人员平衡车杆系统
这个例子展示了如何训练深度q学习网络(DQN)代理来平衡MATLAB®建模的车杆系统。
有关DQN代理的更多信息,请参见深度q -网络代理.有关在Simulink®中训练DQN代理的示例,请参见金宝app训练DQN代理人摆动和平衡摆.
车杆MATLAB环境
本例的强化学习环境是一根杆子连接在一辆小车上的一个未驱动关节上,它沿着无摩擦的轨道移动。训练目标是使杆子直立不倒。
对于这种环境:
向上平衡杆位置为
0
弧度,向下悬挂的位置是π
弧度。极点以-0.05到0.05弧度之间的初始角度开始直立。
从agent到环境的力动作信号为-10 ~ 10n。
从环境中观测到的是小车的位置和速度,极角和极角导数。
如果杆子偏离垂直方向超过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智能体在给定观察和行动的情况下,使用价值-功能评论家来近似长期奖励。
DQN代理可以使用多输出q值临界逼近器,这通常更有效。多输出逼近器将观测值作为输入,状态动作值作为输出。每个输出元素表示从观察输入所指示的状态中采取相应离散行动所期望的累计长期奖励。
为了创建评论家,首先创建一个深度神经网络,它有一个输入(4维观察状态)和一个带有两个元素的输出向量(一个用于10 N的动作,另一个用于-10 N的动作)。有关基于神经网络创建值-函数表示的更多信息,请参见创建策略和值函数.
dnn = [featureInputLayer(obsInfo.Dimension(1),“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer(24日“名字”,“CriticStateFC1”) reluLayer (“名字”,“CriticRelu1”) fullyConnectedLayer(24日“名字”,“CriticStateFC2”) reluLayer (“名字”,“CriticCommonRelu”) fullyConnectedLayer(长度(actInfo.Elements),“名字”,“输出”));DNN = dlnetwork(DNN);
查看网络配置。
图绘制(layerGraph(款)
为评论家优化器指定一些训练选项rlOptimizerOptions
.
criticOpts = rlOptimizerOptions(“LearnRate”, 0.001,“GradientThreshold”1);
使用指定的神经网络和选项创建评论家表示。有关更多信息,请参见rlVectorQValueFunction
.
rlVectorQValueFunction(dnn,obsInfo,actInfo);
要创建DQN代理,首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions(...“UseDoubleDQN”假的,...“TargetSmoothFactor”, 1...“TargetUpdateFrequency”4...“ExperienceBufferLength”, 100000,...“CriticOptimizerOptions”criticOpts,...“MiniBatchSize”, 256);
然后,使用指定的批评表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
agent = rlDQNAgent(批评家,agentOpts);
火车代理
要培训代理,首先指定培训选项。对于本例,使用以下选项:
运行一个最多包含1000集的训练课程,每集最多持续500个时间步。
在“事件管理器”对话框中显示培训进度
情节
选项)并禁用命令行显示(设置详细的
选项假
).当智能体收到的移动平均累积奖励大于480时停止训练。此时,代理可以在直立位置平衡推车杆系统。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions(...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”, 500,...“详细”假的,...“阴谋”,“训练进步”,...“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