要实现自己的自定义加强学习算法,可以通过创建自定义代理类的子类来创建自定义代理。然后,您可以在Matlab中培训和模拟此代理®和仿真软金宝app件®环境。有关在MATLAB中创建类的更多信息,请参见用户定义的类。
要定义自定义代理,首先创建一个类,该类是rl.agent.CustomAgent
类。本节以培训的自定义LQR代理为例火车定制LQR代理。作为您自己代理的起点,您可以打开和修改此自定义代理类。要将示例文件添加到MATLAB路径并在MATLAB命令行处打开文件,请键入以下代码。
目录(fullfile (matlabroot,“例子”那“rl”那“主要”));编辑LQRCustomAgent.m
在将类保存到您自己的工作文件夹之后,您可以从该路径中删除示例文件。
rmpath (fullfile (matlabroot,“例子”那“rl”那“主要”));
此类具有以下类定义,它表示代理类名和关联的抽象代理。
classdefLQRCustomAgent < rl.agent.CustomAgent
要定义您的代理,您必须指定以下内容:
代理的属性
构造函数
评估打折扣的长期回报(如果学习需要的话)的评论家代表
演员表示,即根据当前观察选择动作(如果需要学习)
需要代理的方法
可选代理方法
在属性
类文件的部分,指定创建和培训代理所需的任何参数。这些参数可以包括:
折扣未来奖励的折扣因素
用于探索模型的配置参数,例如噪声模型或epsilon - 贪婪探索
使用重放内存的经验缓冲
从经验缓冲液中取样的小批量尺寸
在训练中向前看的步骤数
有关潜在代理属性的更多信息,请参阅内置的Reinforcement Learning Toolbox™代理的选项对象。
这rl.Agent.CustomAgent
类已经包含代理示例时间的属性(SampleTime
)和行动和观察规范(ActionInfo
和ObservationInfo
分别)。
自定义LQR代理定义以下代理属性。
属性%问问:R %R.%反馈收益K.%的折扣因素伽玛= 0.95%的批评家评论家k%缓冲器KBuffer% K的更新数KUpdate = 1%估计值更新的数字EstimateNum = 10结束YBuffer HBuffer . properties (Access = private) Counter = 1结束
要创建自定义代理,必须定义一个构造函数:
定义动作和观察规范。有关创建这些规范的详细信息,请参阅rlNumericSpec
和rlFiniteSetSpec
。
根据训练算法的要求创建演员和评论家表示。有关更多信息,请参见创建策略和价值功能表示。
配置代理属性。
调用基抽象类的构造函数。
例如,LQRCustomAgent
构造函数定义了连续动作和观察空间,并创造了批评者表示。这疯狂的
Function是一个可选的helper函数,用于定义批评家表示形式。
函数obj = lqrcustomagent(q,r,italyk)%检查输入参数的数量narginchk(3,3);%调用抽象类构造函数obj = obj@rl.agent.CustomAgent ();设置Q和R矩阵obj.q = q;obj.r = r;%定义了观察和动作空间obj.observationinfo = rlnumericspec([size(q,1),1]);obj.actioninfo = rlnumericspec([size(r,1),1]);%创造批评批评者表示obj。评论家= createCritic (obj);%初始化增益矩阵obj。K.= InitialK;%初始化经验缓冲区obj.ybuffer = zeros(obj.estimateNum,1);num =尺寸(q,1)+大小(r,1);obj.hbuffer = zeros(obj.estimateNum,0.5 * num *(num + 1));obj.kbuffer = cell(1,1000);obj.kbuffer {1} = obj.k;结束
如果您的学习算法使用评论家表示来估计长期回报,或者使用参与者来选择动作,或者两者都使用,那么您必须将它们添加为代理属性。然后,您必须在创建代理时创建这些表示;也就是说,在构造函数中。有关创建演员和评论家的更多信息,请参见创建策略和价值功能表示。
例如,自定义LQR代理使用批评家表示,存储在其评论家
财产,没有演员。批评者的创作是实施的疯狂的
辅助功能,从中调用LQRCustomAgent
构造函数。
函数批评=疯狂(obj)nq = size(obj.q,1);nr = size(obj.r,1);n = nq + nr;W0 = 0.1 *α(0.5 *(n + 1)* n,1);批评= rlqvaluerepresentation({@(x,u)computequadraticbasis(x,u,n),w0},......getObservationInfo (obj) getActionInfo (obj));critic.Options.GradientThreshold = 1;结束
在这种情况下,评论家是一个rlqvalueerepresentation
对象。要创建这样的表示,必须指定自定义基函数的句柄,在本例中为computeQuadraticBasis
功能。有关此评论家的更多信息,请参阅火车定制LQR代理。
要创建自定义强化学习代理,必须定义以下实现函数。要在您自己的代码中调用这些函数,请使用抽象基类中的包装器方法。例如,打电话getActionImpl
,使用getAction
。包装器方法具有与实现方法相同的输入和输出参数。
函数 | 描述 |
---|---|
getActionImpl |
通过评估给定观察的代理策略来选择操作 |
getActionWithExplorationImpl |
使用代理的探索模型选择操作 |
学习中 |
从当前的经历中了解并恢复探索的动作 |
在实现函数中,要评估参与者和批评者表示,可以使用getValue
那getAction
,getMaxQValue
功能。
评估一个rlvalueerepresentation
用仅观测的输入信号,求得状态值函数V.
使用以下语法。
V = getValue(评论家,观察);
评估一个rlqvalueerepresentation
用观测和动作输入信号进行批判,得到状态-动作值函数问:
使用以下语法。
Q = getValue(评论家,(观察、行动));
评估一个rlqvalueerepresentation
批评只有观察输入信号,获取状态动作值函数问:
对于所有可能的离散操作,请使用以下语法。
q = getValue(评论家,观察);
离散的动作空间rlqvalueerepresentation
批评家,得到最大Q状态-动作值函数问:
对于所有可能的离散操作,请使用以下语法。
[MaxQ, MaxActionIndex] = getMaxQValue(评论家,观察);
评估演员代表(rlStochasticActorRepresentation
或rlDeterministicActorRepresentation
),获得行动一种
使用以下语法。
一个= getAction(演员、观察);
对于这些情况中的每一个,如果您的演员或批评网络使用经常性神经网络,则在获得相应的网络输出之后,该功能也可以返回网络状态的当前值。
getActionImpl
函数这getActionImpl
函数的作用是评估代理的策略并选择操作。此功能必须具有以下签名,在哪里obj
是代理对象,观察
是目前的观察,还有行动
是选定的操作。
函数action = getActionImpl (obj,观察)
对于自定义LQR代理,您可以通过应用你=-K.X控制法。
函数action = getActionImpl (obj,观察)%给定系统的当前状态,返回一个动作action = -obj.K *观察{:};结束
getActionWithExplorationImpl
函数这getActionWithExplorationImpl
函数使用代理商的探索模型选择一个操作。使用此功能,您可以实现epsilon-greedy探索等算法。此功能必须具有以下签名,在哪里obj
是代理对象,观察
是目前的观察,还有行动
是选定的操作。
函数action = getActionWithExplorationImpl (obj,观察)
对于自定义LQR代理,getActionWithExplorationImpl
功能将随机白噪声添加到使用当前代理策略选择的操作。
函数action = getActionWithExplorationImpl (obj,观察)赋予当前观察的%,选择一个动作action = getAction (obj,观察);%在动作中添加随机噪音num = size(obj.r,1);动作=动作+ 0.1 * RANDN(NUM,1);结束
学习中
函数这学习中
函数定义代理商如何从当前的经验中学到。此函数通过更新策略参数并使用探索选择操作来实现您的代理的自定义学习算法。此功能必须具有以下签名,在哪里obj
是代理对象,exp.
目前是否有代理经验,以及行动
是选定的操作。
函数action = learnImpl (obj,经验值)
代理体验是单元阵列exp ={状态、动作、奖励、nextstate结束}
。
状态
是目前的观察结果。
行动
是当前的动作。
奖励
是目前的奖励。
nextState
是下一个观察。
已经完成了
是一个逻辑标志,表明训练集是完整的。
对于自定义LQR代理,每一次都会更新批评家参数N
步骤。
函数action = learnImpl (obj,经验值)%解析体验输入x = exp {1} {1};u = exp {2} {1};dx = exp {4} {1};y = (x ' * obj。问:*x + u'*obj.R*u); num = size(obj.Q,1) + size(obj.R,1);%需要等待N步才能更新批评家参数N = obj.EstimateNum;h1 = computeQuadraticBasis (x, u, num);h2 = computeQuadraticBasis (dx, -obj.K * dx, num);H = h1 - obj。γ* h2;如果obj。Counter<=N obj.YBuffer(obj.Counter) = y;obj.HBuffer (obj.Counter:) = H;obj。Counter = obj。计数器+ 1;其他的%根据批处理更新批评家参数%的经验H_buf = obj.HBuffer;y_buf = obj.YBuffer;θ= (H_buf ' * H_buf) \ H_buf * y_buf;obj。评论家= setLearnableParameters (obj.Critic{θ});根据新的参数推导新的增益矩阵obj。K.= getNewK(obj);%重置体验缓冲区obj。Counter = 1;obj。YBuffer = 0 (N, 1);obj。HBuffer = 0 (N, 0.5 * num * (num + 1));obj。K.Update = obj.KUpdate + 1; obj.KBuffer{obj.KUpdate} = obj.K;结束%查找并通过探索返回行动action = getActionWithExploration (obj, exp {4});结束
您还可以通过指定resetimpl.
使用以下功能签名,其中obj
是代理对象。使用此函数,可以在训练前将代理设置为已知或随机条件。
函数resetimpl(ob)
此外,您还可以根据需要在自定义代理类中定义任何其他助手函数。例如,自定义LQR代理定义疯狂的
函数创建批评家表示和getNewK
函数,该函数从训练过的批评参数派生出反馈增益矩阵。
定义自定义代理类之后,在MATLAB工作空间中创建它的实例。例如,要创建自定义LQR代理,请定义问:
那R.
,itsialk.
值并调用构造函数。
Q =[10 3 1; 3、5、4、1、4、9];R = 0.5 *眼(3);K0 =地方(A, B, [0.4, 0.8, 0.5]);代理= LQRCustomAgent (Q, R, K0);
在验证环境对象后,您可以使用它来培训钢筋学习代理。有关列车定制LQR代理的示例,请参阅火车定制LQR代理。