主要内容

rlQValueFunction

强化学习代理的q值函数逼近对象

描述

该对象实现了一个q值函数逼近器,您可以将其用作强化学习代理的批评。q值函数将环境状态-动作对映射到表示代理从给定状态开始并执行给定动作时预测的折现累积长期奖励的标量值。因此,q值函数评论家需要环境状态和操作作为输入。在创建一个rlQValueFunction评论家,用它来创建一个代理如rlQAgentrlDQNAgentrlSARSAAgentrlDDPGAgent,或rlTD3Agent.有关创建表示的详细信息,请参见创建策略和值函数

创建

描述

例子

评论家= rlQValueFunction (observationInfoactionInfo)创建q值函数对象评论家.在这里,是深度神经网络用作逼近器,它必须有观察和动作作为输入和一个单一的标量输出。网络输入层根据维度规范自动关联环境观测和行动通道observationInfo而且actionInfo.此函数设置ObservationInfo而且ActionInfo的属性评论家observationInfo而且actionInfo分别输入参数。

例子

评论家= rlQValueFunction (选项卡observationInfoactionInfo)创建q值函数对象评论家离散的行动和观察空间从q值表选项卡选项卡是一个rlTable对象,该对象包含一个表,其行数与可能的观察数相同,列数与可能的操作数相同。函数设置ObservationInfo而且ActionInfo的属性评论家分别到observationInfo而且actionInfo输入参数,在本例中必须为标量rlFiniteSetSpec对象。

例子

评论家= rlQValueFunction ({basisFcnW0},observationInfoactionInfo)创建一个q值函数对象评论家使用自定义基函数作为底层逼近器。第一个输入参数是一个双元素单元格数组,其第一个元素是句柄basisFcn到一个自定义基函数,其第二元素是初始权向量W0.这里基函数必须同时有观察和动作作为输入W0一定是列向量。函数设置ObservationInfo而且ActionInfo的属性评论家observationInfo而且actionInfo分别输入参数。

例子

评论家= rlQValueFunction (___名称=值)指定一个或多个名称-值参数。您可以为深度神经网络近似器指定输入和输出层名称(以强制它们与环境观察和动作通道相关联)。例如,对于所有类型的近似器,您可以指定计算设备UseDevice = " gpu "

输入参数

全部展开

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

网络必须将环境观测和行动作为输入,并将单个标量作为输出。

请注意

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

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

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

q值表,指定为rlTable对象,该对象包含一个数组,其行数与可能的观察值相同,列数与可能的操作相同。元素(年代一个)是行动的预期累积长期回报一个从观察状态年代.这个数组的元素是评论家的可学习参数。

自定义基函数,指定为用户定义的MATLAB函数的函数句柄。用户定义的函数可以是匿名函数,也可以是MATLAB路径上的函数。评论家的输出是标量c = W'*B,在那里W权重向量是否包含可学习参数,和B由自定义基函数返回的列向量。

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

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

在这里,obs1obsN输入的顺序、数据类型和维度是否与中定义的环境观测通道相同observationInfo而且行为中定义的环境动作通道的输入是否具有相同的数据类型和维度actionInfo

有关如何使用基函数创建具有混合连续和离散观测空间的q值函数批评家的示例,请参见由自定义基函数创建混合观测空间q值函数批评家

例子:@ (obs1 obs2, act)[行为(2)* obs1 (1) ^ 2;abs (obs2(5) +法案(1)))

基函数权值的初始值W,指定为与基函数返回的向量长度相同的列向量。

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

例子:UseDevice = " gpu "

网络输入层名称对应于环境动作通道,指定为字符串数组或字符向量的单元格数组。中指定的环境动作通道actionInfo到指定的网络输入层。因此,指定的网络输入层必须具有与中定义的相同的数据类型和维度actionInfo

请注意

函数不使用中指定的动作通道的名称或描述(如果有的话)actionInfo

只有当近似模型是深度神经网络时,才支持这个名称-值参数。金宝app

例子:ActionInputNames = " myNetOutput_Force "

网络输入层名称对应于环境观测通道,指定为字符串数组或单元格数组的字符向量。该功能按顺序分配中指定的每个环境观测通道observationInfo到每个指定的网络输入层。因此,指定的网络输入层(如此参数所示)必须具有与观测规范相同的数据类型和维度observationInfo

请注意

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

只有当近似模型是深度神经网络时,才支持这个名称-值参数。金宝app

例子:ObservationInputNames = {" NetInput1_airspeed”、“NetInput2_altitude "}

属性

全部展开

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

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

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

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

请注意

只允许一个动作通道。

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

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

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

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

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

请注意

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

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

例子:“图形”

对象的功能

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

例子

全部折叠

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

obsInfo = rlNumericSpec([4 1]);

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

actInfo = rlNumericSpec([2 1]);

为了在评论家中近似q值函数,使用深度神经网络。

网络必须有两个输入,一个用于观察,一个用于操作。观测输入必须接受一个四元向量(由obsInfo).动作输入必须接受一个两元素向量(动作向量由actInfo).网络的输出必须是一个标量,代表代理从给定的观察开始并采取给定的行动时预期的累积长期奖励。

你也可以从obsInfo规范(无论观察空间是列向量、行向量还是矩阵,刺激(obsInfo.Dimension)是它的总维数,在这个例子中是4,类似地,刺激(actInfo.Dimension)是动作空间的维数,在情况2中)。

创建网络作为层对象的数组。

%观测路径层数obsPath = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(5) reluLayer fullyConnectedLayer(5,Name=“obsout”));%动作路径图层actPath = [featureInputLayer(prod(actInfo.Dimension)) fullyConnectedLayer(5) reluLayer fullyConnectedLayer(5,Name=“actout”));输出层的常用路径沿着一维连接两层comPath = [concatenationLayer(1,2,Name= .“有条件现金转移支付”fullyConnectedLayer(1, Name= .“输出”));为网络对象添加层net = addLayers(layerGraph(obsPath),actPath);net = addLayers(net,comPath);%连接层net = connectLayers(net,“obsout”“有条件现金转移支付/三机一体”);net = connectLayers(net,“actout”“有条件现金转移支付/ in2”);%绘图网络情节(净)

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

将网络转换为dlnetwork对象Net = dlnetwork(Net);总结属性总结(净)
Initialized: true可学习数量:161 input: 1' input' 4 features 2 'input_1' 2 features

rlQValueFunction,使用网络以及观察和操作规范对象。在使用此语法时,网络输入层根据中的维度规范自动与观察信号和操作信号的组件相关联obsInfo而且actInfo

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

要查看你的评论,使用getValue函数返回给定当前网络权重的随机观察和操作的值。

v = getValue(批评家,...{兰德(obsInfo.Dimension)},...{兰德(actInfo.Dimension)})
v =-1.1006

您现在可以使用评论家(以及带有参与者的评论家)来创建依赖q值函数评论家的代理(例如rlQAgentrlDQNAgentrlSARSAAgent,或rlDDPGAgent).

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

obsInfo = rlNumericSpec([4 1]);

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

actInfo = rlNumericSpec([2 1]);

为了在评论家中近似q值函数,使用深度神经网络。

网络必须有两个输入,一个用于观察,一个用于操作。观测输入(这里称为netObsInput)必须接受一个四元向量(由obsInfo).动作输入(这里称为netActInput)必须接受一个两元素向量(由actInfo).网络的输出必须是一个标量,代表代理从给定的观察开始并采取给定的行动时预期的累积长期奖励。

你也可以从obsInfo规范对象(无论观察空间是列向量、行向量还是矩阵,刺激(obsInfo.Dimension)是它的维数,在这个例子中是4,类似地,刺激(actInfo.Dimension)是动作空间的维数,在情况2中)。

为了创建神经网络路径,使用层对象的向量。为观察和操作命名网络输入层netObsInput而且netActInput,分别。

%观测路径层数obsPath = [featureInputLayer(...刺激(obsInfo.Dimension),...Name =“netObsInput”fulllyconnectedlayer (5,Name=“obsout”));%动作路径图层actPath = [featureInputLayer(...刺激(actInfo.Dimension),...Name =“netActInput”fulllyconnectedlayer (5,Name=“actout”));输出层的常用路径沿着一维连接两层comPath = [concatenationLayer(1,2,Name= .“有条件现金转移支付”fullyConnectedLayer(1, Name= .“输出”));为网络对象添加层net = addLayers(layerGraph(obsPath),actPath);net = addLayers(net,comPath);%连接层net = connectLayers(net,“obsout”“有条件现金转移支付/三机一体”);net = connectLayers(net,“actout”“有条件现金转移支付/ in2”);%绘图网络情节(净)

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

%转换为dlnetwork对象Net = dlnetwork(Net);总结属性总结(净);
Initialized: true learning Number of learnables: 161 Inputs: 1 'netObsInput' 4 features 2 'netActInput' 2 features

rlQValueFunction,使用网络、观察和操作规范对象,以及与环境中的观察和操作相关联的网络输入层的名称。

rlQValueFunction(net,...obsInfo actInfo,...ObservationInputNames =“netObsInput”...ActionInputNames =“netActInput”)
评论= rlQValueFunction与属性:ObservationInfo: [1x1 rl.util.]rlNumericSpec] ActionInfo: [1x1 rl.util.]rlNumericSpec] UseDevice: "cpu"

要查看你的评论,使用getValue函数返回给定当前网络权重的随机观察和操作的值。

v = getValue(批评家,...{兰德(obsInfo.Dimension)},...{兰德(actInfo.Dimension)})
v =-1.1006

您现在可以使用评论家(以及带有参与者的评论家)来创建依赖q值函数评论家的代理(例如rlQAgentrlDQNAgentrlSARSAAgent,或rlDDPGAgent).

创建一个有限集的观察规范对象(或者使用getObservationInfo从具有离散观察空间的环境中提取规范对象)。对于本例,将观测空间定义为具有四个可能值的有限集。

obsInfo = rlFiniteSetSpec([7 5 3 1]);

创建一个有限集动作规范对象(或者使用getActionInfo从具有离散操作空间的环境中提取规范对象)。对于本例,将动作空间定义为具有2个可能值的有限集。

actInfo = rlFiniteSetSpec([4 8]);

创建一个表来近似评价值函数。rlTable从观察和操作规范对象创建值表对象。

qTable = rlTable(obsInfo,actInfo);

该表为每个可能的观察-行动对存储一个值(表示预期的累积长期奖励)。每行对应一个观察结果,每列对应一个操作。属性可以访问该表表格的属性虚表对象。每个元素的初始值为零。

qTable。表格
ans =4×20 0 0 0 0 0 0

可以将表初始化为任何值,在本例中是包含from的整数的数组1通过8

qTable.Table =重塑(1:8 4 2)
qTable = rlTable与属性:Table: [4x2 double]

使用表以及观察和操作规范对象创建评论家。

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

要查看你的评论,使用getValue函数使用当前表项返回给定观察和操作的值。

v = getValue(批评家,{5},{8})
V = 6

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

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

obsInfo = rlNumericSpec([3 1]);

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

actInfo = rlNumericSpec([2 1]);

创建一个自定义的基函数来近似评价中的值函数。自定义基函数必须返回一个列向量。每个向量元素必须是分别定义的观察和操作的函数obsInfo而且actInfo

myBasisFcn = @(myobs,myact) [...myobs (2) ^ 2;...myobs (1) + exp (myact (1));...abs (myact (2));...myobs (3))
myBasisFcn =Function_handle with value:@ (myobs myact) [myobs (2) ^ 2; myobs (1) + exp (myact (1)); abs (myact (2)); myobs (3))

评论家的输出是标量W * myBasisFcn (myobs myact),在那里W是一个权值列向量,它必须与自定义基函数输出具有相同的大小。当智能体从给定的观察开始并采取可能的最佳行动时,这个输出就是预期的累积长期奖励。W的元素是可学习参数。

定义一个初始参数向量。

W0 = [1;4;4;2];

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

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

检查你的评论,使用getValue要使用当前参数向量返回给定的观察-操作对的值。

v = getValue(批评家,{[1 2 3]'},{[4 5]'})
V = 252.3926

您现在可以使用评论家(以及带有参与者的评论家)来创建依赖q值函数评论家的代理(例如rlQAgentrlDQNAgentrlSARSAAgent,或rlDDPGAgent).

创建一个观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。对于本例,定义观测空间由两个通道组成,第一个通道是连续二维空间上的向量,第二个通道是三维空间上的向量,只能假设四个值。

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

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

actInfo = rlFiniteSetSpec({1,2,3});

创建一个自定义的基函数来近似评价中的值函数。自定义基函数必须返回一个列向量。每个矢量元素必须是分别定义的观测值和动作的函数obsInfo而且actInfo.注意,根据定义,所选操作只有一个元素,而每个观察通道有两个元素。

myBasisFcn = @ (obsA obsB, act) [obsA obsB (1) + (2) + obsB(3) +(1)行动;obsA (2) + obsB obsB(1) +(2)行动(1);obsA obsB (1) + (2) + obsB(3) +行动(1)^ 2;obsA (1) + obsB obsB(1) +(2)行动(1)^ 2);

评论家的输出是标量W * myBasisFcn (obsA obsB, act),在那里W是权重列向量,必须与自定义基函数输出具有相同的大小。当智能体从给定的观察开始并采取指定为最后输入的操作时,此输出是预期的累积长期奖励。W的元素是可学习参数。

定义一个初始参数向量。

W0 = ones(4,1);

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

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

要查看你的评论,使用getValue函数使用当前参数向量返回给定的观察-操作对的值。

v = getValue(批评家,{[-0.5 0.6],[1 0 -1]},{3})
V = -0.9000

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

v = getValue(评论家,{(-0.5 - 0.6),(-0.05 -10)},{33})
V = -21.0000

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

版本历史

R2022a中引入