主要内容

rlDQNAgent

深度q网络(Deep Q-network, DQN)强化学习剂

描述

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

欲了解更多信息,Deep Q-Network (DQN)代理商.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

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

例子

代理= rlDQNAgent (observationInfoactionInfo使用默认初始化选项为具有给定观察和操作规范的环境创建DQN代理。代理中的评论家使用从观察规范构建的默认向量(即多输出)q值深度神经网络observationInfo以及动作规范actionInfo.的ObservationInfo而且ActionInfo的属性代理设置为observationInfo而且actionInfo分别输入参数。

例子

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

从批评家创建代理

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

指定代理选项

例子

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

输入参数

全部展开

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

评论家,指定为rlQValueFunction或者更有效率rlVectorQValueFunction对象。有关创建批评的更多信息,请参见创建策略和值函数

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

属性

全部展开

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

如果通过指定批评对象创建代理,则ObservationInfo中指定的值评论家

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

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

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

如果通过指定批评对象创建代理,则ActionInfo中指定的值评论家

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

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

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

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

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

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

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

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

  • D是否在采取行动后发出“完成”信号一个

选项,在选择操作时使用探索策略,指定为以下逻辑值之一。

  • 真正的—选择动作时,使用基础代理探索策略。

  • —选择动作时使用base agent greedy策略。

试剂的取样时间,指定为正标量或-1.将此参数设置为-1允许基于事件的模拟。的价值SampleTime中指定的值AgentOptions

在Simulink金宝app中®环境中,RL代理块,在其中指定代理执行每个SampleTime秒模拟时间。如果SampleTime-1,块从它的父子系统继承采样时间。

在MATLAB中®环境时,每当环境前进时执行代理。在这种情况下,SampleTime输出经验中连续元素之间的时间间隔是否由返回sim卡火车.如果SampleTime-1,返回的输出体验中连续元素之间的时间间隔反映了触发代理执行的事件的时间。

对象的功能

火车 在指定的环境中训练强化学习代理
sim卡 在指定的环境中模拟训练好的强化学习代理
getAction 从给定环境观察的代理、参与者或策略对象获取操作
getActor 从强化学习代理中得到actor
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 =1x1单元阵列{[1]}

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

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

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

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

initOpts = rlAgentInitializationOptions(NumHiddenUnit=128);

代理创建函数随机初始化演员网络和评论家网络。通过固定随机生成器的种子来确保重现性。

rng (0)

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

agent = rlDQNAgent(obsInfo,actInfo,initOpts);

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

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

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

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

criticNet。层
ans = 11x1带有图层的图层数组:1的concat串联连接2输入沿着维度1 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”功能输入1功能10 fc_2完全连接128完全连接层11“输出”完全连接5全连接层

描绘评论家网络

情节(layerGraph (criticNet))

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

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

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

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

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

创建预定义的环境。

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

获取观察和操作规范对象。

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

为了在评论家中近似q值函数,使用深度神经网络。对于具有离散动作空间的DQN代理,您可以选择创建多输出q值函数评论家,这通常比可比的单输出评论家更有效。

这个评论家的网络必须只接受观察作为输入,并为每个动作返回一个值向量。因此,它必须有一个输入层,其元素数量与观察空间的维度相同,而输出层的元素数量与可能的离散动作数量相同。每个输出元素都表示在采取相应的行动时,从作为输入的观察中获得的预期累积长期奖励。

将网络定义为层对象的数组,并获得观察空间的维度(即刺激(obsInfo.Dimension))和可能操作的数量(即,元素个数(actInfo.Elements))直接从环境规范对象。

dnn = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(24) reluLayer fullyConnectedLayer(24) reluLayer fullyConnectedLayer(nummel (actInfo.Elements))];

将网络转换为adlnetwork对象AD显示权重数。

DNN = dlnetwork(DNN);总结(款)
初始化:true可学习数量:770输入:1 '输入' 4个特征

使用rlVectorQValueFunction,网络以及观察和行动规范。

rlVectorQValueFunction(dnn,obsInfo,actInfo);

检查评论家是否使用随机观察输入。

getValue(评论家,{兰德(obsInfo.Dimension)})
ans =2x1个单列向量-0.0361 - 0.0913

使用批评家创建DQN代理。

agent = rlDQNAgent(critical)
agent = rlDQNAgent with properties: ExperienceBuffer: [1x1 rl.replay.]rlReplayMemory] AgentOptions: [1x1 rl.option. option.]rlDQNAgentOptions] UseExplorationPolicy: 0 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlFiniteSetSpec] SampleTime: 1

指定代理选项,包括评论家的培训选项。

agent.AgentOptions.UseDoubleDQN = false;agent.AgentOptions.TargetUpdateMethod =“周期”;agent.AgentOptions.TargetUpdateFrequency = 4;agent.AgentOptions.ExperienceBufferLength = 100000;agent.AgentOptions.DiscountFactor = 0.99;agent.AgentOptions.MiniBatchSize = 256;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1飞行;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;

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

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

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

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

创建预定义的环境。

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

获取观察和操作规范对象。

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

创建一个深度神经网络,用作评论家内部的近似模型。对于DQN代理,您可以选择创建多输出q值函数评论家,这通常比可比的单输出评论家更有效。但是,对于本例,创建一个单输出q值函数批评家。

这个评论家的网络必须有两个输入层,一个用于观察,另一个用于行动,并返回一个标量值,表示给定的观察和行动之后预期的累积长期奖励。

将每个网络路径定义为一个层对象数组。从环境规范对象中获取观察和操作空间的维度,并为输入层指定一个名称,以便稍后可以显式地将它们与适当的环境通道关联起来。

%观测路径obsPath = [featureInputLayer(prod(obsInfo.Dimension),Name=“netOin”fulllyconnectedlayer (24,Name= .“fcObsPath”));%动作路径actPath = [featureInputLayer(prod(actInfo.Dimension),Name=“netAin”Name =) fullyConnectedLayer(24日“fcActPath”));%公共路径(沿着dim #1连接输入)commonPath = [concatenationLayer(1,2,Name= .“猫”reluLayer fullyConnectedLayer(1,Name=“出去”));为网络添加路径net = layerGraph;net = addLayers(net,obsPath);net = addLayers(net,actPath);net = addLayers(net,commonPath);%连接层net = connectLayers(net,“fcObsPath”“猫/三机一体”);net = connectLayers(net,“fcActPath”“猫/ in2”);%绘图网络情节(净)

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

%转换为dlnetwork对象Net = dlnetwork(Net);显示权重数总结(净)
初始化:true可学习数量:817 input: 1 'netOin' 4 features 2 'netAin' 1 features

使用rlQValueFunction.指定与观察和操作通道相关联的层的名称。

rlQValueFunction(net,...obsInfo,...actInfo,...ObservationInputNames =“netOin”...ActionInputNames =“netAin”);

用随机的观察和行动输入检查批评家。

getValue(评论家,{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =-0.0232

使用批评家创建DQN代理。

agent = rlDQNAgent(critical)
agent = rlDQNAgent with properties: ExperienceBuffer: [1x1 rl.replay.]rlReplayMemory] AgentOptions: [1x1 rl.option. option.]rlDQNAgentOptions] UseExplorationPolicy: 0 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlFiniteSetSpec] SampleTime: 1

指定代理选项,包括评论家的培训选项。

agent.AgentOptions.UseDoubleDQN = false;agent.AgentOptions.TargetUpdateMethod =“周期”;agent.AgentOptions.TargetUpdateFrequency = 4;agent.AgentOptions.ExperienceBufferLength = 100000;agent.AgentOptions.DiscountFactor = 0.99;agent.AgentOptions.MiniBatchSize = 256;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1飞行;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;

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

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

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

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

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

获取观察和操作规范对象。

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

为了在评论家内近似q值函数,使用循环深度神经网络。对于DQN代理,只有向量函数逼近器,rlVectorQValueFunction,支金宝app持循环神经网络模型。对于矢量q值函数评论家,输出层的元素数量必须等于可能操作的数量:元素个数(actInfo.Elements)

将网络定义为层对象的数组。从环境规范对象(刺激(obsInfo.Dimension)).要创建循环神经网络,请使用sequenceInputLayer作为输入层并包含一个lstmLayer作为其他网络层之一。

net = [sequenceInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer lstmLayer(20,OutputMode=“序列”);fulllyconnectedlayer (20) reluLayer fullyConnectedLayer(numel(actInfo.Elements))];

转换为dlnetwork对象并显示权重的数量。

Net = dlnetwork(Net);总结(净);
初始化:true可学习数量:6.3k输入:1 'sequenceinput' 4维序列输入

使用循环神经网络创建一个评论家。

rlVectorQValueFunction(net,obsInfo,actInfo);

用随机输入的观察来检查你的评论。

getValue(评论家,{兰德(obsInfo.Dimension)})
ans =2x1个单列向量0.0136 - 0.0067

为评论家定义一些培训选项。

criticOptions = rlOptimizerOptions(...LearnRate = 1 e - 3,...GradientThreshold = 1);

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

agentOptions = rlDQNAgentOptions(...UseDoubleDQN = false,...TargetSmoothFactor = 5 e - 3,...ExperienceBufferLength = 1 e6,...SequenceLength = 32,...CriticOptimizerOptions = criticOptions);agentOptions.EpsilonGreedyExploration.EpsilonDecay = 1e-4;

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

agent = rlDQNAgent(批评家,agentOptions);

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

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

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

版本历史

在R2019a中引入