创建政策和价值功能
强化学习策略是从当前环境观察到要采取的行动的概率分布的映射。价值函数是从当前环境观测到当前政策的期望值(长期累积回报)的映射。
强化学习代理使用参数化政策和价值函数,分别由称为参与者和批评者的函数近似器实现。在训练过程中,代理更新其参与者和批评者的参数,以最大化预期的累积长期奖励。
在创建非默认代理之前,必须使用近似模型(如深度神经网络、线性基函数或查找表)创建参与者和批评者。可以使用的函数近似器和模型的类型取决于想要创建的代理的类型。
您还可以从代理、参与者或批评者创建策略对象。您可以使用自定义循环训练这些对象,并将它们部署到应用程序中。
有关代理的更多信息,请参见强化学习代理.
演员和评论家
强化学习工具箱™软件支持以下类型的参与者和批评者:万博1manbetx
V(年代|θV)——根据某一特定的观察来估计预期累积长期回报的批评家年代.您可以使用
rlValueFunction
.问(年代,一个|θ问)——对某一特定行为的预期累积长期回报进行估计的批评家一个一个给定的观察结果年代.您可以使用
rlQValueFunction
.问我(年代,一个我|θ问-多输出批评家,估计所有可能的离散行为的预期累积长期回报一个我根据观察结果年代.您可以使用
rlVectorQValueFunction
.π(年代|θπ) -具有连续动作空间的参与者,根据给定的观察确定地选择动作年代.您可以使用
rlContinuousDeterministicActor
.π(年代|θπ) -基于给定观察随机选择动作(动作从概率分布中采样)的参与者年代.您可以使用任意一种方法创建这些actor
rlDiscreteCategoricalActor
(对于离散的动作空间)或rlContinuousGaussianActor
(对于连续的动作空间)。
每个近似器使用一组参数(θV,θ问,θπ),它们是在学习过程中计算的。
对于离散观察和离散操作数量有限的系统,可以将值函数存储在查找表中。对于具有许多离散的观察和操作的系统,以及连续的观察和操作空间,存储观察和操作是不切实际的。对于这样的系统,您可以使用深度神经网络或自定义(参数为线性)基函数来表示参与者和批评者。
下表总结了使用Reinforcement Learning Toolbox软件提供的六个近似器对象的方法,具体取决于环境的动作和观察空间,以及希望使用的近似模型和代理。
函数逼近器(行动者或批评家)如何在代理中使用
近似者(演员或评论家) | 万博1manbetx支持模型 | 观察太空 | 行动空间 | 万博1manbetx支持代理 |
---|---|---|---|---|
价值功能批评家V(年代),您可以使用 |
表格 | 离散 | 不适用 | Pg ac ppo |
深度神经网络或自定义基函数 | 离散的或连续的 | 不适用 | Pg ac ppo | |
深度神经网络 | 离散的或连续的 | 不适用 | TRPO | |
q值函数临界,问(年代,),您可以使用 |
表格 | 离散 | 离散 | Q, dqn, sarsa |
深度神经网络或自定义基函数 | 离散的或连续的 | 离散 | Q, dqn, sarsa | |
连续 | Ddpg, td3,囊 | |||
具有离散动作空间的多输出q值函数临界问(年代,),您可以使用 |
深度神经网络或自定义基函数 | 离散的或连续的 | 离散 | Q, dqn, sarsa |
具有连续行动空间的确定性策略参与者π(年代),您可以使用 |
深度神经网络或自定义基函数 | 离散的或连续的 | 连续 | DDPG, TD3 |
具有离散行动空间的随机政策行动者π(年代),您可以使用 |
深度神经网络或自定义基函数 | 离散的或连续的 | 离散 | Pg ac ppo |
深度神经网络 | 离散的或连续的 | 离散 | TRPO | |
具有连续行动空间的随机政策行动者π(年代),您可以使用 |
深度神经网络 | 离散的或连续的 | 连续 | Pg ac ppo sac trpo |
方法可以配置角色和评论家优化选项rlOptimizerOptions
对象中的代理选项对象。
具体来说,您可以创建一个代理选项对象并设置其CriticOptimizerOptions
而且ActorOptimizerOptions
属性要适当rlOptimizerOptions
对象。然后将代理选项对象传递给创建代理的函数。
或者,您可以创建代理,然后使用点表示法访问代理参与者和批评者的优化选项,例如:agent.AgentOptions.ActorOptimizerOptions.LearnRate = 0.1;
.
有关代理的更多信息,请参见强化学习代理.
策略对象
您可以从代理提取策略对象,也可以从参与者或批评者创建策略对象。然后你可以使用getAction
在给定输入观察的情况下,从策略中产生确定性或随机动作。与actor和批评家等函数近似器对象不同,策略对象没有可以用来轻松计算与参数相关的梯度的函数。因此,策略对象更适合应用程序部署,而不是培训。可选的策略对象如下表所示。
策略对象
策略对象和getAction 行为 |
分布与勘探 | 行动空间 | 用于创建的近似器对象 | 萃取所需药剂 |
---|---|---|---|---|
生成最大化离散动作空间q值函数的动作 |
确定性的(没有探索) | 离散 | rlQValueFunction 或rlVectorQValueFunction |
Q, dqn, sarsa |
产生一个动作,最大化离散的动作空间q值函数的概率 |
默认值:随机(随机行动有助于探索) | 离散 | rlQValueFunction 或rlVectorQValueFunction |
Q, dqn, sarsa |
生成连续的确定性动作 |
确定性的(没有探索) | 连续 | rlContinuousDeterministicActor |
DDPG, TD3 |
根据内部噪声模型生成带有附加噪声的连续确定性动作 |
默认值:随机(噪音有助于探索) | 连续 | rlContinuousDeterministicActor |
DDPG, TD3 |
根据概率分布产生随机动作 |
默认值:随机(随机行动有助于探索) |
离散 | rlDiscreteCategoricalActor |
Pg ac ppo trpo |
连续 | rlContinuousGaussianActor |
Pg ac ppo trpo囊 |
每个随机策略对象都有一个选项来启用确定性行为,从而禁用探索。除了rlEpsilonGreedyPolicy
而且rlAdditiveNoisePolicy
,你可以使用generatePolicyBlock
而且generatePolicyFunction
来生成一个Simulink万博1manbetx®块或函数,对给定的观察输入计算策略,返回操作。然后可以使用生成的函数或块为应用程序部署生成代码。有关更多信息,请参见部署训练有素的强化学习策略.
表模型
基于查找表模型的值函数逼近器(批评家)适用于具有有限数量的环境离散观察和行动。您可以创建两种类型的查找表:
值表,存储相应观察的奖励
q表,它存储相应的观察-动作对的奖励
方法创建一个值表或q表rlTable
函数。然后使用table对象作为两者的输入参数rlValueFunction
或rlQValueFunction
来创建近似器对象。
神经网络模型
您可以使用深度神经网络模型创建演员和批评家函数近似器。要做到这一点,需要使用深度学习工具箱™软件功能。
网络输入和输出尺寸
演员和评论家的网络输入和输出层的维度必须分别与相应的环境观察和行动通道的维度相匹配。从环境中获取动作和观察的规格env
,使用getActionInfo
而且getObservationInfo
函数,分别。
actInfo = getActionInfo(env);obsInfo = getObservationInfo(env);
访问维
属性。例如,获取第一个环境和动作通道的大小:
actSize = actInfo(1).尺寸;obsSize = obsInfo(1).尺寸;
在一般情况下actSize
而且obsSize
是行向量,其元素是相应维数的长度。例如,如果第一个观测通道是256 × 256的RGB图像,actSize
是向量[2562563]
.若要计算通道的总维度数,请使用刺激
.例如,假设环境只有一个观测通道:
obsDimensions = prod(obsInfo.Dimensions);
为rlVectorQValueFunction
批评家和rlDiscreteCategoricalActor
参与者,您需要获得操作集的可能元素的数量。可以通过访问元素
属性的操作通道。例如,假设环境只有一个操作通道:
actNumElements = numel(actInfo.Elements);
用于价值函数批评家的网络(例如AC、PG、PPO或TRPO代理中使用的网络)必须只接受观察结果作为输入,并且必须有单个标量输出。对于这些网络,输入层的尺寸必须与环境观测通道的尺寸匹配。有关更多信息,请参见rlValueFunction
.
用于单输出Q-值函数批评的网络(例如在Q、DQN、SARSA、DDPG、TD3和SAC代理中使用的网络)必须将观察和操作都作为输入,并且必须有单个标量输出。对于这些网络,输入层的维度必须与用于观察和操作的环境通道的维度相匹配。有关更多信息,请参见rlQValueFunction
.
用于多输出Q-值函数批判的网络(例如在Q、DQN和SARSA代理中使用的网络)只将观察结果作为输入,并且必须有一个输出层,其输出大小等于可能的离散动作的数量。对于这些网络,输入层的尺寸必须与环境观测通道的尺寸匹配。有关更多信息,请参见rlVectorQValueFunction
.
对于行动者网络,输入层的尺寸必须与环境观测通道的尺寸匹配,输出层的尺寸必须如下所示。
具有离散动作空间的行动者(如PG、AC和PPO代理中的行动者)中使用的网络必须具有单个输出层,其输出大小等于可能的离散动作的数量。有关更多信息,请参见
rlDiscreteCategoricalActor
.具有连续动作空间的确定性行动者(如DDPG和TD3代理中的行动者)中使用的网络必须具有单个输出层,其输出大小与环境动作规范中定义的动作空间的维度相匹配。有关更多信息,请参见
rlContinuousDeterministicActor
.在具有连续动作空间的随机行为体中使用的网络(例如PG、AC、PPO和SAC代理中的网络)必须有两个输出层,每个输出层的元素数量与环境规范中定义的动作空间的维数相同。一个输出层必须生成平均值(必须缩放到动作的输出范围),另一个输出层必须生成动作的标准偏差(必须是非负的)。有关更多信息,请参见
rlContinuousGaussianActor
.
深度神经网络
深度神经网络由一系列相互连接的层组成。你可以指定一个深度神经网络如下所示:
的数组
层
对象
请注意
在不同的网络对象中,dlnetwork
首选,因为它具有内置的验证检查并支持自动区分。万博1manbetx如果传递另一个网络对象作为输入参数,它将在内部转换为dlnetwork
对象。但是,最佳实践是将其他网络对象转换为dlnetwork
显式地之前使用它为强化学习代理创建一个批评家或参与者。你可以使用dlnet = dlnetwork(净)
,在那里网
是深度学习工具箱中的任何神经网络对象。由此产生的dlnet
是dlnetwork
你用来形容你的评论家或演员的对象。这种做法允许对转换不直接且可能需要额外规范的情况进行更高级别的洞察和控制。
通常情况下,你构建神经网络的方法是将一系列的层堆叠在一起层
对象,可能将这些数组添加到layerGraph
对象,然后将最终结果转换为dlnetwork
对象。
对于需要多个输入或输出层的代理,可以创建一个数组层
每个输入路径(观察或操作)和每个输出路径(估计奖励或操作)的对象。然后将这些数组添加到layerGraph
对象并将它们的路径连接在一起connectLayers
函数。
你也可以创建你的深度神经网络深度网络设计器例如,请参见使用深度网络设计器创建代理和使用图像观察训练.
下表列出了强化学习应用程序中使用的一些常见的深度学习层。有关可用层的完整列表,请参见深度学习层列表.
层 | 描述 |
---|---|
featureInputLayer |
输入特征数据并应用归一化 |
imageInputLayer |
输入矢量和二维图像并应用归一化。 |
sigmoidLayer |
对输入应用sigmoid函数,使输出在区间(0,1)内有界。 |
tanhLayer |
对输入应用双曲切线激活层。 |
reluLayer |
将小于零的输入值设置为零。 |
fullyConnectedLayer |
将输入向量乘以一个权重矩阵,并添加一个偏置向量。 |
softmaxLayer |
对输入应用一个softmax函数层,将其归一化为一个概率分布。 |
convolution2dLayer |
对输入应用滑动卷积滤波器。 |
additionLayer |
将多层的输出加在一起。 |
concatenationLayer |
沿着指定的维度连接输入。 |
sequenceInputLayer |
向网络提供输入序列数据。 |
lstmLayer |
对输入应用长短期记忆层。万博1manbetx支持DQN和PPO代理。 |
的bilstmLayer
而且batchNormalizationLayer
强化学习不支持层。万博1manbetx
强化学习工具箱软件提供以下层,其中不包含可调参数(即在训练过程中更改的参数)。
层 | 描述 |
---|---|
scalingLayer |
对输入数组应用线性缩放和偏置。此层用于缩放和移动非线性层的输出,例如tanhLayer 而且sigmoidLayer . |
quadraticLayer |
创建由输入数组的元素构造的二次单项式向量。当您需要输出是其输入的二次函数时,例如对于LQR控制器,此层非常有用。 |
softplusLayer |
实现softplus激活Y= log(1 + eX),这保证了输出总是正的。这个函数是整流线性单元(ReLU)的平滑版本。 |
您还可以创建自己的自定义层。有关更多信息,请参见定义自定义深度学习层.
在创建深度神经网络时,最好为每个输入路径的第一层和输出路径的最后一层指定名称。
以下代码创建并连接以下输入和输出路径:
一个观测输入路径,
observationPath
,第一个层命名为“观察”
.一个动作输入路径,
actionPath
,第一个层命名为“行动”
.估计值函数输出路径,
commonPath
的输出observationPath
而且actionPath
作为输入。这条路径的最后一层被命名“输出”
.
observationPath = [featureInputLayer(4,“归一化”,“没有”,“名字”,“myobs”) fullyConnectedLayer(24日“名字”,“CriticObsFC1”) reluLayer (“名字”,“CriticRelu1”) fullyConnectedLayer(24日“名字”,“CriticObsFC2”));actionPath = [featureInputLayer(1,“归一化”,“没有”,“名字”,“myact”) fullyConnectedLayer(24日“名字”,“CriticActFC1”));commonPath = [additionLayer(2,“名字”,“添加”) reluLayer (“名字”,“CriticCommonRelu”) fullyConnectedLayer (1,“名字”,“输出”));criticNetwork = layerGraph(observationPath);关键网络= addLayers(关键网络,actionPath);criticNetwork = addLayers(criticNetwork,commonPath);关键网络= connectLayers(关键网络,“CriticObsFC2”,“添加/三机一体”);关键网络= connectLayers(关键网络,“CriticActFC1”,“添加/ in2”);criticNetwork = dlnetwork(criticNetwork);
对于所有的观察和操作输入路径,必须指定afeatureInputLayer
作为第一层中的路径,用个数等于输入神经元个数的维度对应的环境通道。
可以查看深度神经网络的结构情节
函数。
情节(layerGraph (criticNetwork))
由于网络的输出rlDiscreteCategoricalActor
参与者必须代表执行每个可能动作的概率,软件自动添加一个softmaxLayer
作为最终输出层,如果您没有明确指定它。在计算动作时,参与者然后对分布进行随机抽样以返回动作。
为深度神经网络确定层的数量、类型和大小可能是困难的,并且依赖于应用程序。然而,在决定函数逼近器的特性时,最关键的部分是它是否能够为您的应用程序逼近最优策略或贴现值函数,也就是说,它是否具有可以正确学习您的观察、行动和奖励信号的特征的层。
在构建人际网络时,考虑以下建议。
对于连续的动作空间,用
tanhLayer
后面跟着aScalingLayer
如有必要,将行动扩展到所需的值。深度密集网络
reluLayer
层可以很好地近似许多不同的函数。因此,它们通常是一个很好的首选。从你认为可以近似最优策略或价值函数的最小网络开始。
当近似强非线性或具有代数约束的系统时,添加更多层通常比增加每层输出的数量更好。一般来说,近似器表示更复杂(合成)函数的能力仅随层的大小呈多项式增长,但随层的数量呈指数增长。换句话说,更多的层允许逼近更复杂和非线性的组合函数,尽管这通常需要更多的数据和更长的训练时间。给定神经元的总数和类似的近似任务,层数较少的网络可能需要指数级更多的单元才能成功地近似同一类函数,并且可能无法正确地学习和归纳。
对于策略上的代理(只从遵循当前策略时收集的经验中学习的代理),如AC和PG代理,如果您的网络很大(例如,一个网络有两个隐含层,每个隐含层有32个节点,有几百个参数),那么并行训练效果更好。策略上并行更新假设每个工作者更新网络的不同部分,例如当他们探索观察空间的不同区域时。如果网络很小,工作者更新会彼此关联,使训练不稳定。
从神经网络创建和配置演员和评论家
要从你的深度神经网络创建一个评论家,使用rlValueFunction
,rlQValueFunction
或者(只要可能)rlVectorQValueFunction
对象。要从深度神经网络为连续动作空间创建确定性参与者,请使用rlContinuousDeterministicActor
对象。要从你的深度神经网络中创建一个随机参与者,可以使用rlDiscreteCategoricalActor
或者一个rlContinuousGaussianActor
对象。要配置参与者或批评者使用的学习率和优化,请在代理选项对象中使用优化器对象。
例如,为评论网络创建一个Q-value函数对象criticNetwork
.然后创建一个批评家优化器对象criticOpts
指定的学习率0.02
梯度阈值1
.
评论= rlQValueFunction(批评网络,obsInfo,actInfo,...“观察”, {“观察”},“行动”, {“行动”});criticOpts = rlotimizeroptions (“LearnRate”, 0.02,...“GradientThreshold”1);
然后创建一个代理选项对象,并设置CriticOptimizerOptions
的代理选项对象的criticOpts
.最后创建代理时,将代理选项对象作为最后一个输入参数传递给代理构造函数。
当您创建深度神经网络并配置参与者或评论家时,请考虑使用以下方法作为起点。
从尽可能小的网络和较高的学习率开始(
0.01
).训练这个初始网络,看看代理是否会迅速收敛到一个糟糕的策略,或者以随机的方式行事。如果出现上述任何一个问题,请通过在每个层上添加更多层或更多输出来重新调整网络。你的目标是找到一个足够大的网络结构,它不会学得太快,并且在最初的训练期后显示出学习的迹象(奖励图的改善轨迹)。一旦确定了良好的网络体系结构,较低的初始学习率可以让您看到代理是否在正确的轨道上,并帮助您检查网络体系结构对问题是否满意。较低的学习率使参数调优更容易,特别是对于困难的问题。
此外,在配置深度神经网络代理时,请考虑以下提示。
对DDPG和DQN代理要有耐心,因为它们可能在早期发作的一段时间内没有学到任何东西,而且它们通常在训练过程的早期表现出累积奖励的下降。最终,在最初的几千集之后,它们可以显示出学习的迹象。
对于DDPG和DQN制剂,促进制剂的探索至关重要。
对于同时拥有演员和评论家网络的代理,将演员和评论家的初始学习率设置为相同的值。但是,对于某些问题,将批评家的学习率设置为高于actor的学习率,可以提高学习效果。
循环神经网络
在创建用于除Q和SARSA之外的任何代理的actor或批评家时,可以使用循环神经网络(RNN)。这些网络是深度神经网络sequenceInputLayer
输入层和至少一个具有隐藏状态信息的层,例如lstmLayer
.当环境的状态不能包含在观察向量中时,它们特别有用。
对于同时拥有演员和评论家的代理,您必须对他们都使用RNN,或者不对他们中的任何一个使用RNN。您不能只对评论家或演员使用RNN。
当使用PG代理时,RNN的学习轨迹长度为整集。对于AC座席,NumStepsToLookAhead
其options对象的属性被视为训练轨迹长度。对于PPO制剂,弹道长度是MiniBatchSize
属性的选项对象。
对于DQN, DDPG, SAC和TD3,必须将轨迹训练的长度指定为大于1的整数SequenceLength
属性的选项对象。
注意,对于连续动作空间PG、AC、PPO和TRPO代理,以及使用循万博1manbetx环神经网络(RNN)的SAC代理,或者任何具有多个输入路径并在任意路径中包含RNN的代理,都不支持代码生成。
有关策略和值函数的更多信息和示例,请参见rlValueFunction
,rlQValueFunction
,rlVectorQValueFunction
,rlContinuousDeterministicActor
,rlDiscreteCategoricalActor
,rlContinuousGaussianActor
.
自定义基函数模型
自定义(线性中参数)基函数近似模型有形式f = W'B
,在那里W
是权重数组和B
必须创建的自定义基函数的列向量输出。线性基函数的可学习参数是的元素W
.
对于价值函数批评(如AC、PG或PPO代理中使用的批评),f
是标量值,那么W
必须是与?长度相同的列向量B
,B
一定是观察的结果。有关更多信息和示例,请参见rlValueFunction
.
对于单输出Q-值函数批评家(例如在Q、DQN、SARSA、DDPG、TD3和SAC代理中使用的),f
是标量值,那么W
必须是与?长度相同的列向量B
,B
必须是观察和行动的共同作用。有关更多信息和示例,请参见rlQValueFunction
.
对于具有离散动作空间的多输出Q-值函数批评(例如在Q、DQN和SARSA代理中使用的那些),f
是一个具有与可能操作数量相同的元素的向量。因此W
必须是一个矩阵,它的列数和可能的动作的数量一样多,行数和长度一样多B
.B
肯定只是观察的作用。有关更多信息和示例,请参见rlVectorQValueFunction
.
对于具有连续动作空间的确定性行动者(如DDPG和TD3中的行动者),的维度
f
必须匹配代理操作规范的维度,该规范要么是标量,要么是列向量。有关更多信息和示例,请参见rlContinuousDeterministicActor
.对于具有离散作用空间的随机作用体(如PG、AC和PPO作用体),
f
必须是长度等于可能的离散动作数量的列向量。actor的输出为softmax (f)
,表示选择每个可能动作的概率。有关更多信息和示例,请参见rlDiscreteCategoricalActor
.对于具有连续动作空间的随机参与者,不能依赖自定义基函数(他们只能使用神经网络近似器,因为需要强制标准偏差为正)。有关更多信息和示例,请参见
rlContinuousGaussianActor
.
对于任何演员来说,W
必须有和元素数量一样多的列f
,并且行数与其中元素的数量相同B
.B
肯定只是观察的作用。
有关训练使用线性基函数的定制代理的示例,请参见培训自定义LQR代理.
创建代理
一旦创建了参与者和批评者,就可以创建使用它们的强化学习代理。例如,使用给定的演员和评论家(基线)网络创建PG代理。
agentOpts = rlPGAgentOptions(“UseBaseline”,真正的);agent = rlpagent (actor,baseline,agentOpts);
有关不同类型的强化学习代理的更多信息,请参见强化学习代理.
可以从现有的代理中使用getActor
而且getCritic
,分别。
还可以使用设置现有代理的参与者和批评家setActor
而且setCritic
,分别。行动者和批评家的输入和输出层必须与原始代理的观察和行动规范相匹配。