为了实现您自己的自定义强化学习算法,您可以通过创建自定义代理类的子类来创建自定义代理。然后,您可以在MATLAB中训练和模拟此代理®和Sim万博1manbetxulink®有关在MATLAB中创建类的更多信息,请参见用户定义类.
要定义自定义代理,首先创建一个类,该类是rl.agent.CustomAgent
班作为示例,本主题介绍在中培训的自定义LQR代理培训定制LQR代理。作为您自己代理的起点,您可以打开和修改此自定义代理类。要将示例文件添加到MATLAB路径并打开该文件,请在MATLAB命令行中键入以下代码。
addpath(完整文件(matlabroot、,“例子”,“rl”,“主要的”));编辑LQRCustomAgent.m
将类保存到自己的工作文件夹后,可以从路径中删除示例文件。
rmpath(完整文件(matlabroot、,“例子”,“rl”,“主要的”));
此类具有以下类定义,它指示代理类名称和关联的抽象代理。
classdefLQRCustomAgent
要定义代理,必须指定以下内容:
代理属性
构造函数
评估折扣长期回报的评论家陈述(如果学习需要)
基于当前观察选择动作的参与者表示(如果学习需要)
所需的代理方法
可选代理方法
在性质
在类文件的第节中,指定创建和培训代理所需的任何参数。这些参数可以包括:
贴现未来奖励的贴现因子
勘探模型的配置参数,如噪声模型或epsilon贪婪勘探
使用回放内存的经验缓冲区
用于从经验缓冲区取样的最小批量大小
培训期间要向前看的步骤数
有关潜在代理属性的详细信息,请参阅内置强化学习工具箱的选项对象™ 代理人。
这个rl.Agent.CustomAgent
类已包含代理采样时间的属性(取样时间
)以及行动和观察规范(行动信息
和观测信息
分别为)。
自定义LQR代理定义以下代理属性。
性质%QQ%RR%反馈增益K%贴现系数伽马=0.95%评论家批评家%K缓冲区KBuffer%K的更新次数KUpdate=1%估计更新次数估计数=10终止属性(访问=专用)计数器=1 YBuffer HBBuffer终止
要创建自定义代理,必须定义一个构造函数:
定义操作和观察规范。有关创建这些规范的更多信息,请参阅rlNumericSpec
和rlFiniteSetSpec
.
根据训练算法的要求创建演员和评论家表示。有关详细信息,请参阅创建策略和值函数表示.
配置代理属性。
调用基抽象类的构造函数。
例如LQR客户代理
构造函数定义了连续动作和观察空间,并创建了批评家表示。这个创作评论家
函数是一个可选的辅助函数,用于定义批评家表示。
作用obj=LQRCustomAgent(Q、R、首字母K)%检查输入参数的数量narginchk(3,3);%调用抽象类构造函数obj=obj@rl.agent.CustomAgent();%设置Q和R矩阵对象Q=Q;对象R=R;%定义观察和行动空间obj.ObservationInfo=rlNumericSpec([size(Q,1),1]);obj.ActionInfo=rlNumericSpec([size(R,1),1]);%创建批评家表示obj.Critic=createCritic(obj);%初始化增益矩阵obj.K=初始值K;%初始化经验缓冲区obj.YBuffer=zeros(obj.EstimateNum,1);num=size(Q,1)+size(R,1);obj.HBuffer=zeros(obj.EstimateNum,0.5*num*(num+1));obj.KBuffer=cell(11000);obj.KBuffer{1}=obj.K;终止
如果您的学习算法使用评论员表示法来估计长期回报、选择动作的参与者或两者,则必须将其添加为代理属性。然后,您必须在创建代理时创建这些表示法;即在构造函数中。有关创建参与者和评论员的详细信息,请参阅创建策略和值函数表示.
例如,自定义LQR代理使用存储在其批评家
属性,并且没有参与者。批评家创建是在创作评论家
helper函数,从LQR客户代理
构造器。
作用critic=createCritic(obj)nQ=size(obj.Q,1);nR=size(obj.R,1);n=nQ+nR;w0=0.1*one(0.5*(n+1)*n,1);critic=rlQValueRepresentation({@(x,u)计算平方基(x,u,n),w0},...getObservationInfo(obj),getActionInfo(obj));critic.Options.GradientThreshold=1;终止
在这种情况下,批评家是一个rlQValueRepresentation
对象要创建这样的表示,必须指定自定义基函数的句柄,在本例中为计算平方基
函数。有关此批评家表示的更多信息,请参阅培训定制LQR代理.
要创建自定义强化学习代理,必须定义以下实现功能。要在自己的代码中调用这些函数,请使用抽象基类中的包装器方法。例如,打电话getActionImpl
使用getAction
。包装器方法与实现方法具有相同的输入和输出参数。
作用 | 描述 |
---|---|
getActionImpl |
通过评估给定观察的代理策略来选择操作 |
getActionWithExplorationImpl |
使用代理的探索模型选择操作 |
learnImpl |
从当前的经验中学习,并通过探索返回行动 |
在实现函数中,要评估参与者和评论家表示,可以使用getValue
,getAction
和getMaxQValue
功能。
评估rlValueRepresentation
只需观察输入信号,即可得到状态值函数v
使用以下语法。
V=getValue(批评家、观察);
评估rlQValueRepresentation
通过观察和动作输入信号,得到状态动作值函数Q
使用以下语法。
Q=getValue(批评家、[观察、行动]);
评估rlQValueRepresentation
只需观察输入信号,即可得到状态动作值函数Q
对于所有可能的离散操作,请使用以下语法。
Q=getValue(批评家、观察);
离散动作空间rlQValueRepresentation
批评家,获得最大Q状态动作值函数Q
对于所有可能的离散操作,请使用以下语法。
[MaxQ,MaxActionIndex]=getMaxQValue(批评家,观察);
评价演员的表现(随机表示
或决定论呈现
),获取操作A.
使用以下语法。
A=行动(参与者、观察);
对于上述每种情况,如果参与者或评论家网络使用递归神经网络,则函数还可以在获得相应的网络输出后返回网络状态的当前值。
getActionImpl
作用这个getActionImpl
函数用于评估代理的策略并选择操作。此函数必须具有以下签名,其中obj
是代理对象,观察
是当前的观察结果,以及行动
是选定的操作。
作用action=getActionImpl(对象,观察)
对于自定义LQR代理,可以通过应用U=-Kx控制法。
作用action=getActionImpl(对象,观察)%给定系统的当前状态,返回操作action=-obj.K*观察{:};终止
getActionWithExplorationImpl
作用这个getActionWithExplorationImpl
函数使用代理的探索模型选择操作。使用此函数,您可以实现算法,如epsilon贪婪探索。此函数必须具有以下签名,其中obj
是代理对象,观察
是当前的观察结果,以及行动
是选定的操作。
作用action=getActionWithExplorationImpl(对象,观察)
对于自定义LQR代理getActionWithExplorationImpl
函数将随机白噪声添加到使用当前代理策略选择的操作中。
作用action=getActionWithExplorationImpl(对象,观察)%根据当前观察结果,选择一个操作动作=获取动作(obj,观察);%向动作添加随机噪波num=大小(对象R,1);action=action+0.1*randn(num,1);终止
learnImpl
作用这个learnImpl
函数定义代理如何从当前体验中学习。此函数通过更新策略参数和选择具有探索功能的操作来实现代理的自定义学习算法。此函数必须具有以下签名,其中obj
是代理对象,经验
是当前代理的经验,以及行动
是选定的操作。
作用action=learnImpl(obj,exp)
代理体验是单元阵列exp={state,action,reward,nextstate,isdone}
.
状态
这是目前的观察结果。
行动
这是当前的行动。
奖励
是当前的奖励。
下一州
这是下一个观察结果。
伊斯通
是一个逻辑标志,指示训练集已完成。
对于自定义LQR代理,critic参数将每小时更新一次N
步骤。
作用action=learnImpl(obj,exp)%解析经验输入x=exp{1}{1};u=exp{2}{1};dx=exp{4}{1};y=(x'*obj.Q*x+u'*obj.R*u);num=size(obj.Q,1)+size(obj.R,1);%在更新批评家参数之前,请等待N步N=对象估计数;h1=计算平方基(x,u,num);h2=计算平方基(dx,-obj.K*dx,num);H=h1——物体伽马*h2;如果对象计数器<=N对象计数器(对象计数器)=y;对象HBuffer(对象计数器,:)=H;对象计数器=对象计数器+1;其他的%基于批处理更新批评家参数%经历H_buf=obj.HBuffer;y_buf=obj.YBuffer;θ=(H_buf'*H_buf)\H_buf'*y_buf;obj.Critic=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=getActionWithExploration(obj,exp{4});终止
或者,您可以通过指定重置impl
具有以下函数签名的函数,其中obj
是代理对象。使用此功能,您可以在训练前将代理设置为已知或随机条件。
作用重置impl(ob)
此外,您还可以根据需要在自定义代理类中定义任何其他助手函数创作评论家
用于创建批评家表示和格特纽克
函数,该函数从经过训练的临界参数导出反馈增益矩阵。
定义自定义代理类后,在MATLAB工作区中创建该类的实例。例如,要创建自定义LQR代理,请定义Q
,R
和姓名首字母
值并调用构造函数。
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代理.