主要内容

rlACAgent

演员-评论家强化学习代理

描述

行为者-批评(AC)代理实现行为者-批评算法,如A2C和A3C,这是无模型的、在线的、基于政策的强化学习方法。行动者-评论家代理直接优化策略(行动者),并使用评论家来估计回报或未来的回报。动作空间可以是离散的,也可以是连续的。

有关详细信息,请参阅影评经纪人。有关不同类型强化学习代理的更多信息,请参阅强化学习代理

创建

描述

根据观察和操作规范创建代理

实例

代理=rlACAgent(observationInfo,actionInfo)使用默认初始化选项为具有给定观察和操作规范的环境创建参与者-批评家代理。代理中的参与者和批评家表示使用根据观察规范构建的默认深层神经网络observationInfo以及动作规范actionInfo

实例

代理=rlACAgent(observationInfo,actionInfo,initOpts)为具有给定观察和操作规范的环境创建参与者-评论家代理。代理使用默认网络,其中每个隐藏的完全连接层都具有在中指定的单元数initOpts参与者-批评家代理不支持递归神经网络。金宝app有关初始化选项的更多信息,请参见rlAgentInitializationOptions

从演员和评论家代表创建代理

实例

代理=rlACAgent(演员,评论家)使用代理的默认选项,使用指定的参与者和评论家创建参与者-评论家代理。

指定代理选项

实例

代理=rlACAgent(___,代理)创建演员-评论家代理并设置AgentOptions财产归代理输入参数。在前面语法中的任何输入参数之后使用此语法。

输入参数

全部展开

观测规范,指定为强化学习规范对象或规范对象数组,定义观测信号的尺寸、数据类型和名称等属性。

你可以提取observationInfo从现有环境或代理使用getObservationInfo.您还可以使用以下方法手工构造规范rlFiniteSetSpecrlNumericSpec

动作规范,指定为强化学习规范对象,定义属性,如尺寸、数据类型和动作信号的名称。

对于离散动作空间,必须指定actionInfo作为rlFiniteSetSpec对象。

对于连续操作空间,必须指定actionInfo作为rlNumericSpec对象。

你可以提取actionInfo从现有环境或代理使用getActionInfo。您也可以使用手动构造规范rlFiniteSetSpecrlNumericSpec

的代理初始化选项rlAgentInitializationOptions参与者-批评家代理不支持递归神经网络。金宝app

策略的参与者网络表示形式,指定为随机表示对象。有关创建角色表示的更多信息,请参见创建策略和价值功能表示

评论家网络表示估计折扣的长期奖励,指定为rlValueRepresentation对象。有关创建评论家表示的更多信息,请参见创建策略和价值功能表示

属性

全部展开

代理选项,指定为rlACAgentOptions对象。

目标函数

火车 在特定环境中培训强化学习代理
模拟 在指定的环境中模拟训练过的强化学习代理
getAction 从给定环境观察的代理或参与者表示中获取操作
getActor 从强化学习代理获取参与者表示
设置器 设置强化学习主体的主体表示
Get批评家 从强化学习代理获得批判表示
赛特评论家 集合强化学习代理的批判表示
generatePolicyFunction 创建评估强化学习代理的培训策略的函数

例子

全部崩溃

创造一个具有离散动作空间的环境,并获得其观察和动作规范。对于本示例,请加载示例中使用的环境使用Deep Network Designer创建代理并使用图像观察进行培训。此环境有两个观测值:一个50×50的灰度图像和一个标量(摆锤的角速度)。动作是一个标量,有五个可能的元素(扭矩为-2., -1.,0,1.,或2.Nm应用于摆动杆)。

%加载预定义的环境env=rlPredefinedEnv(“SimplePendulumWithImage-Discrete”);%获得观察和行动规范obsInfo=获取观测信息(env);actInfo=getActionInfo(env);

代理创建函数随机初始化演员和评论家网络。您可以通过固定随机生成器的种子来确保再现性。为此,请取消对以下行的注释。

%rng(0)

根据环境观察和行动规范创建一个演员-评论家代理。

agent=rlACAgent(obsInfo、actInfo);

要检查您的代理,请使用getAction从随机观察返回操作。

getAction(代理,{rand(obsInfo(1.Dimension),rand(obsInfo(2.Dimension)})
ans=1x1单元阵列{[2]}

现在可以在环境中测试和培训代理。

创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本示例,请加载示例中使用的环境通过图像观察训练DDPG药剂摆动和平衡摆锤.这个环境有两个观测值:一个50乘50的灰度图像和一个标量(钟摆的角速度)。这个作用是一个标量,表示从-连续范围的扭矩2.2.Nm。

%加载预定义的环境env=rlPredefinedEnv(“SimplePendulumWithImage连续”);%获得观察和行动规范obsInfo=获取观测信息(env);actInfo=getActionInfo(env);

创建一个代理初始化选项对象,指定网络中每个隐藏的完全连接层必须具有128神经元(而不是默认数量,256).Actor批评家代理不支持重复网络,因此设置金宝appUseRNN选择真正的创建代理时生成错误。

initOpts = rlAgentInitializationOptions (“NumHiddenUnit”,128);

代理创建函数随机初始化演员和评论家网络。您可以通过固定随机生成器的种子来确保再现性。为此,请取消对以下行的注释。

%rng(0)

根据环境观察和行动规范创建一个演员-评论家代理。

agent=rlACAgent(obsInfo、actInfo、initOpts);

将批评家学习率降低到1e-3。

批评家=Get批评家(代理);critic.Options.LearnRate=1e-3;agent=set批评家(agent,批评家);

从agent参与者和批评家中提取深层神经网络。

actorNet = getModel (getActor(代理));criticNet = getModel (getCritic(代理));

显示批评网络的各层,并验证每个隐藏的全连接层有128个神经元

临界层
ans = 12x1 Layer array with layers:1的concat串联连接2输入沿着维度3 2的relu_body ReLU ReLU 3“fc_body”完全连接128完全连接层4的body_output ReLU ReLU 5 input_1的图像输入50 x50x1图片6 conv_1卷积64 3 x3x1旋转步[1]和填充[0 0 0 0]7‘relu_input_1 ReLU ReLU 8 fc_1完全连接10 'fc_2' fully connected 128 fully connected layer 11 'output' fully connected 1 fully connected layer 12 'RepresentationLoss' Regression output mean-平方误差

情节演员和评论家网络

情节(actorNet)

图形包含轴。轴包含graphplot类型的对象。

绘图(关键网)

图形包含轴。轴包含graphplot类型的对象。

要检查您的代理,请使用getAction从随机观察返回操作。

getAction(代理,{rand(obsInfo(1.Dimension),rand(obsInfo(2.Dimension)})
ans=1x1单元阵列{[0.9228]}

现在可以在环境中测试和培训代理。

创造一个具有离散动作空间的环境,并获得其观察和动作规范。对于本示例,请加载示例中使用的环境培训DQN员工平衡车杆系统.这个环境有一个四维的观测向量(车的位置和速度、极角和极角导数),以及一个具有两个可能元素的标量作用(一个力是-)10或+10N应用在购物车上)。

%加载预定义的环境env=rlPredefinedEnv(“CartPole离散型”);获得观察规范obsInfo=getObservationInfo(环境)
obsInfo = rlNumericSpec带有属性:LowerLimit: -Inf UpperLimit: Inf Name: "CartPole States" Description: "x, dx, theta, dtheta" Dimension: [4 1] DataType: "double"
获得动作规格actInfo=getActionInfo(环境)
actInfo=rlFiniteSetSpec,属性为:元素:[-10 10]名称:“CartPole操作”说明:[0x0字符串]维度:[1]数据类型:“双”

代理创建函数随机初始化演员和评论家网络。您可以通过固定随机生成器的种子来确保再现性。为此,请取消对以下行的注释。

%rng(0)

创建一个评论家表示。

%在批评家中创建网络作为近似器使用%必须有一个4维输入(4个观测值)和一个标量输出(值)临界网络=[imageInputLayer([4 1],“正常化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (1,“姓名”,“临界CFC”));%为评论家设置选项criticOpts = rlRepresentationOptions (“LearnRate”, 8 e - 3,“梯度阈值”1);%创建批评者(参与者-批评者代理使用值函数表示)评论家= rlValueRepresentation (criticNetwork obsInfo,“观察”, {“状态”}, criticOpts);

创建一个参与者表示。

%创建网络以用作参与者中的近似器%必须有4维输入和2维输出(动作)actorNetwork=[imageInputLayer([4 1],“正常化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (2“姓名”,“行动”));为actor设置选项actorOpts=rlRepresentationOptions(“LearnRate”, 8 e - 3,“梯度阈值”1);%创建行动者(行动者-评论家行动者使用随机行动者表示)演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,...“观察”, {“状态”},actorOpts);

指定代理选项,并使用参与者、评论家和代理选项对象创建AC代理。

agentOpts=rlACAgentOptions(“NumStepsToLookAhead”32岁的“DiscountFactor”,0.99);代理=rlACAgent(演员、评论家、代理)
agent=rlACAgent,具有以下属性:AgentOptions:[1x1 rl.option.rlACAgentOptions]

要检查您的代理,请使用getAction从随机观察返回操作。

getAction(代理,{rand(4,1)})
ans=1x1单元阵列{[-10]}

现在可以在环境中测试和培训代理。

创建一个具有连续行动空间的环境,并获取其观察和行动规范。对于本例,加载示例中使用的双积分连续动作空间环境培训DDPG代理控制双积分系统

%加载预定义的环境env=rlPredefinedEnv(“双积分连续”);获得观察规范obsInfo=getObservationInfo(环境)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "states" Description: "x, dx" Dimension: [2 1] DataType: "double"
获得动作规格actInfo=getActionInfo(环境)
actInfo=rlNumericSpec,属性:LowerLimit:-Inf上限:Inf名称:“强制”说明:[0x0字符串]维度:[1]数据类型:“双”

在本例中,动作是一个标量输入,表示从-2.2.牛顿,因此,设置相应的动作信号的上限和下限是一个好主意。当参与者的网络表示具有非线性输出层时,必须这样做,而不是需要相应地缩放以在所需范围内产生输出。

%确保动作空间的上限和下限是有限的actInfo.LowerLimit=-2;actInfo.上限=2;

演员和评论家网络是随机初始化的。您可以通过固定随机生成器的种子来确保重现性。为此,取消下面一行的注释。

%rng(0)

创建一个评论家表示。演员-评论家代理使用rlValueRepresentation对于批评家。对于连续观测空间,可以使用深度神经网络或自定义基表示。对于本例,创建深度神经网络作为基础近似器。

%创建网络以用作批评家中的近似器%它必须将观测信号作为输入,并产生一个标量值[errorcode] [errorcode]错误码尺寸1],“正常化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (10“姓名”,“fc_in”)雷卢耶(“姓名”,“relu”) fullyConnectedLayer (1,“姓名”,“出去”));为评论家设置一些训练选项criticOpts = rlRepresentationOptions (“LearnRate”, 8 e - 3,“梯度阈值”1);%从网络中创建批评家表示评论家= rlValueRepresentation (criticNet obsInfo,“观察”, {“状态”}, criticOpts);

演员-评论家代理使用随机表示.对于在连续动作空间中操作的随机参与者,您只能使用深度神经网络作为基础近似器。

观察输入(这里称为myobs)必须接受二维向量,如obsInfo.输出(此处称为myact)还必须是二维向量(是中指定的维数的两倍)actInfo).输出向量的元素依次表示每个动作的所有平均值和所有标准偏差(在本例中,只有一个平均值和一个标准偏差)。

事实上,标准差必须是非负的,而平均值必须落在输出范围内,这意味着网络必须有两个独立的路径。第一个路径是针对平均值的,任何输出非线性必须进行缩放,以便它能在输出范围内产生输出。第二种方法是标准偏差,必须使用软加或ReLU层来强制非负性。

%输入路径层(2乘1输入和1乘1输出)inPath = [imageInputLayer([obsInfo. inPath])]尺寸1],“正常化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (10“姓名”,“ip_fc”)%10乘1输出雷卢耶(“姓名”,“伊普雷鲁”)%非线性fullyConnectedLayer (1,“姓名”,“ip_out”));%1乘1输出%平均值的路径层(1×1输入和1×1输出)%使用scalingLayer缩放范围meanPath=[fullyConnectedLayer(15,“姓名”,“mp_fc1”)%15乘1输出雷卢耶(“姓名”,“mp_relu”)%非线性fullyConnectedLayer (1,“姓名”,“mp_fc2”);%1乘1输出tanhLayer (“姓名”,的双曲正切);%输出范围:(-1,1)scalingLayer (“姓名”,“mp_out”,“规模”,actInfo.上限];%输出范围:(-2N,2N)%路径层的标准偏差(1 × 1输入和输出)%使用软加层使输出非负sdevPath = [fulllyconnectedlayer (15,“姓名”,“vp_fc1”)%15乘1输出雷卢耶(“姓名”,“vp_relu”)%非线性fullyConnectedLayer (1,“姓名”,“vp_fc2”);%1乘1输出softplusLayer (“姓名”,“vp_out”));%输出范围:(0,+Inf)将两个输入(沿维度#3)连接起来,形成单个(2 × 1)输出层outLayer=连接层(3,2,“姓名”,“平均值和sdev”);添加层到layerGraph网络对象actorNet = layerGraph (inPath);actorNet = addLayers (actorNet meanPath);actorNet = addLayers (actorNet sdevPath);actorNet = addLayers (actorNet,支出);连接层:平均值路径输出必须连接到连接层的第一个输入actorNet=连接层(actorNet,“ip_out”,“mp_fc1 /”);%将inPath的输出连接到meanPath输入actorNet=连接层(actorNet,“ip_out”,“vp_fc1/in”);%连接inPath输出到sdevPath输入actorNet=连接层(actorNet,“mp_out”,“平均值和sdev/in1”);%将meanPath的输出连接到mean&sdev输入#1actorNet=连接层(actorNet,“vp_out”,“平均值和sdev/in2”);%将sdevPath的输出连接到均值和sdev输入#2%的阴谋网络情节(actorNet)

图形包含轴。轴包含graphplot类型的对象。

为参与者指定一些选项,并使用深层神经网络创建随机参与者表示actorNet

%为演员设置一些训练选项actorOpts=rlRepresentationOptions(“LearnRate”, 8 e - 3,“梯度阈值”1);使用网络创建参与者演员= rlStochasticActorRepresentation (actorNet obsInfo actInfo,...“观察”, {“状态”},actorOpts);

指定代理选项,并使用actor、评论家和代理选项创建AC代理。

agentOpts=rlACAgentOptions(“NumStepsToLookAhead”32岁的“DiscountFactor”,0.99);代理=rlACAgent(演员、评论家、代理)
agent=rlACAgent,具有以下属性:AgentOptions:[1x1 rl.option.rlACAgentOptions]

要检查您的代理,请使用getAction从随机观察返回操作。

getAction(代理,{兰德(2,1)})
ans=1x1单元阵列{[0.6668]}

现在可以在环境中测试和培训代理。

在本例中,加载用于培训DQN员工平衡车杆系统实例

env=rlPredefinedEnv(“CartPole离散型”);

获取观察和行动信息。该环境有一个四维观测向量(小车位置和速度、极角和极角导数)和一个带有两个可能元素的标量作用(小车上施加的力为-10或+10 N)。

obsInfo=获取观测信息(env);actInfo=getActionInfo(env);

代理创建函数随机初始化演员和评论家网络。您可以通过固定随机生成器的种子来确保再现性。为此,请取消对以下行的注释。

%rng(0)

为评论家创建一个递归神经网络,使用sequenceInputLayer作为输入层,并包含第一层作为其他网络层之一。

[sequenceInputLayer(obsInfo.Dimension(1)),“正常化”,“没有”,“姓名”,“myobs”)第1层(8,“OutputMode”,“顺序”,“姓名”,“lstm”) fullyConnectedLayer (1,“姓名”,“临界CFC”));

设置批评家的选项并创建批评家表示(演员批评家代理使用值函数表示)。

criticOpts = rlRepresentationOptions (“LearnRate”, 8 e - 3,“梯度阈值”1);评论家= rlValueRepresentation (criticNetwork obsInfo,“观察”, {“myobs”}, criticOpts);

为演员创建一个神经网络。因为评论家有一个递归网络,演员也必须有一个递归网络。

actorNetwork=[sequenceInputLayer(obsInfo.Dimension(1),“正常化”,“没有”,“姓名”,“myobs”)第1层(8,“OutputMode”,“顺序”,“姓名”,“lstm”) fullyConnectedLayer(元素个数(actInfo.Elements),“姓名”,“行动”));

为评论家设置选项并创建演员表示

actorOpts=rlRepresentationOptions(“LearnRate”, 8 e - 3,“梯度阈值”,1); actor=rl随机性actor表示(actorNetwork、obsInfo、actInfo、,...“观察”, {“myobs”},actorOpts);

指定代理选项,并使用参与者、评论家和代理选项对象创建AC代理。由于代理使用递归神经网络,NumStepsToLookAhead为训练轨迹长度。

agentOpts=rlACAgentOptions(“NumStepsToLookAhead”32岁的“DiscountFactor”,0.99); 代理=代理(演员、评论家、代理);

要检查您的代理,请使用getAction从随机观察返回操作。

getAction(代理,{rand(obsInfo.Dimension)})
ans=1×1单元阵列{[-10]}

现在可以在环境中测试和培训代理。

提示

  • 对于连续动作空间rlACAgent对象不强制执行动作规范设置的约束,因此必须在环境中强制执行动作空间约束。

在R2019a中引入