主要内容

rlValueFunction

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

描述

该对象实现了一个值函数逼近器对象,您可以将其用作强化学习代理的批评。值函数将环境状态映射到标量值。当智能体从给定状态开始并采取可能的最佳行动时,输出表示预测的折现累积长期奖励。在创建一个rlValueFunction评论家,使用它来创建一个代理,例如rlACAgentrlPGAgent,或rlPPOAgent代理。有关此工作流的示例,请参见创建演员和评论家代表.有关创建值函数的详细信息,请参见创建策略和值函数

创建

描述

例子

评论家= rlValueFunction (observationInfo创建值-函数对象评论家来自深度神经网络并设置ObservationInfo的属性评论家observationInfo输入参数。网络输入层根据中尺寸规范自动与环境观测通道关联observationInfo

例子

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

例子

评论家= rlValueFunction (选项卡observationInfo创建值函数对象评论家与一个离散观测空间,从桌子上选项卡,这是一个rlTable对象,该对象包含列数组,其中元素与可能的观测值数量相同。函数设置ObservationInfo的属性评论家observationInfo输入参数,在本例中必须是标量rlFiniteSetSpec对象。

例子

评论家= rlValueFunction ({basisFcnW0},observationInfo创建值函数对象评论家使用自定义基函数作为底层逼近器。第一个输入参数是一个双元素单元格数组,其第一个元素是句柄basisFcn到一个自定义基函数,其第二元素是初始权向量W0.函数设置ObservationInfo的属性评论家observationInfo输入参数。

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

输入参数

全部展开

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

请注意

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

该网络必须以环境观测通道作为输入,以单个标量作为输出。

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

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

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

请注意

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

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

值表,指定为rlTable对象,该对象包含一个列向量,其长度等于来自环境的可能观测数。每个元素都是当智能体从给定的观察开始并采取最佳可能行动时预测的贴现累积长期奖励。这个向量的元素是表示法的可学习参数。

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

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

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

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

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

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

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

属性

全部展开

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

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

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

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

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

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

请注意

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

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

例子:“图形”

对象的功能

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

例子

全部折叠

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

obsInfo = rlNumericSpec([4 1]);

创建一个深度神经网络,以近似评论家内部的值函数,作为层对象的列向量。网络输入层必须接受一个四元向量(由obsInfo),输出必须是一个标量(数值,表示代理从给定观察开始时期望的累积长期奖励)。

你也可以从obsInfo规范(无论观察空间是列向量、行向量还是矩阵,刺激(obsInfo.Dimension)在这种情况下,它的总维数是否等于4).

net = [featureInputLayer(prod(obsInfo.Dimension));fullyConnectedLayer (10);reluLayer;fullyConnectedLayer (Name =“价值”));

将网络转换为adlnetwork对象。

Dlnet = dlnetwork(net);

您可以使用情节并显示其主要特征,如权重的数量,使用总结

情节(dlnet)

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

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

使用网络和观察规范对象创建评论家。使用此语法时,网络输入层根据中的维度规范自动与环境观察相关联obsInfo

rlValueFunction(dlnet,obsInfo)
评论= rlValueFunction与属性:ObservationInfo: [1x1 rl.util.]rlNumericSpec] UseDevice: "cpu"

检查你的评论,使用getValue使用当前网络权重返回随机观测值。

v = getValue(批评家,{rand(obsInfo.Dimension)})
v =0.5196

您现在可以使用评论家(以及参与者)来创建依赖于价值函数评论家的代理(例如rlACAgentrlPGAgent).

创建一个参与者和一个评论家,您可以使用它们来定义一个强化学习代理,例如参与者评论家(actor critic, AC)代理。对于本例,为代理创建参与者和评论家,该代理可以针对中描述的扁担环境进行训练训练交流代理人平衡车杆系统

首先,创造环境。然后,从环境中提取观察和动作规范。您需要这些规范来定义代理和评论家。

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

状态-值-函数批评(如用于AC或PG代理的批评)将当前观察作为输入,将状态值(标量)作为输出。对于这个例子,为了在评论家中近似值函数,创建一个具有一个输出(值)和四个输入(环境观察信号)的深度神经网络xxdotθ,thetadot).

创建网络作为层对象的列向量。观测值的个数可以从obsInfo规范(无论观察空间是列向量、行向量还是矩阵,刺激(obsInfo.Dimension)是它的总维数)。命名网络输入层criticNetInput

criticNetwork = [featureInputLayer(prod(obsInfo.Dimension)),...Name =“criticNetInput”);fullyConnectedLayer (10);reluLayer;fullyConnectedLayer (Name =“CriticFC”));

将网络转换为adlnetwork对象。

临界网络= dlnetwork(临界网络);

显示网络的主要特点,使用总结

总结(criticNetwork)
Initialized: true可学习数量:61 input: 1 'criticNetInput' 4个特征

使用指定的神经网络创建评论家。另外,为评论家指定行动和观察信息。设置观察名称为观察的名称criticNetwork输入层。

评论= rlValueFunction(批评网络,obsInfo,...ObservationInputNames = {“criticNetInput”})
评论= rlValueFunction与属性:ObservationInfo: [1x1 rl.util.]rlNumericSpec] UseDevice: "cpu"

检查你的评论getValue在给定当前网络权重的情况下,返回一个随机观测值。

v = getValue(批评家,{rand(obsInfo.Dimension)})
v =0.5196

使用指定评论家优化选项rlOptimizerOptions.这些选项控制关键网络参数的学习。在本例中,设置学习率为0.01,梯度阈值为1。

criticOpts = rlOptimizerOptions(...LearnRate = 1飞行,...GradientThreshold = 1);

AC代理使用由参与者表示的策略来决定采取给定的观察结果。对于行为人来说,输入是环境观测,输出取决于动作空间是离散的还是连续的。本例中的参与者有两个可能的离散操作,-10或10。为了创建行动者,使用一个深度神经网络,它可以在给定与评论家相同的观察输入时输出这两个值。

使用两个层对象的行向量创建网络。操作数可以从actInfo规范。命名网络输出actorNetOutput

actorNetwork = [featureInputLayer(...刺激(obsInfo.Dimension),...Name =“actorNetInput”) fullyConnectedLayer (...元素个数(actInfo.Elements),...Name =“actorNetOutput”));

将网络转换为adlnetwork对象。

actorNetwork = dlnetwork(actorNetwork);

显示网络的主要特点,使用总结

总结(actorNetwork)
Initialized: true可学习数量:10 input: 1 'actorNetInput' 4个特征

使用以下命令创建参与者rlDiscreteCategoricalActor连同观测和动作规范,以及与环境观测通道相关联的网络输入层的名称。

actor = rlDiscreteCategoricalActor(actorNetwork,obsInfo,actInfo,...ObservationInputNames = {“actorNetInput”})
actor = rlDiscreteCategoricalActor with properties: Distribution: [1x1 rl.distribution. Distribution .]rlDiscreteGaussianDistribution] ObservationInfo: [1x1 rl.util.]rlNumericSpec] ActionInfo: [1x1 rl.util.]rlFiniteSetSpec] UseDevice: "cpu"

要检查角色,请使用getAction使用当前网络权重,从给定的观察中返回一个随机操作。

a = getAction(actor,{rand(obsInfo.Dimension)})
一个=1x1单元阵列{[-10]}

使用指定角色优化选项rlOptimizerOptions.这些选项控制关键网络参数的学习。在本例中,设置学习率为0.05,梯度阈值为1。

actorOpts = rlOptimizerOptions(...LearnRate = 5飞行,...GradientThreshold = 1);

使用演员和评论家创建一个AC代理。使用之前为actor和批评家创建的优化器选项对象。

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使用当前参与者和评论家网络权重,从给定的观察中返回一个随机操作。

act = getAction(代理,{rand(obsInfo.Dimension)})
行动=1x1单元阵列{[-10]}

有关如何为不同的代理类型创建演员和评论家的其他示例,请参见:

创建一个有限集的观察规范对象(或者使用getObservationInfo从具有离散观察空间的环境中提取规范对象)。对于这个例子,将观察空间定义为一个有限集,由四个可能的值组成:13.4而且7

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

创建一个表来近似评价值函数。

vTable = rlTable(obsInfo);

该表是一个列向量,其中每个条目存储每个可能观察的预测累积长期奖励,定义为obsInfo.属性可以访问该表表格的属性虚表对象。每个元素的初始值为零。

虚表。表格
ans =4×10 0 0 0

还可以将表初始化为任何值,在本例中,初始化为包含来自的所有整数的数组14

虚表。表格= reshape(1:4,4,1)
vTable = rlTable,属性为[4x1 double]

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

rlValueFunction(vTable,obsInfo)
评论= rlValueFunction与属性:ObservationInfo: [1x1 rl.util.]rlFiniteSetSpec] UseDevice: "cpu"

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

v = getValue(批评家,{7})
V = 4

您现在可以使用评论家(以及参与者)来创建依赖于价值函数评论家的代理(例如rlACAgentrlPGAgent).

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

obsInfo = rlNumericSpec([4 1]);

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

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

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

定义一个初始参数向量。

W0 = [3;5;2];

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

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

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

v = getValue(批评家,{[2 4 6 8]'})
V = 130.9453

您现在可以使用评论家(以及参与者)来创建依赖于价值函数评论家的代理(例如rlACAgentrlPGAgent).

创造一个环境,获取观察和行动信息。

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

为了近似临界值函数,使用创建一个循环深度神经网络作为层对象的行向量。使用一个sequenceInputLayer作为输入层(obsInfo.Dimension (1)观察空间的维度)是否包含至少一个lstmLayer

myNet = [sequenceInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(8, Name=“俱乐部”) reluLayer (Name =“relu”) lstmLayer (8, OutputMode =“序列”) fullyConnectedLayer (Name =“输出”));

将网络转换为adlnetwork对象。

dlCriticNet = dlnetwork(myNet);

显示网络特征摘要。

总结(dlCriticNet)
初始化:true可学习数量:593 input: 1 'sequenceinput' 4维序列输入

为评论家创建一个值函数表示对象。

rlValueFunction(dlCriticNet,obsInfo)
评论= rlValueFunction与属性:ObservationInfo: [1x1 rl.util.]rlNumericSpec] UseDevice: "cpu"

要查看你的评论,使用getValue函数返回使用当前网络权重的随机观测值。

v = getValue(批评家,{rand(obsInfo.Dimension)})
v =0.0017

您现在可以使用评论家(以及参与者)来创建依赖于价值函数评论家的代理(例如rlACAgentrlPGAgent).

创建一个有限集观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。在本例中,将观测空间定义为两个通道,其中第一个通道是标记的单个观测753.,或1,第二个是连续三维空间上的向量。

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

创建一个自定义的基函数来近似评价中的值函数。自定义基函数必须返回一个列向量。每个向量元素必须是定义的观测值(在本例中为单个数字)的函数obsInfo

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

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

定义一个初始参数向量。

W0 = ones(4,1);

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

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

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

v = getValue(批评家,{5,[0.1 0.1 0.1]'})
V = 60

注意,评论家并不强制离散集元素的集合约束。

v = getValue(批评家,{-3,[0.1 0.1 0.1]'})
V = 12

您现在可以使用评论家(以及带有参与者的评论家)来创建依赖于离散值函数评论家的代理(例如rlACAgentrlPGAgent).

版本历史

R2022a中引入

Baidu
map