主要内容

rlDiscreteCategoricalActor

具有离散动作空间的随机分类actor强化学习代理

描述

该对象实现了一个函数逼近器,用作具有离散动作空间的强化学习代理中的随机actor。离散分类行为者将环境状态作为输入,并将期望累积长期奖励的分类(也称为多努利)概率分布中的随机行为作为输出返回,从而实现随机策略。在创建一个rlDiscreteCategoricalActor对象,使用它创建合适的代理,例如rlACAgentrlPGAgent.有关创建表示的详细信息,请参见创建策略和值函数

创建

描述

例子

演员= rlDiscreteCategoricalActor (observationInfoactionInfo使用深度神经网络创建一个具有离散动作空间的随机角色作为函数逼近器。对于这个演员来说,actionInfo必须指定一个离散操作空间。网络输入层根据中尺寸规范自动与环境观测通道关联observationInfo.网络必须有一个单一的输出层,其中的元素与可能的离散动作的数量一样多actionInfo.此函数设置ObservationInfo而且ActionInfo的属性演员对于输入observationInfo而且actionInfo,分别。

请注意

演员不强制操作规范设置的约束;因此,在使用此actor时,必须在环境中强制执行操作空间约束。

例子

演员= rlDiscreteCategoricalActor (observationInfoactionInfoObservationInputNames =netObsNames指定与环境观测通道关联的网络输入层的名称。该功能按顺序分配中指定的每个环境观测通道observationInfo到字符串数组中对应名称指定的层netObsNames.因此,在网络输入层中,按名称顺序排列netObsNames,必须具有与观测规范相同的数据类型和尺寸observationInfo

例子

演员= rlDiscreteCategoricalActor ({basisFcnW0},observationInfoactionInfo使用自定义基函数作为基础逼近器创建一个离散空间随机actor。第一个输入参数是一个双元素单元格数组,其第一个元素是句柄basisFcn到一个自定义基函数,其第二元素是初始权值矩阵W0.此函数设置ObservationInfo而且ActionInfo的属性演员对于输入observationInfo而且actionInfo,分别。

演员= rlDiscreteCategoricalActor (___UseDevice =useDevice对象上执行计算操作所使用的设备演员对象,并设置UseDevice的属性演员useDevice输入参数。您可以将此语法用于前面的任何输入-参数组合。

输入参数

全部展开

深度神经网络用作行动者内部的底层逼近器,指定为以下之一:

请注意

在不同的网络表示选项中,dlnetwork首选,因为它具有内置的验证检查并支持自动区分。金宝app如果传递另一个网络对象作为输入参数,它将在内部转换为dlnetwork对象。但是,最佳实践是将其他表示转换为dlnetwork显式地之前使用它来为强化学习代理创建评论家或参与者。你可以用dlnet = dlnetwork(净),在那里是任何深度学习工具箱™神经网络对象。由此产生的dlnetdlnetwork你用来评价你的评论家或演员的对象。这种做法允许对转换不直接且可能需要额外规范的情况进行更深入的了解和控制。

该网络必须有环境观测通道作为输入,并有一个单一的输出层,其元素与可能的离散动作数量一样多。由于网络的输出必须表示执行每个可能动作的概率,软件自动添加一个softmaxLayer作为最终输出层,如果您没有显式地指定它。在计算操作时,参与者然后随机采样分布以返回操作。

rlDiscreteCategoricalActor对象支持循环深度金宝app神经网络。有关示例,请参见从深度循环神经网络创建离散分类Actor

actor的可学习参数是深度神经网络的权值。有关深度神经网络层的列表,请参见深度学习层列表.有关创建用于强化学习的深度神经网络的更多信息,请参见创建策略和值函数

网络输入层名称对应于环境观测通道,指定为字符串数组或单元格数组的字符向量。当你用这个论证之后“ObservationInputNames”,该功能按顺序分配中指定的每个环境观测通道observationInfo到由字符串数组中相应名称指定的每个网络输入层netObsNames.因此,在网络输入层中,按名称顺序排列netObsNames,必须具有与观测规范相同的数据类型和尺寸observationInfo

请注意

中指定的信息的observationInfo,该函数只使用每个通道的数据类型和维度,而不使用通道的(可选)名称或描述。

例子:{“NetInput1_airspeed”、“NetInput2_altitude”}

自定义基函数,指定为用户定义的MATLAB函数的函数句柄。用户定义的函数可以是匿名函数,也可以是MATLAB路径上的函数。基于当前观察要采取的行动的数量,即行动者的输出,是从具有概率的分类分布中随机抽样的p = softmax(W'*B),在那里W权重矩阵是否包含可学习参数和B由自定义基函数返回的列向量。的每个元素p表示从观察到的状态执行相应操作的概率。

基函数必须具有以下特征。

B = myBasisFunction(obs1,obs2,…,obsN)

在这里,obs1obsN输入的顺序、数据类型和维度是否与中定义的环境观测通道相同observationInfo

例子:@ (obs1 obs2 obs3) [obs3 (2) * obs1 (1) ^ 2;abs (obs2 (5) + obs3 (1)))

基函数权值的初始值W,指定为一个矩阵,其行数与基函数返回的向量的长度相同,列数与动作空间的维数相同。

属性

全部展开

观察规范,规定为rlFiniteSetSpecrlNumericSpec对象或此类对象的数组。这些对象定义了观测信号的维度、数据类型和名称等属性。

rlDiscreteCategoricalActor设置ObservationInfo的属性演员对于输入observationInfo

你可以提取ObservationInfo从现有环境或代理中使用getObservationInfo.您还可以手动构造规范。

动作规范,指定为rlFiniteSetSpec对象。该对象定义环境操作通道的属性,如维度、数据类型和名称。注意,该函数没有使用中指定的动作通道的名称actionInfo

请注意

只允许一个动作通道。

rlDiscreteCategoricalActor设置ActionInfo的属性评论家对于输入actionInfo

你可以提取ActionInfo从现有环境或代理中使用getActionInfo.您还可以手动构造规范。

用于在训练和模拟过程中进行梯度计算、参数更新和预测等操作的计算设备,指定为“cpu”“图形”

“图形”选项需要并行计算工具箱™软件和CUDA®使英伟达®GPU。有关支持的图形处理器的更多信息,请参见金宝appGPU计算要求(并行计算工具箱)

你可以使用gpuDevice(并行计算工具箱),查询或选择要使用MATLAB的本地GPU设备®

请注意

在GPU上训练或模拟代理涉及特定于设备的数值舍入错误。与在CPU上执行相同的操作相比,这些错误会产生不同的结果。

要通过在多个核上使用并行处理来加速训练,不需要使用此参数。相反,在训练你的代理时,使用rlTrainingOptions对象,其中UseParallel选项设置为真正的.有关使用多核处理器和gpu进行训练的更多信息,请参见使用并行计算和图形处理器训练代理

例子:“图形”

对象的功能

rlACAgent 演员-评论家强化学习代理
rlPGAgent 策略梯度强化学习代理
rlPPOAgent 近端策略优化强化学习代理
getAction 从给定环境观察的代理、参与者或策略对象获取操作
评估 给定观测(或观测-动作)输入数据,求函数逼近对象
梯度 给定观测和动作输入数据,求函数逼近对象的梯度
加速 基于神经网络的逼近对象梯度加速计算选项
getLearnableParameters 从代理、函数逼近器或策略对象获取可学习的参数值
setLearnableParameters 设置agent、函数逼近器或策略对象的可学习参数值
setModel 为演员或评论家设置函数逼近模型
getModel 从演员或评论家那里得到函数逼近器模型

例子

全部折叠

创建一个观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。对于本例,将观测空间定义为连续的四维空间,这样单个观测值就是包含四个double的列向量。

obsInfo = rlNumericSpec([4 1]);

创建一个操作规范对象(或者使用getActionInfo从环境中提取规范对象)。对于本例,将操作空间定义为由三个值-组成100,10

actInfo = rlFiniteSetSpec([-10 0 10]);

为了在参与者中近似策略,使用深度神经网络。

网络的输入必须接受一个四元向量(刚刚定义的观察向量obsInfo),其输出必须是一个三元素向量。输出向量的每个元素必须在0到1之间,因为它表示执行三个可能操作中的每一个的概率(由actInfo).使用softmax作为输出层可以实现这一需求(软件会自动添加一个softmaxLayer作为最终输出层(如果你没有明确指定的话)。在计算操作时,参与者然后随机采样分布以返回操作。

创建一个作为层对象数组的神经网络。

net = [featureInputLayer(4) fullyConnectedLayer(3)];

将网络转换为adlnetwork对象,并显示可学习参数的数量。

Net = dlnetwork(Net);总结(净)
初始化:true可学习的数量:15输入:1 '输入' 4个特征

使用rlDiscreteCategoricalActor,利用网络,对观察对象和动作进行规范。当网络有多个输入层时,根据输入层中的维度规范自动与环境观测通道关联obsInfo

actor = rlDiscreteCategoricalActor(net,obsInfo,actInfo);

要检查角色,请使用getAction在给定当前网络权重的情况下,从随机观察向量返回一个动作。

act = getAction(actor,{rand(obsInfo.Dimension)});行为
行动=1x1单元阵列{[0]}

现在可以使用参与者创建合适的代理,例如rlACAgent,或rlPGAgent

创建一个观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。对于本例,将观测空间定义为连续的四维空间,这样单个观测值就是包含四个double的列向量。

obsInfo = rlNumericSpec([4 1]);

创建一个操作规范对象(或者使用getActionInfo从环境中提取规范对象)。对于本例,将操作空间定义为由三个值-组成100,10

actInfo = rlFiniteSetSpec([-10 0 10]);

要在参与者中近似策略,请使用神经网络。

网络的输入(这里称为netOin)必须接受一个四元向量(观察向量是由obsInfo),以及它的输出(这里称为actionProb)必须是一个三元向量。输出向量的每个元素必须在0到1之间,因为它表示执行三个可能操作中的每一个的概率(由actInfo).使用softmax作为输出层可以实现这一要求(但是,软件会自动添加一个softmaxLayer作为最终输出层(如果你没有明确指定的话)。在计算操作时,参与者然后随机采样分布以返回操作。

创建一个网络作为层对象的数组。为输入层指定一个名称,以便稍后可以显式地将其与观察通道关联起来。

net = [featureInputLayer(4,Name=“netOin”(3) softmaxLayer(Name= .“actionProb”));

将网络转换为adlnetwork对象,并显示可学习参数(权重)的数量。

Net = dlnetwork(Net);总结(净)
初始化:true学习数量:15输入:1 'netOin' 4个特征

使用rlDiscreteCategoricalActor,使用网络、观察和动作规范对象,以及网络输入层的名称。

actor = rlDiscreteCategoricalActor(net,...obsInfo actInfo,...观察=“netOin”);

要验证您的参与者,请使用getAction在给定当前网络权重的情况下,从随机观察中返回一个操作。

act = getAction(actor,{rand(obsInfo.Dimension)});行为{1}
Ans = 0

要返回作为随机观察的函数的可能操作的概率分布,并给定当前网络权重,使用评估

prb = evaluate(actor,{rand(obsInfo.Dimension)})
复审委员会=1x1单元阵列{3 x1单}
复审委员会{1}
ans =3x1单列向量0.5606 0.2619 0.1776

现在可以使用参与者创建合适的代理,例如rlACAgent,或rlPGAgent

创建一个观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。在本例中,将观测空间定义为由两个通道组成,第一个通道是连续空间中的二维向量,第二个通道是只能假设三个值的二维向量,-[11]、[00],及[11].因此,一次观测由两个二维向量组成,一个是连续的,另一个是离散的。

obsInfo = [rlNumericSpec([2 1]) rlFiniteSetSpec({-[1 1],[0 0],[1 1]})];

创建一个离散作用空间规范对象(或者使用getActionInfo从具有离散操作空间的环境中提取规范对象)。对于本例,将动作空间定义为一个有限集,由三个可能的值(命名为75,3.在这种情况下)。

actInfo = rlFiniteSetSpec([7 5 3]);

创建一个自定义基函数。每个元素都是由定义的观测值的函数obsInfo

myBasisFcn = @(obsC,obsD) [obsC(1)^2-obsD(2)^2;obsC (2) ^ 2-obsD (1) ^ 2;exp (obsC (2)) + abs (obsD (1));exp (obsC (1)) + abs (obsD (2)];

中定义的操作之一就是actor的输出actInfo,对应于元素softmax (W * myBasisFcn (obsC obsD))哪个值最高。W是一个权重矩阵,包含可学习的参数,其行数必须与基函数输出的长度相同,列数必须与可能的操作数相同。

定义一个初始参数矩阵。

W0 = rand(4,3);

创建参与者。第一个参数是一个包含自定义函数句柄和初始参数矩阵的双元素单元格。第二个和第三个参数分别是观察和操作规范对象。

actor = rlDiscreteCategoricalActor({myBasisFcn,W0},obsInfo,actInfo);

来检查您的角色getAction函数返回三种可能的操作之一,这取决于给定的随机观察和当前参数矩阵。

getAction(演员,{兰德(2,1),[1]})
ans =1x1单元阵列{[3]}

注意,没有强制使用离散集约束。

getAction(演员,{兰德(2,1),[0.5 - -0.7]})
ans =1x1单元阵列{[3]}

您现在可以使用参与者(以及评论家)来创建合适的离散动作空间代理(例如rlACAgentrlPGAgent,或rlPPOAgent).

这个例子向您展示了如何使用循环神经网络创建具有离散动作空间的随机actor。你也可以用递归神经网络来处理连续随机参与者。

对于本例,使用与训练PG代理人平衡车杆系统.加载环境并获得观察和动作规范。

环境= rlPredefinedEnv(“CartPole-Discrete”);obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

为了在参与者中近似策略,使用循环深度神经网络。

创建一个作为层对象数组的神经网络。要创建循环网络,请使用sequenceInputLayer作为输入层(尺寸与观测通道的维数相等),并包含至少一个lstmLayer

为输入层指定一个名称,以便稍后可以显式地将其与观察通道关联起来。

net = [sequenceInputLayer(...刺激(obsInfo.Dimension),...Name =“netOin”) fulllyconnectedlayer (8) reluLayer lstmLayer(8,OutputMode=“序列”) fullyConnectedLayer (...元素个数(actInfo.Elements));

将网络转换为adlnetwork对象,并显示可学习参数(权重)的数量。

Net = dlnetwork(Net);总结(净)
初始化:true可学习数量:602输入:1 'netOin' 4维序列输入

使用网络、环境规范和与观察通道相关联的网络输入层的名称创建一个离散的分类参与者。

actor = rlDiscreteCategoricalActor(net,...obsInfo actInfo,...观察=“netOin”);

检查您的角色使用情况getAction根据给定的随机观察和当前网络权重,返回两种可能的操作之一。

act = getAction(actor,{rand(obsInfo.Dimension)});行为{1}
Ans = -10

要返回两个可能动作的概率,请使用评估.注意,返回的数字类型是,而不是

prob = evaluate(actor,{rand(obsInfo.Dimension)});概率{1}
ans =2x1个单列向量0.4704 - 0.5296

你可以使用getState而且设置状态提取并设置角色中循环神经网络的当前状态。

getState(演员)
ans =2×1单元格数组{8x1 single} {8x1 single}
actor = setState(actor,...{-0.01 *单(兰德(8,1)),...0.01 *单(兰德(8,1))});

要使用顺序观察来评估参与者,请使用序列长度(时间)维度。例如,获取5个独立序列的动作,每个序列由9连续观测。

[action,state] = getAction(actor,状态)...{兰德([obsInfo。尺寸5 9])});

在第四个序列中显示观测序列的第七个元素对应的动作。

动作=动作{1};行动(1、1、4、7)
Ans = 10

显示循环神经网络的更新状态。

状态
状态=2×1单元格数组{8x5单}{8x5单}

有关循环神经网络输入和输出格式的更多信息,请参阅的算法部分lstmLayer

您现在可以使用参与者(以及评论家)来创建合适的离散动作空间代理(例如rlACAgentrlPGAgent,或rlPPOAgent).

版本历史

R2022a中引入