创建自定义强化学习代理
要实现您自己的自定义强化学习算法,您可以通过创建自定义代理类的子类来创建自定义代理。然后,您可以在MATLAB中训练和模拟该代理®和仿真软件®环境。有关在MATLAB中创建类的更多信息,请参见用户定义的类.
创建模板类
类的子类来定义自定义代理,首先创建一个类rl.agent.CustomAgent
类。本节以训练自定义LQR代理为例培训自定义LQR代理.作为您自己的代理的起点,您可以打开和修改这个自定义代理类。要在本地文件夹中下载示例文件并在MATLAB命令行中打开主示例实时脚本,请键入以下代码。
openExample (“rl / TrainCustomLQRAgentExample”)
关闭TrainCustomLQRAgentExample.mlx
文件并打开LQRCustomAgent.m
类文件。
编辑LQRCustomAgent.m
将类保存到您自己的工作文件夹后,您可以删除示例文件和下载它们的本地文件夹。
中定义的类LQRCustomAgent.m
具有以下类定义,它指示代理类名和关联的抽象代理。
classdefLQRCustomAgent < rl.agent.CustomAgent
要定义代理,必须指定以下内容:
代理的属性
构造函数
评估贴现长期回报(如果学习需要)的评论家
基于当前观察选择动作的参与者(如果需要学习)
所需代理方法
可选代理方法
代理的属性
在属性
节中,指定创建和训练代理所需的任何参数。这些参数包括:
对未来奖励进行贴现的贴现因子
勘探模型的配置参数,例如噪声模型或贪心勘探
使用重放内存的体验缓冲区
从经验缓冲中取样的小批量大小
在训练过程中需要向前看的步骤数
有关潜在代理属性的更多信息,请参阅内置强化学习工具箱™代理的选项对象。
的rl.Agent.CustomAgent
类已经包含了代理样本时间(SampleTime
),以及行动及观察规格(ActionInfo
和ObservationInfo
分别)。
自定义LQR代理定义以下代理属性。
属性%问问R %R反馈增益%K折现率γ = 0.95%的批评家评论家% K缓冲区KBuffer% K的更新次数KUpdate = 1%估算器更新的编号EstimateNum = 10结束属性(Access = private) Counter = 1 YBuffer HBuffer结束
构造函数
要创建自定义代理,必须定义一个构造函数:
定义动作和观察规范。有关创建这些规范的详细信息,请参见
rlNumericSpec
和rlFiniteSetSpec
.根据你的训练算法创建演员和评论家。有关更多信息,请参见创建策略和价值功能.
配置代理属性。
调用基抽象类的构造函数。
例如,LQRCustomAgent
构造函数定义连续的动作和观察空间,并创建批评家。的createCritic
函数是一个可选的辅助函数,用于定义批评家。
函数obj = LQRCustomAgent(Q,R,InitialK)检查输入参数的数量narginchk (3,3);调用抽象类的构造函数obj = obj@rl.agent.CustomAgent();%设置Q和R矩阵obj。问= Q; obj.R = R;定义观察和行动空间obj。ObservationInfo = rlNumericSpec([size(Q,1),1]);obj。一个ctionInfo = rlNumericSpec([size(R,1),1]);%创建批评家obj。批评家= createCritic(obj);初始化增益矩阵obj。K= InitialK;%初始化体验缓冲区obj。YBuffer = 0 (obj.EstimateNum,1);num = size(Q,1) + size(R,1);obj。HBuffer = 0 (obj.EstimateNum,0.5*num*(num+1));obj。KBuffer = cell(1,1000); obj.KBuffer{1} = obj.K;结束
演员兼评论家
如果你的学习算法使用评论家来评估长期奖励,使用参与者来选择行动,或者两者都使用,你必须添加这些作为代理属性。然后,在创建代理时必须创建这些对象;也就是说,在构造函数中。有关创建演员和评论家的更多信息,请参见创建策略和价值功能.
例如,自定义LQR代理使用一个评论家,存储在其评论家
财产,没有演员。批评家的创建在createCritic
方法调用的Helper函数LQRCustomAgent
构造函数。
函数批评家= createCritic(obj) nQ = size(obj. q,1);nR = size(obj.R,1);n = nQ+nR;W0 = 0.1*ones(0.5*(n+1)*n,1);批评家= rlQValueFunction({@(x,u) computeQuadraticBasis(x,u,n),w0},…getObservationInfo (obj) getActionInfo (obj));critical . options . gradientthreshold = 1;结束
在这种情况下,批评家是一个rlQValueFunction
对象。要创建此对象,必须指定自定义基函数的句柄,在本例中为computeQuadraticBasis
函数。有关更多信息,请参见培训自定义LQR代理.
所需的功能
要创建自定义强化学习代理,必须定义以下实现函数。要在自己的代码中调用这些函数,请使用抽象基类中的包装器方法。例如,打电话getActionImpl
,使用getAction
.包装器方法具有与实现方法相同的输入和输出参数。
函数 | 描述 |
---|---|
getActionImpl |
通过评估给定观测值的代理策略来选择操作 |
getActionWithExplorationImpl |
使用代理的探索模型选择一个操作 |
learnImpl |
从当前的经验中学习,并通过探索返回一个动作 |
在实现函数中,要评估演员和评论家,可以使用getValue
,getAction
,getMaxQValue
功能。
求值
rlValueFunction
批评家,你只需要观测输入,就可以获得当前观测值V
使用以下语法。V = getValue(批评家,观察);
求值
rlQValueFunction
批评你需要观察和行动输入,你可以获得当前状态-行动的值问
使用以下语法。Q = getValue(批评家,[观察,行动]);
求值
rlVectorQValueFunction
批评家你只需要将观测值输入,就可以获得当前观测值问
使用以下语法查找所有可能的离散操作。Q = getValue(批评家,观察);
对于离散的作用空间
rlQValueFunction
批评家,得到最大Q状态-作用值函数问
使用以下语法查找所有可能的离散操作。[MaxQ,MaxActionIndex] = getMaxQValue(Critic,Observation);
要评价一个行动者,就要获得行动
一个
使用以下语法。A = getAction(Actor,Observation);
对于以上每一种情况,如果你的演员或评论家网络使用递归神经网络,那么在获得相应的网络输出后,这些函数也可以返回网络状态的当前值。
getActionImpl
函数
的getActionImpl
函数评估代理的策略并选择操作。此函数必须具有以下签名,其中obj
是代理对象,观察
是目前的观察,和行动
是选定的操作。
函数action = getActionImpl(obj,Observation)
对于自定义LQR代理,通过应用u=-Kx控制律。
函数action = getActionImpl(obj,Observation)给定系统的当前状态,返回一个操作action = -obj.K*观测{:};结束
getActionWithExplorationImpl
函数
的getActionWithExplorationImpl
函数使用代理的探索模型选择操作。使用这个函数,您可以实现诸如贪心探索之类的算法。此函数必须具有以下签名,其中obj
是代理对象,观察
是目前的观察,和行动
是选定的操作。
函数action = getactionwiththeexplorationimpl (obj,Observation)
对于自定义LQR代理getActionWithExplorationImpl
函数向使用当前代理策略选择的操作添加随机白噪声。
函数action = getactionwiththeexplorationimpl (obj,Observation)根据当前观察结果,选择一个动作action = getAction(obj,Observation);%在动作中添加随机噪音num = size(obj.R,1);动作=动作+ 0.1*randn(num,1);结束
learnImpl
函数
的learnImpl
函数定义代理如何从当前经验中学习。该函数通过更新策略参数和选择具有探索功能的操作来实现代理的自定义学习算法。此函数必须具有以下签名,其中obj
是代理对象,经验值
是目前代理的经验,和行动
是选定的操作。
函数action = learnImpl(obj,exp)
代理体验是单元阵列Exp ={状态,动作,奖励,下一状态,完成}
.
状态
是目前的观察。行动
是当前操作。奖励
是当前的奖励。nextState
是下一个观察结果。结束
是一个逻辑标志,表示训练集已经完成。
对于自定义LQR代理,每次都会更新批评家参数N
步骤。
函数action = learnImpl(obj,exp)%解析经验输入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。obj.YBuffer(obj.Counter) =N;obj.HBuffer(obj.Counter,:) = H;obj。Counter = obj。计数器+ 1;其他的%按批次更新批评家参数%的经验H_buf = obj.HBuffer;y_buf = obj.YBuffer;theta = (H_buf'*H_buf)\H_buf'*y_buf;obj。批评家= setLearnableParameters(obj.Critic,{theta});根据新的临界参数推导出新的增益矩阵obj。K= getNewK(obj);%重置经验缓冲区obj。Counter = 1;obj。YBuffer = 0 (N,1);obj。HBuffer = 0 (N,0.5*num*(num+1));obj。KUpdate = obj.KUpdate + 1; obj.KBuffer{obj.KUpdate} = obj.K;结束找到并返回一个带有探索的动作action = getactionwiththeexplore (obj,exp{4});结束
可选功能
可选地,您可以通过指定a来定义如何在训练开始时重置代理resetImpl
函数签名,其中obj
是代理对象。使用此函数,您可以在训练前将代理设置为已知或随机条件。
函数resetImpl (ob)
此外,还可以根据需要在自定义代理类中定义任何其他helper函数。例如,自定义LQR代理定义acreateCritic
创建评论家和批评家的函数getNewK
函数,从训练好的批评参数中导出反馈增益矩阵。
创建自定义代理
在定义了自定义代理类之后,在MATLAB工作空间中创建它的实例。例如,要创建自定义LQR代理,请定义问
,R
,InitialK
值并调用构造函数。
Q = [10,3,1;3,5,4;1,4,9];R = 0.5*眼(3);K0 = place(A,B,[0.4,0.8,0.5]);agent = LQRCustomAgent(Q,R,K0);
在验证环境对象之后,您可以使用它来训练强化学习代理。有关训练自定义LQR代理的示例,请参见培训自定义LQR代理.