本示例演示如何创建一个深度Q学习网络(DQN)代理,该代理可以向上摆动并平衡在MATLAB®中建模的钟摆。在本示例中,您可以使用深度网络设计器.有关DQN代理的更多信息,请参见深度Q网络代理.
本例的强化学习环境是一个简单的无摩擦摆,最初挂在一个向下的位置。训练目标是用最小的控制力使钟摆直立而不倾倒。
对于这种环境:
向上平衡的摆位为0
弧度,下悬位置为π
弧度。
从代理到环境的扭矩作用信号为-2到2 N·m。
从环境观测得到的是简化的钟摆灰度图像和钟摆角导数。
奖励 ,在每个时间步长时,为
在这里:
是垂直位置的位移角。
是位移角的导数。
是上一时间步的控制效果。
有关此模型的更多信息,请参见通过图像观察训练DDPG药剂摆动和平衡摆锤.
为摆创建一个预定义的环境接口。
env = rlPredefinedEnv (“SimplePendulumWithImage-Discrete”);
界面有两个观察。第一次观察,命名为“pendImage”
,是一个50乘50的灰度图像。
obsInfo=getObservationInfo(环境);obsInfo(1)
ans=rlNumericSpec,属性:LowerLimit:0上限:1名称:“pendImage”说明:[0x0字符串]维度:[50]数据类型:“double”
第二个观察结果叫做“angularRate”
,是摆锤的角速度。
obsInfo (2)
ans=rlNumericSpec,属性:LowerLimit:-Inf上限:Inf名称:“angularRate”说明:[0x0字符串]维度:[1]数据类型:“double”
该界面有一个离散的动作空间,在这个空间中,agent可以对摆施加5个可能的扭矩值中的一个:-2,-1,0,1,或2 N·m。
actInfo = getActionInfo (env)
属性:Elements: [-2 -1 0 1 2] Name: "torque" Description: [0x0 string] Dimension: [1 1] DataType: "double"
修复随机生成器种子以获得再现性。
rng(0)
DQN代理使用临界值函数表示法来近似给定观察值和动作的长期奖励。在这种环境下,临界值是一个具有三个输入(两个观察值和一个动作)和一个输出的深度神经网络。有关创建深度神经网络值函数表示法的更多信息,请参阅创建策略和值函数表示.
您可以通过使用深度网络设计器要做到这一点,你首先要为每个观察和动作创建单独的输入路径。这些路径从它们各自的输入中学习较低级别的特性。然后创建一个公共输出路径,该路径将来自输入路径的输出组合起来。
创建图像观测路径
要创建图像观测路径,首先拖动图像输入层
从图层库将窗格设置为画布。设置图层InputSize到50岁,50岁,1
对图像进行观察,并设置归一化到没有一个
.
第二,拖动一个卷积层
连接到画布,并将该层的输入连接到mageInputLayer
.使用创建卷积层2
过滤器(NumFilters属性),其高度和宽度为10
(FilterSize属性),并使用5
在水平和垂直方向(大步走属性)。
最后,用两组reLULayer
和fullyConnectedLayer
层。第一个和第二个的输出大小fullyConnectedLayer
层数分别为400和300。
创建所有输入路径和输出路径
以类似的方式构造其他输入路径和输出路径。
角速度路径(标量输入):
图像输入层
——设置InputSize到1, - 1
和归一化到没有一个
.
fullyConnectedLayer
——设置OutputSize到400
.
reLULayer
fullyConnectedLayer
——设置OutputSize到300
.
动作路径(标量输入):
图像输入层
——设置InputSize到1, - 1
和归一化到没有一个
.
fullyConnectedLayer
——设置OutputSize到300
.
输出路径:
additionLayer
-将所有输入路径的输出连接到此层的输入。
reLULayer
fullyConnectedLayer
——设置OutputSize到1
对于标量值函数。
要将网络导出到MATLAB工作区,请在深度网络设计器点击出口.深度网络设计器将网络导出为包含网络层的新变量。可以使用此层网络变量创建批评家表示。
或者,要为网络生成等效的MATLAB代码,请单击导出>生成代码.
生成的代码如下所示。
lgraph=layerGraph();tempLayers=[imageInputLayer([1],“名称”,“angularRate”,“归一化”,“没有”) fullyConnectedLayer (400,“名称”,“dtheta_fc1”) reluLayer (“名称”,“dtheta_relu1”) fullyConnectedLayer (300,“名称”,“dtheta_fc2”));lgraph = addLayers (lgraph tempLayers);templayer = [imageInputLayer([1 1 1],]),“名称”,“扭矩”,“归一化”,“没有”) fullyConnectedLayer (300,“名称”,“torque_fc1”)];lgraph=addLayers(lgraph,tempLayers);tempLayers=[imageInputLayer([50 1],“名称”,“pendImage”,“归一化”,“没有”10) convolution2dLayer ([10], 2,“名称”,“img_conv1”,“填充”,“相同”,“跨步”,[5])reluLayer(“名称”,“relu_1”) fullyConnectedLayer (400,“名称”,“评论家西塔fc1”) reluLayer (“名称”,“theta_relu1”) fullyConnectedLayer (300,“名称”,“评论家西塔fc2”));lgraph = addLayers (lgraph tempLayers);tempLayers =[添加图层(3,“名称”,“添加”) reluLayer (“名称”,“relu_2”)完全连接层(1,“名称”,“stateValue”)];lgraph=addLayers(lgraph,tempLayers);lgraph=connectLayers(lgraph,“torque_fc1”,“添加/ in3”);lgraph = connectLayers (lgraph,“评论家西塔fc2”,“添加/三机一体”);lgraph = connectLayers (lgraph,“dtheta_fc2”,“添加/ in2”);
查看critical网络配置。
图形绘图(lgraph)
为使用的批评家表示指定选项rlRepresentationOptions
.
criticOpts = rlRepresentationOptions (“LearnRate”,1e-03,“GradientThreshold”1);
使用指定的深度神经网络创建批评家表示lgraph
和选项。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
.
评论家= rlQValueRepresentation (lgraph obsInfo actInfo,...“观察”, {“pendImage”,“angularRate”},“行动”, {“扭矩”}, criticOpts);
要创建DQN代理,请首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions (...“UseDoubleDQN”假的,...“TargetUpdateMethod”,“平滑”,...“TargetSmoothFactor”1 e - 3,...“ExperienceBufferLength”1 e6,...“DiscountFactor”, 0.99,...“采样时间”env。Ts,...“MiniBatchSize”,64);agentOpts.epsilongreedexploration.EpsilonDecay=1e-5;
然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
要培训代理,首先指定培训选项。
每次训练最多5000集,每次训练最多500个时间步。
在“事件管理器”对话框中显示培训进度(设置阴谋
选项),并禁用命令行显示(设置详细的
选项假
).
当代理在默认的连续五次事件的窗口长度上获得大于-1000的平均累积奖励时,停止训练。在这一点上,代理可以快速平衡摆在直立的位置,使用最小的控制努力。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...“最大集”,5000,...“MaxStepsPerEpisode”,500,...“冗长”假的,...“阴谋”,“培训进度”,...“StopTrainingCriteria”,“平均向上”,...“StopTrainingValue”,-1000);
在训练或模拟过程中,可以使用情节
函数。
情节(env)
训练代理人使用火车
函数。这是一个计算密集型过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置doTraining
到假
.自己训练代理人,设置doTraining
到真正的
.
doTraining = false;如果doTraining%培训代理人。trainingStats=列车(代理人、环境、列车员);其他的%为示例加载预训练代理。负载(“MATLABPendImageDQN.mat”,“代理人”);结束
为了验证训练过的代理的性能,在摆环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.
simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);
totalReward=总和(经验奖励)
totalReward = -888.9802