主要内容

rlPGAgent

策略梯度强化学习代理

描述

策略梯度(PG)算法是一种无模型的在线策略强化学习方法。PG代理是一种基于策略的强化学习代理,它使用强化算法直接计算使长期回报最大化的最优策略。行动空间可以是离散的,也可以是连续的。

有关PG代理和增强算法的更多信息,请参阅政策梯度代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

从观察和操作规范中创建代理

实例

代理人=rlPGAgent(观察税收,ActionInfo.)使用默认初始化选项为具有给定观察和操作规范的环境创建策略梯度代理。代理中的参与者和批评家表示使用根据观察规范构建的默认深度神经网络观察税收以及动作规范ActionInfo.

实例

代理人=rlPGAgent(观察税收,ActionInfo.,初学者)为具有给定观察和操作规范的环境创建策略梯度代理。该代理使用默认网络,其中每个隐藏的完全连接层都有在初学者对象。政策梯度代理不支持经常性的神经网络。金宝app有关初始化选项的详细信息,请参阅rlagentinitializationOptions.

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

代理人=rlPGAgent(演员)使用指定的参与者网络创建PG代理。默认情况下umermbaseline.代理人的财产为:错误的在这种情况下。

代理人=rlPGAgent(演员,评论家)创建一个有特定演员和评论家网络的PG经纪人。默认情况下,umermbaseline.选择是真正的在这种情况下。

指定代理选项

实例

代理人=rlPGAgent(___,代理)创建一个PG代理并设置代理选项财产归代理输入参数。在上一个语法中的任何输入参数后使用此语法。

输入参数

全部展开

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

您可以提取观察税收从现有环境或代理使用getObservationInfo.您还可以使用以下方法手工构造规范rlfinitesetspec.rlNumericSpec

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

对于离散动作空间,必须指定ActionInfo.作为一个rlfinitesetspec.对象。

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

您可以提取ActionInfo.从现有环境或代理使用getActionInfo.您还可以使用rlfinitesetspec.rlNumericSpec

代理初始化选项,指定为一个rlagentinitializationOptions.对象。政策梯度代理不支持经常性的神经网络。金宝app

角色网络表示,指定为rlStochasticActorRepresentation.有关创建演员表示的更多信息,请参阅创建策略和值函数表示

评论网络表示,指定为rlvalueerepresentation对象。有关创建批评识别的更多信息,请参阅创建策略和值函数表示

特性

全部展开

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

目标函数

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

例子

全部折叠

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

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

代理创建函数随机初始化参与者和批评者网络。您可以通过固定随机生成器的种子来确保重现性。为此,取消下面一行的注释。

% rng (0)

根据环境观察和操作规范创建策略梯度代理。

代理= rlPGAgent (obsInfo actInfo);

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

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

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

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

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

创建代理初始化选项对象,指定网络中的每个隐藏的完全连接图层必须具有128.神经元(而不是默认的数字,256.).策略梯度代理不支持递归网络,因此设置金宝appUseRNN选项真正的创建代理时生成错误。

Initopts = rlagentinitializationOptions(“NumHiddenUnit”, 128);

代理创建函数随机初始化参与者和批评者网络。您可以通过固定随机生成器的种子来确保重现性。为此,取消下面一行的注释。

% rng (0)

根据环境观察和操作规范创建策略梯度代理。

代理= rlpgagent(Obsinfo,Actinfo,Enitopts);

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

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

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

ActORNET = GetModel(GetAttor(代理));批评= getModel(accritic(代理));

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

临界层
ans = 11x1图层数组:1“input_1”图像输入50 x50x1图片2 conv_1卷积64 3 x3x1旋转步[1]和填充[0 0 0 0]3‘relu_input_1 ReLU ReLU 4 fc_1完全连接128完全连接层5“input_2”功能输入1功能6 fc_2完全连接128完全连接层7的concat串联连接2输入dimension 1 8 'relu_body' ReLU ReLU 9 'fc_body' Fully Connected 128 Fully Connected layer 10 'body_output' ReLU ReLU 11 'output' Fully Connected 1 Fully Connected layer

情节演员和批评网络

绘图(层图(ActorRounet))

图包含轴对象。轴对象包含Type Graphplot的对象。

情节(layerGraph (criticNet))

图包含轴对象。轴对象包含Type Graphplot的对象。

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

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

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

创建具有离散动作空间的环境,并获得其观察和操作规范。对于本示例,请加载示例中使用的环境用基线训练PG Agent控制双积分器系统.从环境中观察到的是一个包含质量的位置和速度的矢量。这个作用是一个标量,表示施加在质量上的力,有三个可能的值(-)2.,0, 或者2.牛顿)。

加载预定义环境env=rlPredefinedEnv(“DoubleIntegrator-Discrete”);%获取观察和规格信息obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

创建批评者表示用作基线。

%创建一个网络用作潜在的评论家近似器baselineNetwork=[imageInputLayer([obsInfo.Dimension(1)1],“归一化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (8,“姓名”,“基线FC”)雷卢耶(“姓名”,“CriticRelu1”)全康连接层(1,“姓名”,'BaselineFC2','biaslearnratefactor',0)];%为评论家设置一些选项baselineOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);%基于网络逼近器创建批评家基线=rlValueRepresentation(基线网络、obsInfo、,'观察',{“状态”},基线选项);

创建一个参与者表示。

%创建一个用于用作底层演员近似器的网络[obsInfo.Dimension(1) 1],“归一化”,“没有”,“姓名”,“状态”)全连接列(Numel(Actinfo.Elements),“姓名”,“行动”,'biaslearnratefactor',0)];%为演员设置一些选项actorOpts=rlRepresentationOptions(“LearnRate”, 5 e - 3,“GradientThreshold”1);基于网络近似器创建参与者演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,......'观察',{“状态”},actorOpts);

指定代理选项,并使用环境、actor和评论家创建一个PG代理。

agentOpts = rlPGAgentOptions (......“UseBaseline”,真的,......“DiscountFactor”, 0.99);代理= rlPGAgent(演员、基线、agentOpts)
Agent = RLPGagent具有属性:AgentOptions:[1x1 rl.option.rlpgagentoptions]

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

GetAction(代理,{rand(2,1)})
ans =1 x1单元阵列{[2]}

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

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

加载预定义环境env=rlPredefinedEnv(“DoubleIntegrator-Continuous”);%获取观测规范信息obsInfo = getObservationInfo (env)
ObsInfo = rlnumericspec具有属性:lowermit:-inf上唇:inf名称:“状态”描述:“x,dx”尺寸:[2 1]数据类型:“double”
%获取操作规范信息actInfo=getActionInfo(环境)
属性:LowerLimit: -Inf UpperLimit: Inf Name: "force" Description: [0x0 string] Dimension: [1 1] DataType: "double"

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

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

创建要用作基线的批评家表示。策略梯度代理使用rlvalueerepresentation基线。对于连续观测空间,可以使用深度神经网络或自定义基表示。对于本例,创建一个深度神经网络作为底层近似器。

%创建一个网络用作潜在的评论家近似器baselineNetwork = [imageInputLayer([obsInfo. baselineNetwork])]尺寸1],“归一化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (8,“姓名”,'BaselineFC1')雷卢耶(“姓名”,“Relu1”)全康连接层(1,“姓名”,'BaselineFC2','biaslearnratefactor',0)];为评论家设置一些训练选项baselineOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);%基于网络逼近器创建批评家基线=rlValueRepresentation(基线网络、obsInfo、,'观察',{“状态”},基线选项);

政策梯度代理使用arlStochasticActorRepresentation.对于连续动作空间随机参与者,只能使用神经网络作为基础近似器。

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

标准偏差必须是非负的事实,而平均值必须落在输出范围内,这意味着网络必须具有两个单独的路径。第一路径是用于平均值,并且必须缩放任何输出非线性,以便它可以在输出范围内产生输出。第二条路径是差异,并且您必须使用SoftPlus或Relu层来强制非负性。

%输入路径层(2×1输入,1×1输出)inPath = [imageInputLayer([obsInfo. inPath])]尺寸1],“归一化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (10“姓名”,'ip_fc')% 10 × 1输出雷卢耶(“姓名”,“ip_relu”)%非线性fullyConnectedLayer (1,“姓名”,'ip_out')];%1乘1输出%平均值的路径层(1×1输入和1×1输出)%使用scalingLayer缩放范围meanPath = [fulllyconnectedlayer (15,“姓名”,“mp_fc1”)%15乘1输出雷卢耶(“姓名”,'mp_relu')%非线性fullyConnectedLayer (1,“姓名”,“mp_fc2”);%1乘1输出Tanhlayer(“姓名”,的双曲正切);%输出范围:(-1,1)scalingLayer (“姓名”,“mp_out”,“规模”,actInfo.上限];%输出范围:(-2n,2n)%路径层的标准偏差(1 × 1输入和输出)%使用softplus图层使其非负sdevpath = [全连接列(15,“姓名”,'vp_fc1')%15乘1输出雷卢耶(“姓名”,“vp_relu”)%非线性fullyConnectedLayer (1,“姓名”,“vp_fc2”);%1乘1输出softplusLayer (“姓名”,'vp_out')];%输出范围:(0,+ INF)将两个输入(沿维度#3)连接起来,形成单个(2 × 1)输出层outLayer=连接层(3,2,“姓名”,“mean&sdev”);添加层到layerGraph网络对象ACTORNET = DILLERGRAGH(INPATH);ActorNet = Addlayers(ActorRornet,意思);ACTORNET = AddLayers(ACTORNET,SDEVPATH);ActorNet = Addlayers(Actornet,Outayer);%Connect图层:平均值路径输出必须连接到替代层的第一个输入actorNet=连接层(actorNet,'ip_out','mp_fc1 /');%连接inPath的输出到meanPath的输入actorNet=连接层(actorNet,'ip_out',“vp_fc1 /”);%连接inPath的输出到variancePath的输入actorNet=连接层(actorNet,“mp_out”,“mean&sdev /三机一体”);%将meanPath的输出连接到mean&sdev输入#1actorNet=连接层(actorNet,'vp_out',“mean&sdev / in2”);%连接sdevPath的输出到mean&sdev input #2%绘图网络情节(actorNet)

图包含轴对象。轴对象包含Type Graphplot的对象。

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

%为演员设置一些选项actorOpts=rlRepresentationOptions(“LearnRate”, 5 e - 3,“GradientThreshold”1);基于网络近似器创建参与者Actor = rlstochasticRepresentation(Actornet,Obsinfo,Actinfo,......'观察',{“状态”},actorOpts);

指定代理选项,并使用actor、baseline和agent选项创建PG代理。

agentOpts = rlPGAgentOptions (......“UseBaseline”,真的,......“DiscountFactor”, 0.99);代理= rlPGAgent(演员、基线、agentOpts)
Agent = RLPGagent具有属性:AgentOptions:[1x1 rl.option.rlpgagentoptions]

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

GetAction(代理,{rand(2,1)})
ans =1 x1单元阵列{[0.0347]}

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

对于本示例,请加载示例中使用的环境用基线训练PG Agent控制双积分器系统.从环境中观察到的是一个包含质量的位置和速度的矢量。该动作是表示应用于质量的力的标量,具有三种可能的值(-2,0或2牛顿)。

env=rlPredefinedEnv(“DoubleIntegrator-Discrete”);

获取观察和规格信息。

obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

创建批评家表示以用作基线。要为批评家创建递归神经网络,请使用sequenceInputlayer.作为输入层并包括一个lstmLayer作为其他网络层之一。

baselinenetwork = [sequenceInputlayer(Obsinfo.dimension(1),“归一化”,“没有”,“姓名”,'myobs') fullyConnectedLayer (8,“姓名”,“基线FC”)第1层(8,'OutputMode',“顺序”,“姓名”,'lstm')雷卢耶(“姓名”,“CriticRelu1”)全康连接层(1,“姓名”,'BaselineFC2','biaslearnratefactor',0)];

为评论家设置一些选项。

baselineOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

基于网络近似器创建批评家。

基线=rlValueRepresentation(基线网络、obsInfo、,'观察',{'myobs'},基线选项);

创建一个参与者表示。既然评论家有一个循环网络,那么演员也必须有一个循环网络。

为参与者定义一个递归神经网络。

actorNetwork=[sequenceInputLayer(obsInfo.Dimension(1),“归一化”,“没有”,“姓名”,'myobs')第1层(8,'OutputMode',“顺序”,“姓名”,'lstm')全连接列(Numel(Actinfo.Elements),“姓名”,“行动”,'biaslearnratefactor',0)];

设置参与者选项并创建参与者。

actorOpts=rlRepresentationOptions(“LearnRate”, 5 e - 3,“GradientThreshold”1);演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,......'观察',{'myobs'},actorOpts);

指定代理选项,并使用环境、actor和评论家创建一个PG代理。

agentOpts = rlPGAgentOptions (......“UseBaseline”,真的,......“DiscountFactor”, 0.99);代理= rlPGAgent(演员、基线、agentOpts);

对于具有递归神经网络的PG-agent,训练序列长度是整个事件的长度。

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

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

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

提示

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

在R2019a中引入