主要内容

rlValueRepresentation

强化学习主体的价值函数批判表示

描述

该对象实现了一个值函数近似剂,以在加强学习代理中用作批评者。值函数是将观察到标量值映射的函数。输出代表代理从给定观察开始时的预期总长期奖励,并采取最佳动作。因此,价值函数批评只需要观察(但不是动作)作为输入。创建一个rlValueRepresentation批评家,使用它创建依赖于值函数批评家的代理,例如rlACAgent,rlPGAgent,或RLP发泡剂。有关此工作流的示例,请参阅创建演员和批评者表示.有关创建表示的更多信息,请参见创建策略和价值功能表示

创建

描述

实例

评论家=rlValueRepresentation(,observationInfo“观察”,obsName)创建基于的值函数评论家从深度神经网络.该语法设置观察税收性质评论家输入observationInfoobsName的输入层的名称

实例

评论家=rlValueRepresentation(标签,observationInfo)创建基于的值函数评论家与一个离散观测空间,来自价值表标签,这是一个rlTable对象,该对象包含具有尽可能多的元素的列数组观察税收性质评论家输入observationInfo

实例

评论家= rlvaluerepresentation({基础FCN.,W0},observationInfo)创建基于的值函数评论家使用自定义基函数作为基础逼近器。第一个输入参数是两个元素的单元格,其中第一个元素包含句柄基础FCN.对于自定义基函数,第二个元素包含初始权重向量W0.该语法设置观察税收性质评论家输入observationInfo

评论家=rlValueRepresentation(___,选项)创建基于的值函数评论家使用附加选项集选项,这是一个rlRepresentationOptions对象。该语法设置选项性质评论家选项输入参数。您可以将此语法与前面的任何输入参数组合一起使用。

输入参数

全部展开

深度神经网络用作批评家内部的底层近似器,指定为以下其中之一:

网络输入层必须与中定义的信号具有相同的顺序、相同的数据类型和维数观察税收。此外,这些输入层的名称必须与中列出的观测名称匹配obsName

rlValueRepresentation对象支持递归深度金宝app神经网络。

有关深层神经网络层的列表,请参见深度学习层列表.有关创建用于强化学习的深度神经网络的更多信息,请参见创建策略和价值功能表示

观察名称,指定为字符串或字符向量的单元格数组。观察名称必须是输入层的名称。这些网络层必须与中定义的信号具有相同的顺序、数据类型和尺寸观察税收

例子:{'my_obs'}

值表,指定为rlTable包含长度等于观察数的列向量的对象。元素当代理从给定的观察开始时,预期的累积长期报酬是多少s并采取最好的行动。这个向量的元素是表示的可学习参数。

自定义基函数,指定为用户定义函数的函数句柄。用户定义的函数可以是匿名函数,也可以是MATLAB路径上的函数。评论家的输出是c = W ' * B,在那里W是重量矢量和B是自定义基函数返回的列向量。C是当代理从给定的观察开始并采取可能的最佳行动时的预期累积长期回报。此表示的可学习参数是W

当创建一个价值功能评估表示时,您的基本功能必须具有以下签名。

B = myBasisFunction (obsN obs1, obs2,…)

在这里obs1obsn.观测是否与中定义的信号具有相同的顺序、相同的数据类型和维度观察税收

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

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

属性

全部展开

表示选项,指定为rlRepresentationOptions对象。可用的选项包括用于培训的优化器和学习率。

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

rlValueRepresentation设置观察税收性质评论家输入observationInfo

你可以提取观察税收从现有环境或代理使用getObservationInfo.您还可以手动构建规范。

目标函数

rlACAgent 演员-评论家强化学习代理
rlPGAgent 策略梯度强化学习代理
RLP发泡剂 最近策略优化强化学习代理
getValue 获得估计值函数表示

例子

全部崩溃

创建一个观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。在本例中,将观测空间定义为连续的四维空间,因此单个观测是包含4个双精度的列向量。

obsInfo = rlNumericSpec([4 1]);

创建一个深度神经网络来近似批评家内部的价值函数。网络的输入(这里称为myobs)必须接受一个四元向量(由obsInfo),输出必须是标量(值,表示代理从给定观察开始时的预期累积长期奖励)。

网= [featureInputLayer (4“归一化”,“没有”,“姓名”,“myobs”) fullyConnectedLayer (1,“姓名”,“价值”));

使用网络、观察规范对象和网络输入层的名称创建批评家。

评论家= rlValueRepresentation (obsInfo净,“观察”,{“myobs”})
comment = rlvaluerpresentation with properties: ObservationInfo: [1x1 rl.util.]rlNumericSpec选项:[1x1 rl.option.rlRepresentationOptions]

要检查您的批评者,请使用getValue函数使用当前网络权重返回随机观测值。

v=getValue(批评家,{rand(4,1)})
v =0.7904

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

创建一个参与者表示和一个评论家表示,您可以使用它们来定义一个强化学习代理,比如参与者评论家(AC)代理。

对于本例,为一个代理创建参与者和批评者表示,该代理可以根据本文中描述的cart-pole环境进行训练火车AC代理以平衡车杆系统.首先,创造环境。然后,从环境中提取观察和行动规范。您需要这些规范来定义代理和评论家表示。

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

对于AC或PG代理使用的状态值函数批评家,输入是观察值,输出应该是标量值,即状态值。例如,使用深度神经网络创建批评家表示,其中一个输出,观察信号对应于x,xdot,西塔,Thetadot.中描述的火车AC代理以平衡车杆系统。你可以从obsInfo规范。命名网络层输入“观察”

numobservation = Obsinfo.dimension(1);批评网络= [FeatureInputLayer(numobservation,“归一化”,“没有”,“姓名”,“观察”) fullyConnectedLayer (1,“姓名”,“临界CFC”));

使用指定批评家表示的选项rlRepresentationOptions.这些选项控制关键网络参数的学习。在本例中,学习率设置为0.05,梯度阈值设置为1。

repOpts=rlRepresentationOptions(“LearnRate”,5e-2,“梯度阈值”1);

使用指定的神经网络和选项创建批评家表示。此外,指定批评家的操作和观察信息。将观察名称设置为“观察”,这是临界网络输入层。

评论家= rlValueRepresentation (criticNetwork obsInfo,“观察”,{“观察”}, repOpts)
comment = rlvaluerpresentation with properties: ObservationInfo: [1x1 rl.util.]rlNumericSpec选项:[1x1 rl.option.rlRepresentationOptions]

类似地,为参与者创建一个网络。AC代理使用参与者表示来决定对给定的观察结果采取什么操作。对于行动者来说,输入是观察值,输出取决于动作空间是离散的还是连续的。对于本例中的参与者,有两个可能的离散动作,-10或10。要创建演员,使用与评论家相同的观察输入的深度神经网络,它可以输出这两个值。的操作数actInfo规范。名字的输出“行动”

numAction =元素个数(actInfo.Elements);actorNetwork = [featureInputLayer(numobation,“归一化”,“没有”,“姓名”,“观察”)完全连接层(numAction,“姓名”,“行动”));

使用观察名称和规范以及相同的表示选项创建参与者表示。

演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,...“观察”,{“观察”}, repOpts)
actor = rlStochasticActorRepresentation with properties:rlFiniteSetSpec: [1x1 rl.util.]rlNumericSpec] Options: [1x1 rl.option.rlRepresentationOptions]

使用参与者和批评者表示创建AC代理。

agentOpts=rlACAgentOptions(...“NumStepsToLookAhead”32岁的...“折扣演员”,0.99);代理=rlACAgent(演员、评论家、代理)
代理=具有属性的rlacagent:agentoptions:[1x1 rl.option.rlacagentoptions]

有关如何为不同的代理类型创建actor和critic表示的其他示例,请参见:

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

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

创建一个表来近似批评家中的值函数。

vTable = rlTable (obsInfo);

该表是一个列向量,其中每个条目存储每个可能观察的预期累积长期回报,如obsInfo。您可以使用表格财产的财产虚表对象。每个元素的初始值都是零。

vTable.表格
ans=4×10 0 0 0

您还可以将表初始化为任何值,在本例中是一个数组,其中包含来自的所有整数1.4.

vTable.表格= reshape(1:4,4,1)
vTable=rlTable,带属性:Table:[4x1双精度]

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

评论家= rlValueRepresentation (vTable obsInfo)
comment = rlvaluerpresentation with properties: ObservationInfo: [1x1 rl.util.]rlFiniteSetSpec选项:[1x1 rl.option.rlRepresentationOptions]

要检查您的批评者,请使用getValue函数使用当前表项返回给定观察值。

{7} v = getValue(批评)
v=4

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

创建一个观察规范对象(或者使用getObservationInfo从环境中提取规范对象)。在本例中,将观测空间定义为连续的四维空间,因此单个观测是包含4个双精度的列向量。

obsInfo = rlNumericSpec([4 1]);

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

MyBasisCfCn=@(myobs)[myobs(2)^2;myobs(3)+exp(myobs(1));abs(myobs(4))]
myBasisFcn=function_handle与价值:@(肌瘤)[肌瘤(2)^2;肌瘤(3)+exp(肌瘤(1));abs(肌瘤(4))]

批评家的输出是标量w'* mybasisfcn(myobs),在那里W是一个权重列向量,它必须具有与自定义基函数输出相同的大小。该输出是代理从给定的观察开始并采取最佳行动时的预期累积长期回报。W的元素是可学习的参数。

定义初始参数向量。

W0 =(3。5;2);

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

评论家= rlValueRepresentation ({myBasisFcn, W0}, obsInfo)
comment = rlvaluerpresentation with properties: ObservationInfo: [1x1 rl.util.]rlNumericSpec选项:[1x1 rl.option.rlRepresentationOptions]

要检查您的批评者,请使用getValue函数使用当前参数向量返回给定观测值。

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

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

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

env=rlPredefinedEnv(“CartPole离散型”);obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);numObs = obsInfo.Dimension (1);numDiscreteAct =元素个数(actInfo.Elements);

为评论家创建一个循环深度神经网络。要创建递归神经网络,请使用sequenceInputLayer作为输入层并包括至少一个lstmLayer

criticNetwork = [sequenceInputLayer(nummobs,“归一化”,“没有”,“姓名”,“状态”)全连接列(8,“姓名”,“俱乐部”)雷卢耶(“姓名”,“relu”)第1层(8,“OutputMode”,“顺序”,“姓名”,“lstm”) fullyConnectedLayer (1,“姓名”,“输出”));

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

criticOptions = rlRepresentationOptions (“LearnRate”1飞行,“梯度阈值”1);评论家= rlValueRepresentation (criticNetwork obsInfo,...“观察”,“状态”,批评);
在R2020a中引入