此示例显示如何创建一个可以播放的深度Q学习网络(DQN)代理,并在Matlab®中平衡模型的摆锤。在此示例中,您使用使用DQN代理深网络设计师.有关DQN代理的更多信息,请参见深度Q-Network代理商.
本例的强化学习环境是一个简单的无摩擦摆,最初挂在一个向下的位置。训练目标是用最小的控制力使钟摆直立而不倾倒。
对于这个环境:
向上平衡的摆位为0
弧度和向下悬挂的位置是π
弧度。
来自代理到环境的扭矩动作信号来自-2至2 n·m。
来自环境的观察是摆锤的简化灰度图像和摆角衍生物。
奖励 ,在每个时间步长时,为
在这里:
是从直立位置的位移角度。
是位移角度的衍生物。
是前一步的控制力。
有关此模型的更多信息,请参见培训DDPG代理以摇摆和平衡摆动图像观察.
为摆创建一个预定义的环境接口。
env = rlPredefinedEnv (“SimplePendulumWithImage-Discrete”);
界面有两个观察。第一个观察,命名“pendimage”
,是50×50灰度图像。
ObsInfo = GetobservationInfo(ENV);ObsInfo(1)
ans = rlnumericspec与属性:lowermit:0上限:1名称:“Pendimage”描述:[0x0字符串]尺寸:[50 50]数据类型:“双”
第二个观察,命名“Angularrate”
,是摆锤的角速度。
obsInfo (2)
ans = rlnumericspec具有属性:lowermit:-inf上唇:inf name:“Agularrate”描述:[0x0字符串]尺寸:[1 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代理使用批评价值函数表示来估计长期奖励,给定观察和行动。对于这种环境,评论家是一个深度神经网络,具有三个输入(两个观察和一个动作)和一个输出。有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和值函数表示.
您可以通过使用深网络设计师应用程序。为此,您首先为每个观察和操作创建单独的输入路径。这些路径从各自的输入中了解较低级别的功能。然后,您创建一个公共输出路径,该路径将输出与输入路径组合起来。
创建图像观测路径
要创建图像观测路径,首先拖动imageInputlayer.
来自图书馆库窗格到画布。设置图层输入到50岁,50岁,1
对图像进行观察,并设置归一化到没有任何
.
二,拖动一个Convolution2Dlayer.
到画布并将该层的输入连接到I的输出mageInputLayer
.创建卷积层2
过滤器(NumFilters属性),其高度和宽度为10
(FilterSize财产),并使用一步5
在水平和垂直方向(步行属性)。
最后,用两组抵押者
和fullyConnectedLayer
层。第一个和第二个的输出大小fullyConnectedLayer
层数分别为400和300。
创建所有输入路径和输出路径
以类似的方式构造其他输入路径和输出路径。对于此示例,请使用以下选项。
角速度路径(标量输入):
imageInputlayer.
——设置输入到1, - 1
和归一化到没有任何
.
fullyConnectedLayer
——设置OutputSize到400
.
抵押者
fullyConnectedLayer
——设置OutputSize到300
.
动作路径(标量输入):
imageInputlayer.
——设置输入到1, - 1
和归一化到没有任何
.
fullyConnectedLayer
——设置OutputSize到300
.
输出路径:
additionLayer
- 将所有输入路径的输出连接到该图层的输入。
抵押者
fullyConnectedLayer
——设置OutputSize到1
对于标量值函数。
将网络导出到MATLAB工作区,进入深网络设计师, 点击出口.深网络设计师将网络导出为包含网络图层的新变量。您可以使用此图层网络变量创建批评批评表示。
或者,要生成网络的等效MATLAB代码,请单击导出>生成代码.
生成的代码如下所示。
Lgraph = layerGraph();templayers = [imageInputlayer([1 1 1],“名称”,“Angularrate”,“归一化”,“没有”) fullyConnectedLayer (400,“名称”,“dtheta_fc1”) reluLayer (“名称”,“dtheta_relu1”) fullyConnectedLayer (300,“名称”,“dtheta_fc2”)];Lgraph = Addlayers(LGraph,Templayers);templayers = [imageInputlayer([1 1 1],“名称”,“扭矩”,“归一化”,“没有”) fullyConnectedLayer (300,“名称”,“torque_fc1”)];Lgraph = Addlayers(LGraph,Templayers);templayers = [imageInputLayer([50 50 1],“名称”,“pendimage”,“归一化”,“没有”)卷积2dlayer([10 10],2,“名称”,“img_conv1”,“填充”,“相同”,“步幅”,[5 5])剥离器(“名称”,“relu_1”) fullyConnectedLayer (400,“名称”,“批评_theta_fc1”) reluLayer (“名称”,“theta_relu1”) fullyConnectedLayer (300,“名称”,“批评_theta_fc2”)];Lgraph = Addlayers(LGraph,Templayers);templayers = [附加层(3,“名称”,“添加”) reluLayer (“名称”,“relu_2”)全康连接层(1,“名称”,“endiceValue”)];Lgraph = Addlayers(LGraph,Templayers);lgraph = connectLayers (lgraph,“torque_fc1”,“添加/ in3”);lgraph = connectLayers (lgraph,“批评_theta_fc2”,“添加/三机一体”);lgraph = connectLayers (lgraph,“dtheta_fc2”,“添加/ in2”);
查看critical网络配置。
图绘图(LGROP)
为使用的批评家表示指定选项rlRepresentationOptions
.
criticOpts = rlRepresentationOptions (“LearnRate”,1e-03,“GradientThreshold”1);
使用指定的深神经网络创建批评批评者表示LGRAPH.
和选项。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlqvalueerepresentation
.
评论家= 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);代理.epsilongredyexpliation.epsilondecay = 1e-5;
然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
要培训代理,首先指定培训选项。对于此示例,请使用以下选项。
为大多数5000次剧集运行每个培训,每个剧集持续最多500个时间步长。
在Episode Manager对话框中显示培训进度(设置绘图
选项),并禁用命令行显示(设置详细的
选择假
).
在默认窗口长度的5个连续剧集的默认窗口长度超过-1000时停止训练。此时,代理商可以使用最小的控制工作快速平衡摆锤的摆锤。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (......'maxepisodes',5000,......'maxstepperepisode',500,......'verbose'假的,......“阴谋”,'培训 - 进步',......“StopTrainingCriteria”,'AverageReward',......“StopTrainingValue”,-1000);
您可以通过使用培训或模拟期间可视化摆动系统情节
函数。
情节(env)
使用该代理商培训火车
函数。这是一个计算密集的进程,需要几个小时才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理doTraining
到假
.自己训练代理人,设置doTraining
到真正的
.
doTraining = false;如果doTraining%训练代理人。Trainstats =火车(代理,env,训练);其他的%负载净化代理。负载(“MATLABPendImageDQN.mat”,'代理人');结束
为了验证训练过的代理的性能,在摆环境中模拟它。有关代理模拟的更多信息,请参见RlsimulationOptions.
和sim卡
.
simoptions = rlsimulation选项('maxsteps', 500);经验= sim (env,代理,simOptions);
TotalReward = Sum(经验.Rward)
totalReward = -888.9802