主要内容

rlACAgent

演员-评论家强化学习代理

描述

Actor-critic (AC)代理实现了诸如A2C和A3C这样的Actor-critic算法,这是一种无模型的、在线的、基于策略的强化学习方法。参与者-评论家代理直接优化策略(参与者),并使用评论家来估计回报或未来的奖励。动作空间可以是离散的,也可以是连续的。

有关更多信息,请参见Actor-Critic代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

根据观察和行动规格创建代理

例子

代理= rlACAgent (observationInfoactionInfo使用默认初始化选项,为具有给定观察和操作规范的环境创建参与者-评论家代理。代理中的行动者和评论家使用从观察规范构建的默认深度神经网络observationInfo以及动作规范actionInfo.的ObservationInfo而且ActionInfo的属性代理设置为observationInfo而且actionInfo分别输入参数。

例子

代理= rlACAgent (observationInfoactionInfoinitOpts使用给定的观察和操作规范为环境创建参与者-评论家代理。代理使用默认网络,其中每个隐藏的全连接层具有在initOpts对象。行动者-评论家代理不支持循环神经网络。金宝app有关初始化选项的详细信息,请参见rlAgentInitializationOptions

从演员和评论家创建代理

例子

代理= rlACAgent (演员评论家使用代理的默认选项,使用指定的参与者和评论家创建一个参与者-评论家代理。

指定代理选项

例子

代理= rlACAgent (___agentOptions创建一个演员评论代理并设置AgentOptions属性agentOptions输入参数。在前面语法中的任何输入参数之后使用此语法。

输入参数

全部展开

代理初始化选项,指定为rlAgentInitializationOptions对象。行动者-评论家代理不支持循环神经网络。金宝app

实现策略的参与者,指定为rlDiscreteCategoricalActorrlContinuousGaussianActor函数逼近对象。有关创建角色逼近器的详细信息,请参见创建策略和值函数

评论家估计贴现长期奖励,指定为rlValueFunction对象。有关创建临界逼近器的详细信息,请参见创建策略和值函数

属性

全部展开

观察规范,指定为强化学习规范对象或定义维度、数据类型和观察信号名称等属性的规范对象数组。

如果通过指定演员和评论家来创建代理,则ObservationInfo匹配参与者和评论家对象中指定的值。

你可以提取observationInfo从现有环境或代理中使用getObservationInfo.您还可以使用rlFiniteSetSpecrlNumericSpec

动作规范,作为强化学习规范对象指定,定义诸如维度、数据类型和动作信号的名称等属性。

对于离散动作空间,必须指定actionInfo作为一个rlFiniteSetSpec对象。

对于连续的动作空间,必须指定actionInfo作为一个rlNumericSpec对象。

如果通过指定演员和评论家来创建代理,则ActionInfo匹配参与者和评论家对象中指定的值。

你可以提取actionInfo从现有环境或代理中使用getActionInfo.您还可以使用rlFiniteSetSpecrlNumericSpec

代理选项,指定为rlACAgentOptions对象。

选项,在选择操作时使用探索策略,指定为以下逻辑值之一。

  • 真正的—选择动作时,使用基础代理探索策略。

  • —选择动作时使用base agent greedy策略。

试剂的取样时间,指定为正标量或-1.将此参数设置为-1允许基于事件的模拟。的价值SampleTime中指定的值AgentOptions

在Simulink金宝app中®环境中,RL代理块,在其中指定代理执行每个SampleTime秒模拟时间。如果SampleTime-1,块从它的父子系统继承采样时间。

在MATLAB中®环境时,每当环境前进时执行代理。在这种情况下,SampleTime输出经验中连续元素之间的时间间隔是否由返回sim卡火车.如果SampleTime-1,返回的输出体验中连续元素之间的时间间隔反映了触发代理执行的事件的时间。

对象的功能

火车 在指定的环境中训练强化学习代理
sim卡 在指定的环境中模拟训练好的强化学习代理
getAction 给定环境观测,从代理或行动者获得动作
getActor 从强化学习代理中得到actor
setActor 强化学习代理的集合角色
getCritic 从强化学习代理获得评论家
setCritic 强化学习代理集评论家
generatePolicyFunction 创建评估强化学习代理训练策略的函数

例子

全部折叠

创造一个具有离散动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境使用深度网络设计器创建代理,并使用图像观察进行训练.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。动作是一个有五个可能元素的标量(一个扭矩为-)2,101,或2Nm适用于秋千杆)。

负载百分比预定义环境环境= rlPredefinedEnv(“SimplePendulumWithImage-Discrete”);获得观察和行动规范obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

代理创建函数随机初始化演员网络和评论家网络。你可以通过固定随机生成器的种子来确保重现性。为此,取消注释下面的行。

% rng (0)

根据环境观察和操作规范创建参与者-评论家代理。

agent = rlACAgent(obsInfo,actInfo);

要检查代理,请使用getAction从随机观察中返回动作。

getAction(代理,{兰特(obsInfo (1) .Dimension),兰德(obsInfo (2) .Dimension)})
ans =1x1单元阵列{[2]}

现在可以在环境中测试和训练代理。

创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练DDPG Agent用图像观察摆动和平衡摆.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。动作是表示扭矩的标量,范围从-连续22Nm。

负载百分比预定义环境环境= rlPredefinedEnv(“SimplePendulumWithImage-Continuous”);获得观察和行动规范obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

创建一个代理初始化选项对象,指定网络中每个隐藏的全连接层必须具有128神经元(不是默认数量,256).行动者-评论家代理不支持循环网络,因此设置金宝appUseRNN选项真正的在创建代理时生成错误。

initOpts = rlAgentInitializationOptions“NumHiddenUnit”, 128);

代理创建函数随机初始化演员网络和评论家网络。你可以通过固定随机生成器的种子来确保重现性。为此,取消注释下面的行。

% rng (0)

根据环境观察和操作规范创建参与者-评论家代理。

agent = rlACAgent(obsInfo,actInfo,initOpts);

从行动者和评论家中提取深度神经网络。

actorNet = getModel(代理);criticNet = getModel(get批评家(代理));

显示批评网络的层,并验证每个隐藏的全连接层有128个神经元

criticNet。层
ans = 11x1带有图层的图层数组:1的concat串联连接2输入沿着维度1 2的relu_body ReLU ReLU 3“fc_body”完全连接128完全连接层4的body_output ReLU ReLU 5 input_1的图像输入50 x50x1图片6 conv_1卷积64 3 x3x1旋转步[1]和填充[0 0 0 0]7‘relu_input_1 ReLU ReLU 8“fc_1”完全连接128完全连接层9“input_2”功能输入1功能10“fc_2”完全连接128完全连接层11“输出”完全连接1完全连接层

情节演员和评论家网络

情节(layerGraph (actorNet))

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

情节(layerGraph (criticNet))

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

要检查代理,请使用getAction从随机观察中返回动作。

getAction(代理,{兰特(obsInfo (1) .Dimension),兰德(obsInfo (2) .Dimension)})
ans =1x1单元阵列{[0.9228]}

现在可以在环境中测试和训练代理。

创建一个具有离散动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练DQN人员平衡车杆系统.这个环境有一个四维的观察向量(车的位置和速度、极点角和极点角导数),以及一个具有两个可能元素的标量作用(力的任意一个-)10或+10N应用于购物车)。

负载百分比预定义环境环境= rlPredefinedEnv(“CartPole-Discrete”);%获得观测规格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)

创建一个深度神经网络,用作评论家内部的近似模型。对于行动者-评论家代理,评论家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。

criticNetwork = [featureInputLayer(prod(obsInfo.Dimension)),“归一化”“没有”) fullyConnectedLayer (1,“名字”“CriticFC”));

使用criticNetwork.演员评论家代理使用rlValueFunction对象来实现批评家。

批评家= rlValueFunction(criticNetwork,obsInfo);

为评论家设置一些训练选项。

criticOpts = rlOptimizerOptions(...“LearnRate”, 8 e - 3,“GradientThreshold”1);

创建一个深度神经网络,用作actor内的近似模型。对于行为批评代理,行为者执行随机策略,对于离散行为空间,由离散类别行为者执行随机策略。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层必须拥有与可能的操作数量一样多的元素。

actorNetwork = [featureInputLayer(prod(obsInfo.Dimension)),“归一化”“没有”) fullyConnectedLayer(元素个数(actInfo.Dimension),“名字”“行动”));

使用以下命令创建参与者actorNetwork.演员评论家代理使用rlDiscreteCategoricalActor对象来实现离散操作空间的参与者。

actor = rlDiscreteCategoricalActor(actorNetwork,obsInfo,actInfo);

为演员设置一些训练选项。

actorOpts = rlOptimizerOptions(...“LearnRate”, 8 e - 3,“GradientThreshold”1);

指定代理选项,并使用参与者和评论家创建AC代理。

agentOpts = rlACAgentOptions(...“NumStepsToLookAhead”32岁的...“DiscountFactor”, 0.99,...“CriticOptimizerOptions”criticOpts,...“ActorOptimizerOptions”, actorOpts);agent = rlACAgent(演员,评论家,agentOpts)
agent = rlACAgent with properties: AgentOptions: [1x1 rl.option.]rlACAgentOptions] UseExplorationPolicy: 1 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlFiniteSetSpec] SampleTime: 1

要检查代理,请使用getAction从随机观察中返回动作。

getAction(代理,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[-10]}

现在可以在环境中测试和训练代理。

创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载双积分器连续动作空间环境所使用的实例训练DDPG Agent控制双积分系统

负载百分比预定义环境环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);%获得观测规格obsInfo = getObservationInfo(env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf名称:"states"描述:"x, dx"维度:[2 1]数据类型:"double"
%获取动作规范getActionInfo(env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf名称:"force"描述:[0x0 string]维度:[1 1]数据类型:"double"

在这个例子中,动作是一个标量输入,表示一个范围为-的力22因此,相应设置动作信号的上限和下限是一个好主意,这样我们在构建行为者网络时就可以很容易地检索到它们。

确保动作空间上限和下限是有限的actInfo.LowerLimit = 2;actInfo.UpperLimit = 2;

演员网络和评论家网络是随机初始化的。你可以通过固定随机生成器的种子来确保重现性。

rng (0)

创建一个深度神经网络,用作评论家内部的近似模型。对于行动者-评论家代理,评论家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。

criticNet = [featureInputLayer(prod(obsInfo.Dimension)),...“归一化”“没有”“名字”“状态”) fullyConnectedLayer (10“名字”“fc_in”) reluLayer (“名字”“relu”) fullyConnectedLayer (1,“名字”“出”));

使用criticNet.演员评论家代理使用rlValueFunction对象来实现批评家。

评论= rlValueFunction(批评网,obsInfo);

为评论家设置一些训练选项。

criticOpts = rlOptimizerOptions(...“LearnRate”, 8 e - 3,“GradientThreshold”1);

创建一个深度神经网络,用作actor内的近似模型。对于行为批评代理,行为者执行随机策略,对于连续动作空间则由连续高斯行为者实现。在这种情况下,网络必须将观察信号作为输入,并为每个动作返回平均值和标准偏差值。因此,它必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。

注意,标准偏差必须是非负的,平均值必须落在动作的范围内。因此,返回标准差的输出层必须是softplus或ReLU层,以强制非负性,而返回平均值的输出层必须是缩放层,以将平均值缩放到输出范围。

%输入路径层inPath = [featureInputLayer(prod(obsInfo.Dimension)),...“归一化”“没有”“名字”“netObsIn”) fullyConnectedLayer (prod (actInfo.Dimension),...“名字”“infc”));%路径层为平均值meanPath = [tanhLayer(“名字”“tanhMean”);fullyConnectedLayer(刺激(actInfo.Dimension));scalingLayer (“名字”“规模”...“规模”actInfo.UpperLimit)];范围比例%%路径层为标准偏差sdevPath = [tanhLayer(“名字”“tanhStdv”);fullyConnectedLayer(刺激(actInfo.Dimension));softplusLayer (“名字”“splus”));%非负为网络对象添加层net = layerGraph(inPath);net = addLayers(net,meanPath);net = addLayers(net,sdevPath);%连接层net = connectLayers(net,“infc”“tanhMean /”);net = connectLayers(net,“infc”“tanhStdv /”);百分比图网络情节(净)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

使用以下命令创建参与者.演员评论家代理使用rlContinuousGaussianActor对象来实现连续操作空间的参与者。

actor = rlContinuousGaussianActor(net, obsInfo, actInfo,...“ActionMeanOutputNames”“规模”...“ActionStandardDeviationOutputNames”“splus”...“ObservationInputNames”“netObsIn”);

为演员设置一些训练选项。

actorOpts = rlOptimizerOptions(...“LearnRate”, 8 e - 3,“GradientThreshold”1);

指定代理选项,并使用actor、批评家和代理选项创建AC代理。

agentOpts = rlACAgentOptions(...“NumStepsToLookAhead”32岁的...“DiscountFactor”, 0.99,...“CriticOptimizerOptions”criticOpts,...“ActorOptimizerOptions”, actorOpts);agent = rlACAgent(演员,评论家,agentOpts)
agent = rlACAgent with properties: AgentOptions: [1x1 rl.option.]rlACAgentOptions] UseExplorationPolicy: 1 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlNumericSpec] SampleTime: 1

要检查代理,请使用getAction从随机观察中返回动作。

getAction(代理,{兰德(2,1)})
ans =1x1单元阵列{[1.6791]}

现在可以在环境中测试和训练代理。

类所使用的预定义环境训练DQN人员平衡车杆系统的例子。

环境= rlPredefinedEnv(“CartPole-Discrete”);

获取观察和行动信息。这个环境有一个四维观测向量(车的位置和速度、极角和极角导数),以及一个包含两个可能元素的标量动作(施加在车上的-10或+10 N的力)。

obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

代理创建函数随机初始化演员网络和评论家网络。你可以通过固定随机生成器的种子来确保重现性。

rng (0)

创建一个深度神经网络,用作评论家内部的近似模型。对于行动者-评论家代理,评论家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。要创建循环神经网络,请使用sequenceInputLayer作为输入层并包含一个lstmLayer作为其他网络层之一。

criticNetwork = [sequenceInputLayer(prod(obsInfo.Dimension)),...“归一化”“没有”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) fullyConnectedLayer (1,“名字”“CriticFC”));

使用criticNetwork.演员评论家代理使用rlValueFunction对象来实现批评家。

批评家= rlValueFunction(criticNetwork,obsInfo);

为评论家设置一些训练选项。

criticOpts = rlOptimizerOptions(...“LearnRate”, 8 e - 3,“GradientThreshold”1);

创建一个神经网络,用作角色内的近似模型。既然评论家有一个循环网络,那么演员也一定有一个循环网络。对于行为批评代理,行为者执行随机策略,对于离散行为空间,由离散类别行为者执行随机策略。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层必须拥有与可能的操作数量一样多的元素。

actorNetwork = [sequenceInputLayer(prod(obsInfo.Dimension)),“归一化”...“没有”“名字”“myobs”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) fullyConnectedLayer(元素个数(actInfo.Elements),“名字”“行动”));

使用以下命令创建参与者actorNetwork.演员评论家代理使用rlDiscreteCategoricalActor对象来实现离散操作空间的参与者。

actor = rlDiscreteCategoricalActor(actorNetwork,obsInfo,actInfo);

为演员设置一些训练选项。

actorOpts = rlOptimizerOptions(...“LearnRate”, 8 e - 3,“GradientThreshold”1);

指定代理选项,并使用参与者、评论家和代理选项对象创建AC代理。由于代理使用循环神经网络,NumStepsToLookAhead作为训练轨迹长度。

agentOpts = rlACAgentOptions(...“NumStepsToLookAhead”32岁的...“DiscountFactor”, 0.99,...“CriticOptimizerOptions”criticOpts,...“ActorOptimizerOptions”, actorOpts);agent = rlACAgent(actor,批评家,agentOpts);

要检查代理,请使用getAction从随机观察中返回动作。

getAction(代理,{兰德(obsInfo.Dimension)})
ans =1×1单元格数组{[-10]}

现在可以在环境中测试和训练代理。

提示

  • 对于连续的动作空间,使用rlACAgent对象不强制操作规范设置的约束,因此必须在环境中强制操作空间约束。

版本历史

在R2019a中引入