主要内容

rlACAgent

行动者-批评家强化学习代理

描述

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

有关更多信息,请参见Actor-Critic代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

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

例子

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

例子

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

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

例子

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

指定代理选项

例子

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

输入参数

全部展开

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

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

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

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

对于连续的动作空间,必须指定actionInfo作为一个rlNumericSpec对象。

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

代理初始化选项,指定为rlAgentInitializationOptions对象。行动者-批评家代理不支持循环神经网络。金宝app

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

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

属性

全部展开

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

对象的功能

火车 在指定的环境中训练强化学习代理
sim卡 在指定的环境中模拟训练过的强化学习代理
getAction 从给定环境观察的代理或参与者表示中获得动作
getActor 从强化学习代理中获得参与者表示
setActor 设置强化学习代理的参与者表示
getCritic 从强化学习代理中获得批评表示
setCritic 设置强化学习代理的临界表示
generatePolicyFunction 创建评估强化学习代理训练策略的函数

例子

全部折叠

创建一个具有离散行动空间的环境,并获得其观察和行动规范。对于本例,加载示例中使用的环境使用深度网络设计器创建代理和使用图像观察训练.这个环境有两个观察结果:一个50乘50的灰度图像和一个标量(钟摆的角速度)。动作是一个标量,有五个可能的元素(扭矩为-)2,1,0,1,或2Nm适用于摆动杆)。

%负载预定义环境env = rlPredefinedEnv (“SimplePendulumWithImage-Discrete”);获得观察和行动规范obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

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

% rng (0)

根据环境观察和操作规范创建一个actor-批评家代理。

代理= rlACAgent (obsInfo actInfo);

要检查代理,请使用getAction从一个随机的观察中返回动作。

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

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

创造一个具有连续动作空间的环境,并获得其观察和动作规格。对于本例,加载示例中使用的环境利用图像观察训练DDPG代理上摆和平衡摆.这个环境有两个观察结果:一个50乘50的灰度图像和一个标量(钟摆的角速度)。动作是一个标量,表示从-连续范围内的扭矩22Nm。

%负载预定义环境env = rlPredefinedEnv (“SimplePendulumWithImage-Continuous”);获得观察和行动规范obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

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

initOpts = rlAgentInitializationOptions (“NumHiddenUnit”, 128);

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

% rng (0)

根据环境观察和操作规范创建一个actor-批评家代理。

代理= rlACAgent (obsInfo actInfo initOpts);

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

评论家= getCritic(代理);critic.Options.LearnRate = 1 e - 3;代理= setCritic(代理、批评);

从主体、行动者和批评家中提取深度神经网络。

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

显示临界网络的层数,验证每个隐藏的全连接层有128个神经元

criticNet。层
带有图层的图层数组: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完全连接128完全连接层9 input_2的图像输入和图像10“fc_2”完全连接128完全连接层11“输出”完全连接1完全'RepresentationLoss'回归输出均方误差

剧情演员和评论家网络

情节(actorNet)

情节(criticNet)

要检查代理,请使用getAction从一个随机的观察中返回动作。

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

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

创建一个具有离散动作空间的环境,并获得其观察和动作规格。对于本例,加载示例中使用的环境训练DQN代理平衡车杆系统.这个环境有一个四维的观察向量(车的位置和速度、极点角和极点角的导数)和一个包含两个可能元素的标量作用(力的任意一个-)10或+10N应用于推车)。

%负载预定义环境env = rlPredefinedEnv (“CartPole-Discrete”);%获得观测规格obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec属性:LowerLimit: -Inf UpperLimit: Inf名称:"CartPole States"描述:"x, dx, theta, dtheta"尺寸:[4 1]数据类型:"double"
%获取动作规格actInfo = getActionInfo (env)
元素:[-10 10]名称:"CartPole Action"描述:[0x0 string]尺寸:[1 1]数据类型:"double"

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

% rng (0)

创建一个批评家代表。

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

创建一个参与者表示。

%创建网络来用作actor中的近似器%必须具有4维输入和2维输出(动作)actorNetwork = [imageInputLayer([4 1 1],“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (2“名字”,“行动”));%设置参与者的选项actorOpts = rlRepresentationOptions (“LearnRate”, 8 e - 3,“GradientThreshold”1);创建参与者(参与者-批评家代理使用随机参与者表示)演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,“观察”,{“状态”}, actorOpts);

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

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

要检查代理,请使用getAction从一个随机的观察中返回动作。

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

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

创造一个具有连续动作空间的环境,并获得其观察和动作规格。对于本例,加载本例中使用的双积分器连续动作空间环境训练DDPG代理控制双积分器系统

%负载预定义环境env = rlPredefinedEnv (“DoubleIntegrator-Continuous”);%获得观测规格obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "states" Description: "x, dx" Dimension: [2 1] DataType: "double"
%获取动作规格actInfo = getActionInfo (env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "force" Description: [0x0 string] Dimension: [1 1] DataType: "double"

在本例中,动作是表示从-开始的力的标量输入22牛顿,所以最好相应地设置动作信号的上下限。当参与者的网络表示具有非线性输出层,需要相应地缩放以产生所需范围内的输出时,必须这样做。

确保行动空间的上限和下限是有限的actInfo.LowerLimit = 2;actInfo.UpperLimit = 2;

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

% rng (0)

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

创建一个网络,用来作为评价中的近似器。%,它必须以观测信号为输入,并产生一个标量值criticNet = [imageInputLayer([obsInfo.])]尺寸1],“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (10“名字”,“fc_in”) reluLayer (“名字”,“relu”) fullyConnectedLayer (1,“名字”,“出”));为评论家设置一些训练选项。criticOpts = rlRepresentationOptions (“LearnRate”, 8 e - 3,“GradientThreshold”1);从网络中创建批评家表示。评论家= rlValueRepresentation (criticNet obsInfo,“观察”,{“状态”}, criticOpts);

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

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

标准差必须是非负的,而平均值必须在输出范围内,这意味着网络必须有两条独立的路径。第一个路径是为平均值,任何输出非线性必须缩放,以产生输出范围内的输出。第二种路径是标准偏差,必须使用softplus或ReLU层来强制非负性。

%输入路径层(2 × 1输入和1 × 1输出)inPath = [imageInputLayer([obsInfo.])尺寸1],“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (10“名字”,“ip_fc”% 10由1输出reluLayer (“名字”,“ip_relu”%非线性fullyConnectedLayer (1,“名字”,“ip_out”));% 1 * 1输出%路径层为平均值(1 × 1输入和1 × 1输出)%使用scalingLayer缩放范围meanPath = [fullyConnectedLayer(15,“名字”,“mp_fc1”% 15由1输出reluLayer (“名字”,“mp_relu”%非线性fullyConnectedLayer (1,“名字”,“mp_fc2”);% 1 * 1输出tanhLayer (“名字”,的双曲正切);%输出范围:(-1,1)scalingLayer (“名字”,“mp_out”,“规模”actInfo.UpperLimit)];%输出范围:(-2N,2N)%路径层的标准偏差(1 × 1输入和输出)%使用软加层使输出非负sdevPath = [fulllyconnectedlayer (15,“名字”,“vp_fc1”% 15由1输出reluLayer (“名字”,“vp_relu”%非线性fullyConnectedLayer (1,“名字”,“vp_fc2”);% 1 * 1输出softplusLayer (“名字”,“vp_out”));%输出范围:(0,+Inf)连接两个输入(沿维度#3)以形成单个(2乘1)输出层支出= concatenationLayer (3 2“名字”,“mean&sdev”);%添加图层到layerGraph网络对象actorNet = layerGraph (inPath);actorNet = addLayers (actorNet meanPath);actorNet = addLayers (actorNet sdevPath);actorNet = addLayers (actorNet,支出);%连接层:平均值路径输出必须连接到连接层的第一个输入actorNet = connectLayers (actorNet,“ip_out”,“mp_fc1 /”);%连接inPath的输出到meanPath输入actorNet = connectLayers (actorNet,“ip_out”,“vp_fc1 /”);%连接inPath的输出到sdevPath的输入actorNet = connectLayers (actorNet,“mp_out”,“mean&sdev /三机一体”);%连接meanPath的输出到mean&sdev输入#1actorNet = connectLayers (actorNet,“vp_out”,“mean&sdev / in2”);%连接sdevPath的输出到mean&sdev输入#2%的阴谋网络情节(actorNet)

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

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

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

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

要检查代理,请使用getAction从一个随机的观察中返回动作。

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

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

提示

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

介绍了R2019a