主要内容

rlDQNAgent

深度q -网络强化学习代理

描述

深度q -网络(deep Q-network, DQN)算法是一种无模型、在线、非策略强化学习方法。DQN代理是一种基于价值的强化学习代理,它训练评论家来估计回报或未来的奖励。DQN是q学习的一种变体,它只在离散的动作空间中起作用。

欲了解更多信息,深度q -网络代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

根据观察和行动规格创建代理

例子

代理= rlDQNAgent (observationInfoactionInfo使用默认初始化选项为具有给定观察和操作规范的环境创建DQN代理。代理中的评论家表示使用从观察规范构建的默认多输出q值深度神经网络observationInfo以及动作规范actionInfo

例子

代理= rlDQNAgent (observationInfoactionInfoinitOpts使用给定的观察和操作规范为环境创建DQN代理。属性中指定的选项配置的默认网络initOpts对象。有关初始化选项的详细信息,请参见rlAgentInitializationOptions

从评论家表示创建代理

代理= rlDQNAgent (评论家使用为DQN代理设置的默认选项创建具有指定评论家网络的DQN代理。

指定代理选项

例子

代理= rlDQNAgent (评论家agentOptions使用指定的临界网络创建DQN代理,并设置AgentOptions属性agentOptions输入参数。在前面语法中的任何输入参数后使用此语法。

输入参数

全部展开

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

你可以提取observationInfo从现有环境或代理中使用getObservationInfo.您还可以使用rlFiniteSetSpecrlNumericSpec

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

由于DDPG代理在离散操作空间中操作,因此必须指定actionInfo作为一个rlFiniteSetSpec对象。

你可以提取actionInfo从现有环境或代理中使用getActionInfo.您还可以使用rlFiniteSetSpec

代理初始化选项,指定为rlAgentInitializationOptions对象。

评论家网络表示,指定为rlQValueRepresentation对象。有关创建评论家表示的更多信息,请参见创建策略和值函数表示

你的评论家表示可以使用循环神经网络作为它的函数逼近器。然而,只有多输出q值函数表示支持循环神经网络。金宝app有关示例,请参见利用循环神经网络创建DQN Agent

属性

全部展开

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

如果使用循环神经网络创建具有默认临界表示的DQN代理,则AgentOptions。年代equenceLength32

经验缓冲区,指定为ExperienceBuffer对象。在训练过程中,代理存储它的每个经验(年代一个R年代)放在缓冲区中。在这里:

  • 年代是当前对环境的观测。

  • 一个是代理所采取的动作。

  • R采取行动的奖励是什么一个

  • 年代是采取行动后的下一次观察吗一个

有关代理样本在训练期间如何从缓冲区获得经验的详细信息,请参见深度q -网络代理

对象的功能

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

例子

全部折叠

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

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

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

% rng (0)

从环境观察和行动规范中创建一个深q网络代理。

agent = rlDQNAgent(obsInfo,actInfo);

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

getAction(代理,{兰特(obsInfo (1) .Dimension),兰德(obsInfo (2) .Dimension)})
Ans = 1

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

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

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

创建一个代理初始化选项对象,指定网络中每个隐藏的全连接层必须具有128神经元(不是默认数量,256).

initOpts = rlAgentInitializationOptions“NumHiddenUnit”, 128);

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

% rng (0)

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

agent = rlPGAgent(obsInfo,actInfo,initOpts);

降低评论家学习率为1e-3。

批评家= get批评家(代理);critical . options . learnrate = 1e-3;agent = set批评家(代理,评论家);

从两者中提取深度神经网络。

criticNet = getModel(get批评家(代理));

默认DQN代理使用多输出q值临界逼近器。多输出逼近器将观测值作为输入,状态动作值作为输出。每个输出元素表示从观察输入所指示的状态中采取相应离散行动所期望的累计长期奖励。

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

criticNet。层
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输入沿着维度1 8 ' relu_body ReLU ReLU 9“fc_body”完全连接128完全连接层10“body_output”ReLU ReLU 11“输出”完全连接1完全连接层

描绘评论家网络

情节(layerGraph (criticNet))

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

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

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

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

创建一个环境接口并获取其观察和操作规范。类所使用的预定义环境训练DQN人员平衡车杆系统的例子。该环境具有连续的四维观测空间(车和杆的位置和速度)和离散的一维作用空间,由两种可能的力(-10N或10N)的应用组成。

负载百分比预定义环境环境= rlPredefinedEnv(“CartPole-Discrete”);获取观察和操作规范对象obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

对于具有离散操作空间的代理,您可以选择创建多输出评论家表示,这通常比可比的单输出评论家表示更有效。

多输出评论家只有观察结果作为输入,而输出向量的元素与可能的离散操作的数量一样多。当采取相应的离散行动时,每个输出元素表示从作为输入的观察中获得的预期累积长期奖励。

使用深度神经网络逼近器创建多输出批评表示。

%创建一个深度神经网络逼近器%观测输入层必须有4个元素(obsInfo.Dimension(1))%动作输出层必须有2个元素(length(actInfo.Elements))dnn = [imageInputLayer([obsInfo.Dimension(1) 1 1],“归一化”“没有”“名字”“状态”) fullyConnectedLayer(24日“名字”“CriticStateFC1”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer(24日“名字”“CriticStateFC2”) reluLayer (“名字”“CriticCommonRelu”) fullyConnectedLayer(长度(actInfo.Elements),“名字”“输出”));为评论家设置一些选项criticOpts = rlRepresentationOptions(“LearnRate”, 0.01,“GradientThreshold”1);基于网络逼近器创建评论家。rlQValueRepresentation(dnn,obsInfo,actInfo,“观察”, {“状态”}, criticOpts);

指定代理选项,并使用批评家创建DQN代理。

agentOpts = rlDQNAgentOptions(...“UseDoubleDQN”假的,...“TargetUpdateMethod”“周期”...“TargetUpdateFrequency”4...“ExperienceBufferLength”, 100000,...“DiscountFactor”, 0.99,...“MiniBatchSize”, 256);agent = rlDQNAgent(批评家,agentOpts)
agent = rlDQNAgent with properties: AgentOptions: [1x1 rl.option.]rlDQNAgentOptions] ExperienceBuffer: [1x1 rl.util.ExperienceBuffer]

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

getAction(代理,{兰德(4,1)})
Ans = 10

现在可以针对环境测试和训练代理。

创建一个环境接口并获取其观察和操作规范。类所使用的预定义环境训练DQN人员平衡车杆系统的例子。该环境具有连续的四维观测空间(车和杆的位置和速度)和离散的一维作用空间,由两种可能的力(-10N或10N)的应用组成。

负载百分比预定义环境环境= rlPredefinedEnv(“CartPole-Discrete”);获取观察和规格信息obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

使用深度神经网络逼近器创建单输出评论家表示。它必须将观察和行动都作为输入层,并且单个标量输出表示给定观察和行动之后的预期累积长期奖励。

%创建一个深度神经网络逼近器%观测输入层必须有4个元素(obsInfo.Dimension(1))动作输入层必须有1个元素(actInfo.Dimension(1))%输出必须是标量statePath = [featureInputLayer(obsInfo.Dimension(1),“归一化”“没有”“名字”“状态”) fullyConnectedLayer(24日“名字”“CriticStateFC1”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer(24日“名字”“CriticStateFC2”));actionPath = [featureInputLayer(actInfo.Dimension(1),“归一化”“没有”“名字”“行动”) fullyConnectedLayer(24日“名字”“CriticActionFC1”));commonPath = [addtionlayer (2,“名字”“添加”) reluLayer (“名字”“CriticCommonRelu”) fullyConnectedLayer (1,“名字”“输出”));criticNetwork = layerGraph(statePath);criticNetwork = addLayers(criticNetwork, actionPath);criticNetwork = addLayers(criticNetwork, commonPath);临界网络= connectLayers(临界网络,“CriticStateFC2”“添加/三机一体”);临界网络= connectLayers(临界网络,“CriticActionFC1”“添加/ in2”);为评论家设置一些选项criticOpts = rlRepresentationOptions(“LearnRate”, 0.01,“GradientThreshold”1);基于网络逼近器创建评论家。评论= rlQValueRepresentation(批评网络,obsInfo,actInfo,...“观察”, {“状态”},“行动”, {“行动”}, criticOpts);

指定代理选项,并使用批评家创建DQN代理。

agentOpts = rlDQNAgentOptions(...“UseDoubleDQN”假的,...“TargetUpdateMethod”“周期”...“TargetUpdateFrequency”4...“ExperienceBufferLength”, 100000,...“DiscountFactor”, 0.99,...“MiniBatchSize”, 256);agent = rlDQNAgent(批评家,agentOpts)
agent = rlDQNAgent with properties: AgentOptions: [1x1 rl.option.]rlDQNAgentOptions] ExperienceBuffer: [1x1 rl.util.ExperienceBuffer]

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

getAction(代理,{兰德(4,1)})
Ans = 10

现在可以针对环境测试和训练代理。

类所使用的预定义环境训练DQN人员平衡车杆系统的例子。

环境= rlPredefinedEnv(“CartPole-Discrete”);

获取观察和行动信息。该环境具有连续的四维观测空间(车和杆的位置和速度)和离散的一维作用空间,由两种可能的力(-10N或10N)的应用组成。

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

为你的评论家创建一个循环深度神经网络。要创建循环神经网络,请使用sequenceInputLayer作为输入层并包含一个lstmLayer作为其他网络层之一。

对于DQN智能体,只有多输出q值函数表示支持循环神经网络。金宝app对于多输出q值函数表示,输出层的元素数量必须等于可能操作的数量:元素个数(actInfo.Elements)

criticNetwork = [sequenceInputLayer(obsInfo.Dimension(1),“归一化”“没有”“名字”“状态”) fullyConnectedLayer (50,“名字”“CriticStateFC1”) reluLayer (“名字”“CriticRelu1”) lstmLayer (20“OutputMode”“序列”“名字”“CriticLSTM”);fullyConnectedLayer (20,“名字”“CriticStateFC2”) reluLayer (“名字”“CriticRelu2”) fullyConnectedLayer(元素个数(actInfo.Elements),“名字”“输出”));

使用循环神经网络为你的评论家创建一个表示。

criticOptions = rlRepresentationOptions(“LearnRate”1 e - 3,“GradientThreshold”1);评论= rlQValueRepresentation(批评网络,obsInfo,actInfo,...“观察”“状态”, criticOptions);

指定用于创建DQN代理的选项。要使用循环神经网络,必须指定一个SequenceLength大于1。

agentOptions = rlDQNAgentOptions(...“UseDoubleDQN”假的,...“TargetSmoothFactor”, 5 e - 3,...“ExperienceBufferLength”1 e6,...“SequenceLength”, 20);agentOptions.EpsilonGreedyExploration.EpsilonDecay = 1e-4;

创建代理。演员网络和评论家网络是随机初始化的。

agent = rlDQNAgent(批评家,agentOptions);

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

getAction(代理,兰德(obsInfo.Dimension))
Ans = -10
在R2019a中引入