rlDQNAgent
描述
深度q -网络(deep Q-network, DQN)算法是一种无模型、在线、非策略强化学习方法。DQN代理是一种基于价值的强化学习代理,它训练评论家来估计回报或未来的奖励。DQN是q学习的一种变体,它只在离散的动作空间中起作用。
欲了解更多信息,Deep Q-Network (DQN)代理商.有关不同类型的强化学习代理的更多信息,请参见强化学习代理.
创建
语法
描述
根据观察和行动规格创建代理
使用默认初始化选项为具有给定观察和操作规范的环境创建DQN代理。代理中的评论家使用从观察规范构建的默认向量(即多输出)q值深度神经网络代理
= rlDQNAgent (observationInfo
,actionInfo
)observationInfo
以及动作规范actionInfo
.的ObservationInfo
而且ActionInfo
的属性代理
设置为observationInfo
而且actionInfo
分别输入参数。
使用给定的观察和操作规范为环境创建DQN代理。属性中指定的选项配置的默认网络代理
= rlDQNAgent (observationInfo
,actionInfo
,initOpts
)initOpts
对象。有关初始化选项的详细信息,请参见rlAgentInitializationOptions
.
从批评家创建代理
使用为DQN代理设置的默认选项创建具有指定评论家网络的DQN代理。代理
= rlDQNAgent (评论家
)
指定代理选项
使用指定的临界网络创建DQN代理,并设置代理
= rlDQNAgent (评论家
,agentOptions
)AgentOptions
属性agentOptions
输入参数。在前面语法中的任何输入参数后使用此语法。
输入参数
initOpts
- - - - - -代理初始化选项
rlAgentInitializationOptions
对象
代理初始化选项,指定为rlAgentInitializationOptions
对象。
评论家
- - - - - -评论家
rlQValueFunction
对象|rlVectorQValueFunction
对象
评论家,指定为rlQValueFunction
或者更有效率rlVectorQValueFunction
对象。有关创建批评的更多信息,请参见创建策略和值函数.
你的评论家可以使用循环神经网络作为函数逼近器。然而,只有rlVectorQValueFunction
金宝app支持循环神经网络。有关示例,请参见利用循环神经网络创建DQN Agent.
属性
ObservationInfo
- - - - - -观测规范
规范对象|规范对象数组
观察规范,规定为rlFiniteSetSpec
或rlNumericSpec
对象或包含此类对象的组合的数组。数组中的每个元素都定义了环境观察通道的属性,比如维度、数据类型和名称。
如果通过指定批评对象创建代理,则ObservationInfo
中指定的值评论家
.
你可以提取observationInfo
从现有环境或代理中使用getObservationInfo
.您还可以使用rlFiniteSetSpec
或rlNumericSpec
.
ActionInfo
- - - - - -操作规范
rlFiniteSetSpec
对象
动作规范,指定为rlFiniteSetSpec
对象。该对象定义环境操作通道的属性,如维度、数据类型和名称。
请注意
只允许一个动作通道。
如果通过指定批评对象创建代理,则ActionInfo
中指定的值评论家
.
你可以提取actionInfo
从现有环境或代理中使用getActionInfo
.您还可以使用rlFiniteSetSpec
.
AgentOptions
- - - - - -剂的选择
rlDQNAgentOptions
对象
代理选项,指定为rlDQNAgentOptions
对象。
如果创建一个DQN代理,该代理具有使用循环神经网络的默认临界值,则AgentOptions。年代equenceLength
是32
.
ExperienceBuffer
- - - - - -经验的缓冲
rlReplayMemory
对象
经验缓冲区,指定为rlReplayMemory
对象。在训练过程中,代理存储它的每个经验(年代,一个,R,年代,D)放在缓冲区中。在这里:
年代是当前对环境的观测。
一个是代理所采取的动作。
R采取行动的奖励是什么一个.
年代是采取行动后的下一次观察吗一个.
D是否在采取行动后发出“完成”信号一个.
UseExplorationPolicy
- - - - - -选择使用探索策略
假
(默认)|真正的
选项,在选择操作时使用探索策略,指定为以下逻辑值之一。
真正的
—选择动作时,使用基础代理探索策略。假
—选择动作时使用base agent greedy策略。
SampleTime
- - - - - -药剂取样时间
积极的标量|-1
对象的功能
例子
根据观察和行动规范创建DQN代理
创造一个具有离散动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境使用深度网络设计器创建DQN代理,并使用图像观测进行训练.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。该动作是一个有五个可能元素的标量(施加在摆动杆上的扭矩为- 2,1,0,1或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]}
现在可以在环境中测试和训练代理。
使用初始化选项创建DQN代理
创造一个具有离散动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境使用深度网络设计器创建DQN代理,并使用图像观测进行训练.这个环境有两个观测值:一个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批评家(代理));
为了验证每个隐藏的全连接层有128个神经元,您可以在MATLAB®命令窗口中显示这些层,
criticNet。层
或者交互式地可视化结构analyzeNetwork
.
analyzeNetwork (criticNet)
描绘评论家网络
情节(layerGraph (criticNet))
要检查代理,请使用getAction
从随机观测中返回运动。
getAction(代理,{兰特(obsInfo (1) .Dimension),兰德(obsInfo (2) .Dimension)})
ans =1x1单元阵列{[0]}
现在可以在环境中测试和训练代理。
使用多输出批判器创建DQN代理
创建一个环境接口并获取其观察和操作规范。类所使用的预定义环境训练DQN人员平衡车杆系统的例子。该环境具有连续的四维观测空间(车和杆的位置和速度)和离散的一维作用空间,由两种可能的力(-10N或10N)的应用组成。
创建预定义的环境。
环境= rlPredefinedEnv(“CartPole-Discrete”);
获取观察和操作规范对象。
obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
DQN智能体使用参数化q值函数评论家,在给定观察和行动的情况下,近似地计算长期奖励。
对于具有离散动作空间的DQN代理,您可以选择创建一个向量(即多输出)q值函数评论家,这通常比可比的单输出评论家更有效。向量q值函数是一个从环境观测到一个向量的映射,其中每个元素表示当智能体从给定观测对应的状态开始并执行对应于元素编号的操作(然后遵循给定的策略)时预期的贴现累积长期奖励。
为了在评论中建模q值函数,使用深度神经网络。网络必须有一个输入层(该输入层接收观察通道的内容,由obsInfo
)和一个输出层(它返回所有可能操作的值向量)。
将网络定义为层对象的数组,并获得观察空间的维度(即刺激(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代理
创建一个环境接口并获取其观察和操作规范。类所使用的预定义环境训练DQN人员平衡车杆系统的例子。该环境具有连续的四维观测空间(车和杆的位置和速度)和离散的一维作用空间,由两种可能的力(-10 N或10 N)的应用组成。
创建预定义的环境。
环境= rlPredefinedEnv(“CartPole-Discrete”);
获取观察和操作规范对象。
obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
对于DQN代理,您可以使用多输出q值函数批评,这通常比可比的单输出批评更有效。但是,对于本例,创建一个单输出q值函数批评家。
q值函数评论家将当前观察结果和操作作为输入,并返回单个标量作为输出(从当前观察结果对应的状态中采取操作并随后遵循策略的估计贴现累积长期奖励)。
为了在评论家中建模参数化q值函数,使用具有两个输入层的神经网络(一个用于观察通道,由obsInfo
,另一个为动作通道,由actInfo
)和一个输出层(返回标量值)。
请注意,刺激(obsInfo.Dimension)
而且刺激(actInfo.Dimension)
分别返回观察空间和操作空间的维数,而不管它们是排列为行向量、列向量还是矩阵。
将每个网络路径定义为一个层对象数组,并为每个路径的输入层和输出层分配名称,以便可以连接这些路径。
%观测路径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”);%绘图网络情节(净)
%转换为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 Agent
类所使用的预定义环境训练DQN人员平衡车杆系统的例子。该环境具有连续的四维观测空间(车和杆的位置和速度)和离散的一维作用空间,由两种可能的力(-10N或10N)的应用组成。
环境= rlPredefinedEnv(“CartPole-Discrete”);
获取观察和操作规范对象。
obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
对于DQN代理,只有向量函数逼近器,rlVectorQValueFunction
,支金宝app持循环神经网络模型。网络必须有一个输入层(获取观察通道的内容)和一个输出层(返回所有可能操作的值向量)。
将网络定义为层对象的数组。要创建循环神经网络,请使用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)
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
检查您的代理使用getAction
从随机观察中返回动作。
getAction(代理,兰德(obsInfo.Dimension))
ans =1x1单元阵列{[-10]}
要使用顺序观察来评估代理,请使用序列长度(时间)维度。的序列获取操作9
观察。
[action,state] = getAction(agent,...{兰德([obsInfo。Dimension 1 9])});
显示与观察结果的第七个元素相对应的操作。
动作=动作{1};行动(1,1,1,7)
Ans = -10
现在可以在环境中测试和训练代理。
版本历史
在R2019a中引入
Abrir比如
Tiene una versión modificada de este ejemplo。¿Desea abrir este ejemplo con sus modificaciones?
MATLAB突击队
Ha hecho clic en unenlace que对应一个este commando de MATLAB:
弹射突击队introduciéndolo en la ventana de commandos de MATLAB。Los navegadores web no permission comandos de MATLAB。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。