主要内容

rlVectorQValueFunction

向量q值函数逼近强化学习代理

描述

该对象实现了一个向量q值函数逼近器,您可以将其用作强化学习代理的离散动作空间的评论家。向量q值函数是将环境状态映射到一个向量上的函数,其中每个元素表示智能体从给定状态出发,执行与元素编号对应的动作时预测的折现累积长期奖励。因此,q值函数评论家只需要环境状态作为输入。在创建一个rlVectorQValueFunction评论家,用它来创建一个代理如rlQAgentrlDQNAgentrlSARSAAgentrlDDPGAgent,或rlTD3Agent.有关创建表示的详细信息,请参见创建策略和值函数

创建

描述

例子

评论家= rlVectorQValueFunction (observationInfoactionInfo创建多输出核反应能量函数评论家与一个离散作用空间.在这里,深度神经网络被用作近似器,并且必须只有观察数据作为输入,并且单个输出层具有与可能的离散动作数量相同的元素。网络输入层根据中尺寸规范自动与环境观测通道关联observationInfo.此函数设置ObservationInfo而且ActionInfo的属性评论家observationInfo而且actionInfo分别输入参数。

例子

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

例子

评论家= rlVectorQValueFunction ({basisFcnW0},observationInfoactionInfo创建多输出核反应能量函数评论家与一个离散作用空间使用自定义基函数作为底层逼近器。第一个输入参数是一个双元素单元格数组,其第一个元素是句柄basisFcn到一个自定义基函数,其第二元素是初始权值矩阵W0.这里基函数必须只有观测值作为输入,并且W0必须有与可能的操作数量一样多的列。函数设置ObservationInfo而且ActionInfo的属性评论家输入参数observationInfo而且actionInfo,分别。

评论家= rlVectorQValueFunction (___UseDevice =useDevice属性的计算所使用的设备评论家对象,并设置UseDevice的属性评论家useDevice输入参数。您可以将此语法用于前面的任何输入-参数组合。

输入参数

全部展开

深度神经网络用作底层逼近器内的评论家,指定为以下之一:

请注意

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

该网络必须只有观测通道作为输入,而单个输出层必须具有与可能的离散动作数量相同的元素。输出向量的每个元素都近似于从当前观察到的状态开始执行相应操作的值。

rlQValueFunction对象支持循环深度神经网络。

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

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

请注意

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

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

自定义基函数,指定为用户定义的MATLAB函数的函数句柄。用户定义的函数可以是匿名函数,也可以是MATLAB路径上的函数。评论家的输出就是向量c = W'*B,在那里W矩阵是否包含可学习参数,和B由自定义基函数返回的列向量。的每个元素一个从观察到的状态近似执行相应操作的值。

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

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

在这里,obs1obsN中定义的通道是否具有相同的输入顺序和相同的数据类型和维度observationInfo

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

基函数权值的初始值W,指定为一个矩阵,其行数与基函数输出向量的长度相同,列数与可能的操作数相同。

属性

全部展开

观察规范,规定为rlFiniteSetSpecrlNumericSpec对象或包含此类对象的组合的数组。数组中的每个元素都定义了环境观察通道的属性,比如维度、数据类型和名称。注意,软件只使用频道的数据类型和维度来创建演员或评论家,而不使用频道的(可选的)名称。

rlVectorQValueFucntion设置ObservationInfo的属性评论家输入参数observationInfo

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

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

请注意

只允许一个动作通道。

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

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

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

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

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

请注意

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

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

例子:“图形”

对象的功能

rlDQNAgent 深度q网络(Deep Q-network, DQN)强化学习剂
rlQAgent Q-learning强化学习代理
rlSARSAAgent SARSA强化学习剂
getValue 根据环境观察和行动,从评论家那里获得估计值
getMaxQValue 在给定环境观测的情况下,从具有离散动作空间的q值函数评论家获得所有可能动作的最大估计值
评估 给定观测(或观测-动作)输入数据,求函数逼近对象
梯度 给定观测和动作输入数据,求函数逼近对象的梯度
加速 基于神经网络的逼近对象梯度加速计算选项
getLearnableParameters 从代理、函数逼近器或策略对象获取可学习的参数值
setLearnableParameters 设置agent、函数逼近器或策略对象的可学习参数值
setModel 为演员或评论家设置函数逼近模型
getModel 从演员或评论家那里得到函数逼近器模型

例子

全部折叠

这个例子展示了如何使用深度神经网络逼近器为离散动作空间创建向量q值函数评论家。

这个评论家只把观察作为输入,并产生一个包含尽可能多的元素的向量作为输出。当智能体从给定的观察开始,并采取与元素在输出向量中的位置相对应的行动时,每个元素表示预期的累积长期奖励。

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

obsInfo = rlNumericSpec([4 1]);

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

actInfo = rlFiniteSetSpec([7 5 3]);

为了在评论家中近似q值函数,使用深度神经网络。网络的输入必须接受由定义的四元向量obsInfo.输出必须是一个单独的输出层,其元素数量与可能的离散操作数量相同(在本例中为三个,由actInfo).

创建一个神经网络作为层对象的行向量。

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

将网络转换为adlnetwork对象。

Net = dlnetwork(Net);

总结网络特性。

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

使用网络创建评论家,以及观察和操作规范对象。网络输入层根据中尺寸规范自动与观测信号的分量相关联obsInfo

rlVectorQValueFunction(net,obsInfo,actInfo)
评论= rlVectorQValueFunction与属性:ObservationInfo: [1x1 rl.util.]rlNumericSpec] ActionInfo: [1x1 rl.util.]rlFiniteSetSpec] UseDevice: "cpu"

检查你的评论,使用getValue使用当前网络权重返回随机观测值。对于这三个可能的操作,每个操作都有一个值。

v = getValue(批评家,{rand(obsInfo.Dimension)})
v =3x1单列向量0.7232 0.8177 -0.2212

您现在可以使用评论家(以及参与者)来创建依赖q值函数评论家的离散动作空间代理(例如rlQAgentrlDQNAgent,或rlSARSAAgent).

向量q值函数评论家只将观察结果作为输入,并产生一个具有尽可能多的元素的向量作为输出。当智能体从给定的观察开始,并采取与元素在输出向量中的位置相对应的行动时,每个元素表示预期的累积长期奖励。

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

obsInfo = rlNumericSpec([4 1]);

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

actInfo = rlFiniteSetSpec([7 5 3]);

为了在评论家中近似q值函数,使用深度神经网络。网络的输入必须接受由定义的四元向量obsInfo.输出必须是一个单独的输出层,其元素数量与可能的离散操作数量相同(在本例中为三个,由actInfo).

创建网络作为层对象的数组。命名网络输入netObsIn(这样以后就可以显式地将它与观测输入通道相关联)。

net = [featureInputLayer(4,Name=“netObsIn”) fullyConnectedLayer (Name =“价值”));

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

Net = dlnetwork(Net)
net = dlnetwork with properties: Layers: [2x1 nnet.cnn.layer.Layer] Connections: [1x2 table] Learnables: [2x3 table] State: [0x3 table] InputNames: {'netObsIn'} OutputNames: {'value'} Initialized: 1查看summary with summary。
总结(净)
Initialized: true learning Number of learnables: 15 input: 1 'netObsIn' 4个feature

使用网络、观察规范对象和网络输入层的名称创建评论家。指定的网络输入层,netObsIn,与环境观测相关联,因此必须与中指定的观测通道具有相同的数据类型和维度obsInfo

rlVectorQValueFunction(net,...obsInfo actInfo,...ObservationInputNames =“netObsIn”
评论= rlVectorQValueFunction与属性:ObservationInfo: [1x1 rl.util.]rlNumericSpec] ActionInfo: [1x1 rl.util.]rlFiniteSetSpec] UseDevice: "cpu"

要查看你的评论,使用getValue函数返回一个随机观测值,使用当前网络权重。该函数为三个可能的操作分别返回一个值。

v = getValue(批评家,...{兰德(obsInfo.Dimension)})
v =3x1单列向量0.7232 0.8177 -0.2212

您现在可以使用评论家(以及参与者)来创建依赖q值函数评论家的离散动作空间代理(例如rlQAgentrlDQNAgent,或rlSARSAAgent).

这个评论家只把观察作为输入,并产生一个包含尽可能多的元素的向量作为输出。当智能体从给定的观察开始,并采取与元素在输出向量中的位置相对应的行动时,每个元素表示预期的累积长期奖励。

创建一个观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。对于这个例子,定义观测空间由两个通道组成,第一个是2乘2的连续矩阵,第二个是只能假设两个值的标量,0而且1

obsInfo = [rlNumericSpec([2 2]) rlFiniteSetSpec([0 1])];

创建一个有限集动作规范对象(或者使用getActionInfo从具有离散操作空间的环境中提取规范对象)。在这个例子中,将动作空间定义为由三个可能的向量组成的有限集,[12][34),[56)

actInfo = rlFiniteSetSpec({[1 2],[3 4],[5 6]});

创建一个自定义的基函数来近似评价中的值函数。自定义基函数必须返回一个列向量。每个向量元素必须是由定义的观测值的函数obsInfo

myBasisFcn = @(obsA,obsB) [obsA(1,1)+obsB(1)^2;obsA (2, 1) -obsB (1) ^ 2;obsA(1、2)^ 2 + obsB (1);obsA (2, 2) ^ 2-obsB (1)];

评论家的输出是向量c= W ' * myBasisFcn (obsA obsB),在那里W是一个权重矩阵,其行数必须与基函数输出的长度相同,列数必须与可能的操作数相同。

c中的每个元素都是智能体从给定的观察开始,并采取与所考虑元素的位置相对应的行动时所期望的累积长期奖励。W的元素是可学习参数。

定义一个初始参数矩阵。

W0 = rand(4,3);

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

rlVectorQValueFunction({myBasisFcn,W0},obsInfo,actInfo)
评论= rlVectorQValueFunction与属性:ObservationInfo: [2x1 rl.util.]RLDataSpec] ActionInfo: [1x1 rl.util.]rlFiniteSetSpec] UseDevice: "cpu"

要查看你的评论,使用getValue函数使用当前参数矩阵返回随机观测值。该函数为三个可能的操作分别返回一个值。

v = getValue(批评家,{rand(2,2),0})
v =3×11.3192 0.8420 1.5053

注意,评论家不会对离散集元素强制执行集合约束。

v = getValue(批评家,{rand(2,2),-1})
v =3×12.7890 1.8375 3.0855

您现在可以使用评论家(以及参与者)来创建依赖于q值函数评论家的离散动作空间代理rlQAgentrlDQNAgent,或rlSARSAAgent代理)。

版本历史

R2022a中引入

Baidu
map