这个例子展示了如何创建一个深度q学习网络(DQN)代理,可以摆动和平衡一个在MATLAB®中建模的摆。在本例中,使用以下命令创建DQN代理深层网络设计师。有关DQN代理的更多信息,请参阅深Q-Network代理.
本例中的强化学习环境是一个简单的无摩擦摆,最初悬挂在向下的位置。培训目标是使用最小的控制力使摆直立而不摔倒。
对于这个环境:
向上平衡的摆锤位置为0
弧度,向下悬挂的位置是圆周率
弧度。
agent对环境的力矩动作信号为-2 ~ 2n·m。
从环境观测得到的是简化的钟摆灰度图像和钟摆角导数。
奖赏 ,在每一个时间步提供
在这里:
为从垂直位置位移的角度。
是位移角的导数。
是上一个时间步骤的控制工作。
有关此模型的详细信息,请参见用图像观察训练DDPG Agent上摆和平衡摆.
为钟摆创建预定义的环境界面。
env=rlPredefinedEnv(“SimplePendulumWithImage离散”);
界面有两个观察。第一次观察,命名为“pendImage”
,是一幅50乘50的灰度图像。
obsInfo = getObservationInfo (env);obsInfo (1)
ans = rlNumericSpec with properties: LowerLimit: 0 UpperLimit: 1 Name: "pendImage" Description: [0x0 string] Dimension: [50 50] DataType: "double"
第二个观察结果叫做“angularRate”
,为钟摆的角速度。
obsInfo(2)
ans = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "angularRate" Description: [0x0 string] Dimension: [1 1] DataType: "double"
界面有一个离散的动作空间,在该空间中,代理可以向摆锤施加五个可能的扭矩值中的一个:–2、–1、0、1或2 N·m。
actInfo=getActionInfo(环境)
actInfo=rlFiniteSetSpec,属性为:元素:[-2-1 0 1 2]名称:“扭矩”说明:[0x0字符串]维度:[1 1]数据类型:“双”
修复随机生成器种子的再现性。
rng (0)
DQN代理使用批判价值函数表示来近似给定的观察和行动的长期奖励。在这个环境中,评论家是一个有三个输入(两个观察和一个动作)和一个输出的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
您可以使用深层网络设计师要做到这一点,你首先要为每个观察和动作创建单独的输入路径。这些路径从它们各自的输入中学习较低级别的特性。然后创建一个公共输出路径,该路径将来自输入路径的输出组合起来。
创建图像观察路径
要创建图像观察路径,请首先拖动imageInputLayer
从层的图书馆窗格到画布。设置层InputSize来50,50,1
用于图像观察,并设置规范化来没有一个
.
第二,拖convolution2DLayer
将这个图层的输入和I的输出连接起来磁输入层
.创建一个卷积层2.
过滤器(微粒过滤器属性),其高度和宽度为10
(过滤财产),并使用大步5.
在水平和垂直方向上(步财产)。
最后,用两套完整的图像路径网络reLULayer
和完全连接层
层。第一层和第二层的输出大小完全连接层
层分别为400和300。
创建所有输入路径和输出路径
以类似的方式构造其他输入路径和输出路径。对于本示例,请使用以下选项。
角速度路径(标量输入):
imageInputLayer
-设置InputSize来1,1
和规范化来没有一个
.
完全连接层
-设置输出大小来400
.
reLULayer
完全连接层
-设置输出大小来300
.
操作路径(标量输入):
imageInputLayer
-设置InputSize来1,1
和规范化来没有一个
.
完全连接层
-设置输出大小来300
.
输出路径:
附加层
-将所有输入路径的输出连接到该层的输入。
reLULayer
完全连接层
-设置输出大小来1.
对于标量值函数。
将网络导出到MATLAB工作区,在深层网络设计师,点击出口.深层网络设计师将网络导出为包含网络层的新变量。您可以使用此层网络变量创建批评家表示。
或者,要为网络生成等效的MATLAB代码,请单击导出>生成代码.
生成的代码如下所示。
lgraph = layerGraph ();templayer = [imageInputLayer([1 1 1],]),“姓名”,“angularRate”,“正常化”,“没有”)完全连接层(400,“姓名”,“dtheta_fc1”)雷卢耶(“姓名”,“dtheta_relu1”)完全连接层(300,“姓名”,“dtheta_fc2”));lgraph = addLayers (lgraph tempLayers);templayer = [imageInputLayer([1 1 1],]),“姓名”,“扭矩”,“正常化”,“没有”)完全连接层(300,“姓名”,“torque_fc1”));lgraph = addLayers (lgraph tempLayers);templayer = [imageInputLayer([50 50 1],]),“姓名”,“pendImage”,“正常化”,“没有”10) convolution2dLayer ([10], 2,“姓名”,“img_conv1”,“填充”,“相同”,“步”[5] 5) reluLayer (“姓名”,“relu_1”)完全连接层(400,“姓名”,“critic_theta_fc1”)雷卢耶(“姓名”,“theta_relu1”)完全连接层(300,“姓名”,“critic_theta_fc2”));lgraph = addLayers (lgraph tempLayers);tempLayers =[添加图层(3,“姓名”,“添加”)雷卢耶(“姓名”,“relu_2”) fullyConnectedLayer (1,“姓名”,“stateValue”));lgraph = addLayers (lgraph tempLayers);lgraph = connectLayers (lgraph,“torque_fc1”,“添加/输入3”); lgraph=连接层(lgraph,“critic_theta_fc2”,“添加/输入1”); lgraph=连接层(lgraph,“dtheta_fc2”,“添加/in2”);
查看网络配置。
图绘制(lgraph)
使用指定批评家表示的选项rlRepresentationOptions
.
criticOpts=rlRepresentationOptions(“LearnRate”1 e 03“梯度阈值”,1);
使用指定的深度神经网络创建批评家表示lgraph
和选项。还必须指定从环境界面获取的批评家的操作和观察信息。有关更多信息,请参阅rlQValueRepresentation
.
批评家=rlQValueRepresentation(lgraph、obsInfo、actInfo、,...“观察”,{“pendImage”,“成角的”},“行动”,{“扭矩”},批判者);
要创建DQN代理,首先使用rlDQNAgentOptions
.
agentOpts=rlDQNAgentOptions(...“UsedDoubledQn”错误的...“TargetUpdateMethod”,“平滑化”,...“目标平滑因子”,1e-3,...“经验缓冲长度”,1e6,...“折扣演员”,0.99,...“SampleTime”,环境运输署,...“MiniBatchSize”, 64);agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1 e-5;
然后,使用指定的critic表示和代理选项创建DQN代理。有关详细信息,请参阅rlDQNAgent
.
代理=rlDQNAgent(评论家、代理);
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
每次训练最多5000集,每集最多持续500步时间。
在“插曲管理器”对话框中显示培训进度(设置情节
选项)并禁用命令行显示(设置冗长的
选项错误的
).
当代理在默认的连续五次事件的窗口长度上获得大于-1000的平均累积奖励时,停止训练。在这一点上,代理可以快速平衡摆在直立的位置,使用最小的控制努力。
有关更多信息,请参见RL培训选项
.
培训选项=RL培训选项(...“MaxEpisodes”, 5000,...“MaxStepsPerEpisode”, 500,...“详细”错误的...“情节”,“训练进步”,...“停止培训标准”,“AverageReward”,...“停止训练值”, -1000);
在训练或模拟过程中,您可以使用情节
函数。
地块(环境)
训练代理人使用火车
函数。这是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理溺爱
来错误的
.要亲自培训特工,请设置溺爱
来符合事实的
.
doTraining=false;如果溺爱培训代理商。trainingStats =火车(代理,env, trainOpts);其他的%为示例加载预训练的代理。装载(“MATLABPendImageDQN.mat”,“代理”);终止
要验证经过训练的agent的性能,请在钟摆环境中对其进行模拟。有关agent模拟的更多信息,请参阅rlSimulationOptions
和模拟
.
simOptions = rlSimulationOptions (“MaxSteps”,500);经验=sim(环境、代理、sim选项);
totalReward =总和(experience.Reward)
总报酬=-888.9802