创建策略和价值功能
强化学习策略是从当前环境观察到要采取的行动的概率分布的映射。在训练过程中,智能体调整其策略的参数以最大化预期的累积长期奖励。
强化学习代理分别使用称为参与者和批评者的函数近似器来估计策略和价值函数。参与者表示根据当前观察选择要采取的最佳操作的策略。批评家代表价值函数,它估计当前政策的预期累积长期回报。
在创建代理之前,必须使用近似模型(如深度神经网络、线性基函数或查找表)创建演员和评论家。所使用的函数逼近器和模型的类型取决于要创建的代理的类型。
有关代理的更多信息,请参见强化学习代理.
演员和评论家
强化学习工具箱™软件支持以下类型的演员和评论家:金宝app
V(年代|θV)——根据给定的观察估计预期的累积长期回报的评论家年代.您可以使用
rlValueFunction
.问(年代,一个|θ问)——对给定离散行为的预期累积长期回报进行估计的批评家一个一个给定的观察年代.您可以使用
rlQValueFunction
.问我(年代,一个我|θ问) -多产出评论家,估计所有可能的离散行为的预期累积长期回报一个我根据观察结果年代.您可以使用
rlVectorQValueFunction
.μ(年代|θμ) -具有连续动作空间的参与者,根据给定的观察结果确定地选择动作年代.您可以使用
rlContinuousDeterministicActor
.μ(年代|θμ-基于给定观察随机选择行动的参与者(从概率分布中抽取行动)年代.您可以使用任意一种方法创建这些角色
rlDiscreteCategoricalActor
(用于离散的活动空间)或rlContinuousGaussianActor
(用于连续动作空间)。
每个近似器使用一组参数(θV,θ问,θμ),这是在学习过程中计算出来的。
对于具有有限数量的离散观察和离散操作的系统,您可以将值函数存储在查找表中。对于具有许多离散观察和动作以及连续观察和动作空间的系统,存储观察和动作是不切实际的。对于这样的系统,你可以使用深度神经网络或自定义(参数线性)基函数来表示演员和评论家。
下表总结了您可以使用强化学习工具箱软件中可用的六个近似器对象的方式,这取决于您的环境的动作和观察空间,以及您想要使用的近似模型和代理。
函数逼近器(演员或评论家)如何在代理中使用
近似师(演员或评论家) | 金宝app支持模型 | 观察太空 | 行动空间 | 金宝app支持代理 |
---|---|---|---|---|
价值函数批评家V(年代),创建时使用 |
表格 | 离散 | 不适用 | Pg ac ppo trpo |
深度神经网络或自定义基函数 | 离散的还是连续的 | 不适用 | Pg, ac, ppo | |
q值函数批评家,问(,)你可以使用 |
表格 | 离散 | 离散 | Q, dqn, sarsa |
深度神经网络或自定义基函数 | 离散的还是连续的 | 离散 | Q, dqn, sarsa | |
连续 | Ddpg td3 sac | |||
具有离散作用空间的多输出q值函数批评家问(,),创建时使用 |
深度神经网络或自定义基函数 | 离散的还是连续的 | 离散 | Q, dqn, sarsa |
具有连续动作空间的确定性策略参与者π(S),创建时使用 |
深度神经网络或自定义基函数 | 离散的还是连续的 | 连续 | DDPG, TD3 |
具有离散动作空间的随机策略参与者π(S),创建时使用 |
深度神经网络或自定义基函数 | 离散的还是连续的 | 离散 | Pg ac ppo trpo |
具有连续作用空间的随机政策参与者π(S),创建时使用 |
深度神经网络 | 离散的还是连续的 | 连续 | Pg, ac, ppo, trpo, sac |
方法配置演员和评论家优化选项rlOptimizerOptions
对象中的代理选项对象。
有关代理的更多信息,请参见强化学习代理.
表模型
基于查找表模型的近似器(批评器)适用于数量有限的环境离散观察和行动。您可以创建两种类型的查找表:
值表,存储相应观察的奖励
q表,存储相应的观察-行动对的奖励
属性创建一个值表或q表rlTable
函数。然后使用table对象作为输入参数rlValueFunction
或rlQValueFunction
创建近似器对象。
神经网络模型
您可以使用深度神经网络模型创建演员和评论家函数近似器。这样做使用深度学习工具箱™软件功能。
网络输入和输出尺寸
演员和评论家的网络输入和输出层的维度必须分别与相应的环境观察和行动通道的维度相匹配。从环境中获取动作和观察规范env
,使用getActionInfo
和getObservationInfo
函数,分别。
actInfo = getActionInfo(env);obsInfo = getObservationInfo(env);
访问维
每个通道的属性。例如,获取第一个环境和行动通道的大小:
actSize = actInfo(1).Dimensions;obsSize = obsInfo(1).Dimensions;
在一般情况下actSize
和obsSize
是行向量,其元素是相应维的长度。例如,如果第一个观察通道是256 × 256的RGB图像,actSize
是矢量[256 256 3]
.要计算通道的总维度数,请使用刺激
.例如,假设环境只有一个观测通道:
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
是首选,因为它具有内置的验证检查并支持自动区分。金宝app如果传递另一个网络对象作为输入参数,它将在内部转换为dlnetwork
对象。但是,最佳实践是将其他网络对象转换为dlnetwork
显式地之前用它来为强化学习代理创建评论家或演员。您可以使用dlnet = dlnetwork(净)
,在那里网
是深度学习工具箱中的任何神经网络对象。由此产生的dlnet
是dlnetwork
你用来形容评论家或演员的对象。对于转换不直接且可能需要额外规范的情况,这种实践允许更深入的了解和控制。
通常,你通过在数组中堆叠一些层来构建神经网络层
对象,可能将这些数组添加到layerGraph
对象,然后将最终结果转换为dlnetwork
对象。
对于需要多个输入或输出层的代理,可以创建一个数组层
每个输入路径(观察或行动)和每个输出路径(估计奖励或行动)的对象。然后将这些数组加到a中layerGraph
对象,并使用connectLayers
函数。
创建深度神经网络深度网络设计器app。使用示例请参见使用深度网络设计器创建代理并使用图像观察进行训练.
下表列出了强化学习应用中常用的一些深度学习层。有关可用层的完整列表,请参见深度学习层列表.
层 | 描述 |
---|---|
featureInputLayer |
输入特征数据并应用规范化 |
imageInputLayer |
输入矢量和二维图像并应用归一化。 |
sigmoidLayer |
对输入应用sigmoid函数,使输出在区间(0,1)内有界。 |
tanhLayer |
对输入应用双曲正切激活层。 |
reluLayer |
将任何小于零的输入值设置为零。 |
fullyConnectedLayer |
将输入向量乘以一个权重矩阵,并加上一个偏置向量。 |
softmaxLayer |
对输入应用softmax函数层,将其归一化为概率分布。 |
convolution2dLayer |
对输入应用滑动卷积滤波器。 |
additionLayer |
将多个图层的输出加在一起。 |
concatenationLayer |
沿着指定的维度连接输入。 |
sequenceInputLayer |
向网络提供输入序列数据。 |
lstmLayer |
将长短期记忆层应用于输入。金宝app支持DQN和PPO代理。 |
的bilstmLayer
和batchNormalizationLayer
层不支持强化学习。金宝app
强化学习工具箱软件提供了以下层,其中不包含可调参数(即在训练过程中改变的参数)。
层 | 描述 |
---|---|
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);criticNetwork = addLayers(criticNetwork,actionPath);criticNetwork = addLayers(criticNetwork,commonPath);临界网络= connectLayers(临界网络,“CriticObsFC2”,“添加/三机一体”);临界网络= connectLayers(临界网络,“CriticActFC1”,“添加/ in2”);criticNetwork = dlnetwork(criticNetwork);
对于所有观察和动作输入路径,必须指定featureInputLayer
作为路径中的第一层,输入神经元的个数等于相应环境通道的维数。
您可以查看您的深度神经网络的结构使用情节
函数。
情节(layerGraph (criticNetwork))
由于网络的输出在anrlDiscreteCategoricalActor
参与者必须表示执行每个可能动作的概率,软件会自动添加一个softmaxLayer
作为最终输出层,如果您没有明确指定它。当计算动作时,参与者然后随机采样分布以返回一个动作。
确定深度神经网络层的数量、类型和大小可能很困难,并且取决于应用程序。然而,决定函数逼近器特征的最关键因素是它是否能够近似应用程序的最优策略或贴现值函数,也就是说,它是否具有能够正确学习观察、行动和奖励信号特征的层。
在构建您的网络时,请考虑以下提示。
对于连续动作空间,用
tanhLayer
后面是ScalingLayer
如有必要,将动作缩放到所需值。深度密集网络
reluLayer
层可以很好地近似许多不同的函数。因此,它们通常是不错的首选。从你认为可以近似于最优策略或价值函数的尽可能小的网络开始。
当您近似强非线性或具有代数约束的系统时,添加更多的层通常比增加每层的输出数量更好。一般来说,逼近器表示更复杂(组合)函数的能力仅随层数的大小呈多项式增长,但随层数呈指数增长。换句话说,更多的层可以近似更复杂和非线性的组合函数,尽管这通常需要更多的数据和更长的训练时间。给定神经元的总数和可比较的近似任务,层数较少的网络可能需要指数级多的单元来成功地近似同一类函数,并且可能无法正确地学习和推广。
对于非策略代理(仅从遵循当前策略时收集的经验中学习的代理),如AC和PG代理,如果您的网络很大(例如,具有两个隐藏层的网络,每个层有32个节点,有几百个参数),并行训练效果更好。策略并行更新假设每个工作人员更新网络的不同部分,例如当他们探索观察空间的不同区域时。如果网络很小,工人更新可能相互关联,使训练不稳定。
从神经网络创建和配置演员和评论家
要从你的深层神经网络中创建一个批评家,使用一个rlValueFunction
,rlQValueFunction
或者(只要可能)rlVectorQValueFunction
对象。要为来自深度神经网络的连续动作空间创建确定性参与者,请使用rlContinuousDeterministicActor
对象。要从你的深度神经网络中创建一个随机行为者,可以使用rlDiscreteCategoricalActor
或者一个rlContinuousGaussianActor
对象。要配置参与者或评论家使用的学习率和优化,请在代理选项对象中使用优化器对象。
例如,为评论家网络创建一个q值函数对象criticNetwork
.然后创建一个批评家优化器对象criticOpts
指定学习率0.02
梯度阈值为1
.
批评家= rlQValueFunction(criticNetwork,obsInfo,actInfo,…“观察”, {“观察”},“行动”, {“行动”});criticOpts = rlooptimizeroptions (“LearnRate”, 0.02,…“GradientThreshold”1);
然后创建代理选项对象,并设置CriticOptimizerOptions
代理选项对象的属性criticOpts
.最后创建代理时,将代理选项对象作为最后一个输入参数传递给代理构造函数。
当你创建深度神经网络并配置演员或评论家时,可以考虑使用以下方法作为起点。
从尽可能小的网络和高学习率(
0.01
)。训练这个初始网络,看看代理是快速收敛到一个糟糕的策略,还是以随机的方式行事。如果出现上述任何一个问题,通过在每一层上添加更多的层或更多的输出来重新调整网络。你的目标是找到一个网络结构,它足够大,学习速度不会太快,并且在初始训练期后显示出学习的迹象(奖励图的改进轨迹)。一旦确定了一个好的网络体系结构,低初始学习率可以让您看到代理是否在正确的轨道上,并帮助您检查您的网络体系结构是否适合解决问题。低学习率使得参数调优更容易,特别是对于困难的问题。
此外,在配置深度神经网络代理时,请考虑以下提示。
对DDPG和DQN代理要有耐心,因为它们在早期情节中可能会有一段时间学不到任何东西,而且它们通常在训练过程的早期表现出累积奖励的下降。最终,在最初的几千集之后,他们可以表现出学习的迹象。
对于DDPG和DQN代理,促进代理的探索是至关重要的。
对于同时具有演员和评论家网络的代理,将演员和评论家的初始学习率设置为相同的值。然而,对于某些问题,将评论家学习率设置为高于演员学习率的值可以改善学习效果。
循环神经网络
当创建用于除Q和SARSA之外的任何代理的演员或评论家时,您可以使用循环神经网络(RNN)。这些网络是深度神经网络sequenceInputLayer
输入层和至少一个具有隐藏状态信息的层,例如lstmLayer
.当环境具有不能包含在观测向量中的状态时,它们特别有用。
对于同时拥有演员和评论家的代理,您必须要么对两者都使用RNN,要么不使用RNN。你不能只对评论家或演员使用RNN。
当使用PG代理时,RNN的学习轨迹长度为整个事件。对于AC代理NumStepsToLookAhead
属性作为训练轨迹长度。对于PPO药剂,轨迹长度为MiniBatchSize
其options对象的属性。
对于DQN、DDPG、SAC和TD3智能体,必须将轨迹训练的长度指定为大于1的整数SequenceLength
属性。
请注意,对于连续动作空间PG、AC、PPO和TRPO代理,以及使用金宝app循环神经网络(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
,分别。演员和评论家的输入和输出层必须匹配原始代理的观察和动作规范。