此示例显示如何创建一个可以播放的深度Q学习网络(DQN)代理,并在Matlab®中平衡模型的摆锤。在此示例中,您使用使用DQN代理深网络设计师。有关DQN代理的详细信息,请参阅深度Q-Network代理商。
这个例子的强化学习环境是一个简单的摩擦摆在一个向下的位置开始挂起。培训目标是使钟摆向上直立不翻倒使用最少的控制工作。
对于这个环境:
向上平衡摆位置0.
弧度和向下悬挂的位置是PI
弧度。
来自代理到环境的扭矩动作信号来自-2至2 n·m。
从环境观测得到的是简化的钟摆灰度图像和钟摆角导数。
奖励 ,在每个时间步骤中提供,是
这里:
是从直立位置的位移角度。
是位移角的导数。
是前一步的控制力。
有关此模型的更多信息,请参阅培训DDPG代理以摇摆和平衡摆动图像观察。
创建摆在预定环境接口。
ENV = rlPredefinedEnv(“SimplePendulumWithImage离散”);
界面有两个观察。第一次观察,命名为“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”
该接口有一个离散的动作空间,其中所述试剂可以应用五个可能的扭矩值,以摆锤之一:-2,-1,0,1或2个N·m以下。
actInfo = getActionInfo(ENV)
actInfo = rlFiniteSetSpec与性质:元素:[-2 -1 0 1 2]名称: “扭矩” 描述:[为0x0字符串]尺寸:[1 1]数据类型: “双”
修复随机发生器种子以进行再现性。
RNG(0)
DQN代理使用批评价值函数表示来估计长期奖励,给定观察和行动。对于这种环境,评论家是一个深度神经网络,具有三个输入(两个观察和一个动作)和一个输出。有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和值函数表示。
您可以通过构建评论家网络交互深网络设计师要做到这一点,你首先要为每个观察和动作创建单独的输入路径。这些路径从它们各自的输入中学习较低级别的特性。然后创建一个公共输出路径,该路径将来自输入路径的输出组合起来。
创建图像观测路径
要创建图像观察路径,第一阻力的imageInputlayer.
来自图书馆库窗格到画布。设置图层InputSize到50,50,1
用于图像的观察,和集正常化到没有任何
。
二,拖动一个Convolution2Dlayer.
到画布并将该层的输入连接到I的输出mageInputLayer
。创建卷积层2
过滤器(NumFilters属性),其具有的高度和宽度的10.
(FilterSize财产),并使用一步5.
在水平和垂直方向(步行财产)。
最后,完成图像路网两套抵押者
和fullyConnectedLayer
层。第一和第二的输出大小fullyConnectedLayer
层是分别400和300。
创建所有输入路径和输出路径
以类似的方式构造其他输入路径和输出路径。对于此示例,请使用以下选项。
角速度路径(标量输入):
imageInputlayer.
- 放InputSize到1,1
和正常化到没有任何
。
fullyConnectedLayer
- 放OutputSize到400
。
抵押者
fullyConnectedLayer
- 放OutputSize到300
。
操作路径(标量输入):
imageInputlayer.
- 放InputSize到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”那“正常化”那“没有任何”10) convolution2dLayer ([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,“姓名”那“stateValue”));lgraph = addLayers (lgraph tempLayers);lgraph = connectLayers(lgraph,“torque_fc1”那“添加/立方英寸”);lgraph = connectLayers(lgraph,“批评_theta_fc2”那“添加/ IN1”);lgraph = connectLayers(lgraph,“dtheta_fc2”那“添加/平方英寸”);
查看评论家的网络配置。
图绘图(LGROP)
指定使用评论家表示选项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',1E-3,......'ExperienceBufferLength',1E6,......'DiscountFactor',0.99,......'采样时间',env.Ts,......'minibatchsize',64);代理.epsilongredyexpliation.epsilondecay = 1e-5;
然后,使用指定评论家表示和代理选项创建DQN剂。有关更多信息,请参阅rlDQNAgent
。
剂= rlDQNAgent(评论家,agentOpts);
要培训代理,首先指定培训选项。对于此示例,请使用以下选项。
运行最多5000个集每次训练,每次发作持续至多500层的步骤。
在Episode Manager对话框中显示培训进度(设置绘图
选项)和禁用命令行显示(设定详细
选项错误的
)。
当代理在默认的连续五次事件的窗口长度上获得大于-1000的平均累积奖励时,停止训练。在这一点上,代理可以快速平衡摆在直立的位置,使用最小的控制努力。
有关更多信息,请参阅rlTrainingOptions
。
trainOpts = rlTrainingOptions(......'maxepisodes',5000,......“MaxStepsPerEpisode”,500,......'verbose',错误的,......“情节”那'培训 - 进步'那......'StopTrainingCriteria'那'AverageReward'那......'StopTrainingValue',-1000);
您可以通过使用培训或模拟期间可视化摆动系统阴谋
功能。
图(ENV)
训练代理人使用火车
功能。这是一个计算密集的进程,需要几个小时才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理doTraining
到错误的
。为了训练自己的代理,集doTraining
到真的
。
doTraining = FALSE;如果doTraining%训练代理人。Trainstats =火车(代理,env,训练);别的%负载净化代理。加载('MATLABPendImageDQN.mat'那'代理人');结尾
为了验证训练有素剂的性能,模拟它摆环境中。有关代理仿真的更多信息,请参阅rlSimulationOptions
和SIM卡
。
simOptions = rlSimulationOptions (“MaxSteps”,500);经验= SIM(ENV,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = -888.9802