训练强化学习策略使用自定义训练循环
这个例子显示了如何定义一个自定义训练循环强化学习政策。您可以使用此工作流训练强化学习策略与您自己的自定义训练算法,而不是使用一个内置代理的强化学习工具箱™软件。
使用此工作流,您可以训练策略,使用下列策略和价值函数近似者。
rlValueFunction
——国家价值函数估计值rlQValueFunction
——政府行动价值函数的估计值与标量输出rlVectorQValueFunction
——政府行动的估计值与向量输出函数rlContinuousDeterministicActor
——连续确定的演员rlDiscreteCategoricalActor
——离散随机的演员rlContinuousGaussianActor
-连续高斯演员(随机)
在这个例子中,一个离散的演员政策与离散行动空间使用强化训练算法(没有基线)。关于加强算法的更多信息,请参阅策略梯度(PG)代理。
解决随机发生器再现性的种子。
rng (0)
有关函数的更多信息你可以使用自定义训练,明白了功能定制培训。
环境
对于这个示例,强化学习策略训练在一个离散cart-pole环境。在这种环境下目标是平衡极运用部队(操作)在购物车。创建环境使用rlPredefinedEnv
函数。
env = rlPredefinedEnv (“CartPole-Discrete”);
从环境中提取观测和操作规范。
obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);
获得观测空间的维数(numObs
)和可能的行动的数量(numAct
)。
numObs = obsInfo.Dimension (1);numAct = actInfo.Dimension (1);
这个环境的更多信息,请参阅负载预定义的控制系统环境。
政策
强化学习策略在本例中是一个相关联行为随机政策。它是由深层神经网络包含建模fullyConnectedLayer
,reluLayer
,softmaxLayer
层。这个网络输出为每个离散行动在当前观测概率。的softmaxLayer
确保演员输出概率值在[0,1],所有概率之和为1。
为演员创造深层神经网络。
actorNetwork = [featureInputLayer (numObs) fullyConnectedLayer (24) reluLayer fullyConnectedLayer (24) reluLayer fullyConnectedLayer (2) softmaxLayer);
转换为dlnetwork
。
actorNetwork = dlnetwork (actorNetwork);
创建一个使用一个演员rlDiscreteCategoricalActor
对象。
演员= rlDiscreteCategoricalActor (actorNetwork obsInfo actInfo);
加速梯度计算的演员。
演员=加速(演员,真的);
评估政策与一个随机观测作为输入。
policyEvalOutCell =评估(演员,{兰德(obsInfo.Dimension)});policyEvalOut = policyEvalOutCell {1}
policyEvalOut =2 x1单一列向量0.4682 - 0.5318
创建优化器使用rlOptimizer
和rlOptimizerOptions
函数。
actorOpts = rlOptimizerOptions (LearnRate = 1依照);actorOptimizer = rlOptimizer (actorOpts);
培训的设置
配置培训使用以下选项:
设置培训持续最多5000集,每集持续最多250步。
计算折扣奖励,选择折现系数为0.995。
终止培训达到的最大数量集后或当奖励在100集平均达到220的价值。
numEpisodes = 5000;maxStepsPerEpisode = 250;discountFactor = 0.995;avgWindowSize = 100;trainingTerminationValue = 220;
创建一个向量来存储每个训练集的累积奖励。
episodeCumulativeRewardVector = [];
创建一个图来可视化使用培训hBuildFigure
helper函数。
[trainingPlot, lineReward lineAveReward] = hBuildFigure;
自定义训练循环
自定义训练循环的算法如下。每集:
重置环境。
创建缓冲区来存储信息:经验观察,行动,和奖励。
生成的经验,直到终端条件发生。,评估政策的行为,这些行为适用于环境,并获得结果的观察和回报。存储操作、观察和奖励在缓冲区。
收集数据作为训练一批经验。
计算集蒙特卡罗返回,这是折现未来的回报。
计算损失函数的梯度对政策参数。
使用计算梯度更新政策。
更新培训可视化。
如果政策充分训练终止培训。
%使培训可视化情节。设置(trainingPlot,可见=“上”);%训练集的最大数量的政策%或直到平均回报表明政策%足够训练。为episodeCt = 1: numEpisodes% 1。重置环境这一事件的开始奥林匹克广播服务公司=重置(env);episodeReward = 0 (maxStepsPerEpisode, 1);% 2。创建缓冲区来存储经验。%每个缓冲区的尺寸必须如下。%为观察缓冲%:% numberOfObservations x…% numberOfObservationChannels x…% batchSize%%的行动缓冲区:% numberOfActions x…% numberOfActionChannels x…% batchSize%%奖励缓冲区:% 1 x batchSize%observationBuffer = 0 (numObs 1 maxStepsPerEpisode);actionBuffer = 0 (numAct 1 maxStepsPerEpisode);maxStepsPerEpisode rewardBuffer = 0 (1);% 3。生成的经验%的最大数量每集的步骤%或直到到达终端条件。为stepCt = 1: maxStepsPerEpisode%计算操作使用的政策%根据当前观测。action = getAction(演员,{奥林匹克广播服务公司});%应用对环境的行动%和获得结果的观察和奖励。[nextObs,奖励,结束]=步骤(env,行动{1});%保存行动,观察,%和奖励的经历在他们的缓冲区。observationBuffer (:,:, stepCt) =奥林匹克广播服务公司;actionBuffer (:,:, stepCt) ={1}行动;rewardBuffer (:, stepCt) =奖励;episodeReward (stepCt) =奖励;奥林匹克广播服务公司= nextObs;如果终端条件达到%停止。如果结束打破;结束结束% 4。创造训练数据。%执行培训使用批处理数据。%的批量大小不能超过集的长度。batchSize = min (stepCt maxStepsPerEpisode);observationBatch = observationBuffer (:: 1: batchSize);actionBatch = actionBuffer (:: 1: batchSize);rewardBatch = rewardBuffer (:, 1: batchSize);%计算贴现未来的回报。batchSize discountedReturn = 0 (1);为t = 1: batchSize G = 0;为k = t: batchSize G = G + discountFactor ^(前提)* rewardBatch (k);结束discountedReturn (t) = G;结束% 5。组织数据传递损失函数。lossData。batchSize = batchSize;lossData。actInfo = actInfo;lossData。actionBatch = actionBatch;lossData。discountedReturn = discountedReturn;% 6。计算梯度的损失%的政策参数。@actorLossFunction actorGradient =梯度(演员,…{observationBatch}, lossData);% 7。使用计算梯度更新演员网络。%的更多信息,在命令行中,类型:%帮助rl.optimizer.AbstractOptimizer /更新(演员,actorOptimizer) =更新(…actorOptimizer,…演员,…actorGradient);% 8。更新培训可视化。episodeCumulativeReward =总和(episodeReward);episodeCumulativeRewardVector =猫(2…episodeCumulativeRewardVector episodeCumulativeReward);movingAvgReward = movmean (episodeCumulativeRewardVector,…avgWindowSize, 2);addpoints (lineReward episodeCt episodeCumulativeReward);addpoints (lineAveReward、episodeCt movingAvgReward(结束));drawnow;% 9。终止培训是否足够训练网络。如果马克斯(movingAvgReward) trainingTerminationValue打破结束结束
模拟
训练后,模拟训练的政策。
在仿真之前,重置环境。
奥林匹克广播服务公司=重置(env);
支持环境的可视化,这是每次更新环境阶跃函数。
情节(env)
为每个模拟步骤,执行以下操作。
被抽样的操作策略使用
getAction
函数。步骤使用获得的环境行动的价值。
如果一个终端条件达到终止。
为stepCt = 1: maxStepsPerEpisode%根据培训政策选择行动action = getAction(演员,{奥林匹克广播服务公司});%一步环境[nextObs,奖励,结束]=步骤(env,行动{1});%检查边界条件如果结束打破结束奥林匹克广播服务公司= nextObs;结束
功能定制培训
获得行动和价值函数对于给定的观察从强化学习工具箱政策和价值函数近似者,您可以使用以下功能。
getValue
——获得估计国家或政府行动价值函数值。getAction
——从一个演员获得行动基于当前观察。getMaxQValue
——获得估计最大政府行动值函数离散核反应能量估计值。
如果你的政策或价值函数近似者是一个递归神经网络,即神经网络与至少一个层,隐藏的状态信息,前面的函数可以返回当前网络状态。您可以使用以下功能语法获取和设置的状态估计值。
国家= getState(批评)
——获得的状态估计值评论家
。newCritic =设置状态(oldCritic状态)
——设置的状态估计值newCritic
,并返回结果oldCritic
。newCritic = resetState (oldCritic)
——重置所有状态的值oldCritic
为零并返回结果newCritic
。
你可以获取和设置的可学的参数近似者使用getLearnableParameters
和setLearnableParameters
函数,分别。
除了这些功能,您可以使用梯度
,优化
,syncParameters
函数来设置参数和计算梯度政策和价值函数近似者。
梯度
的梯度
函数的梯度计算近似者损失函数。你可以计算不同的梯度。例如,计算的总和的梯度近似者输出的输入,使用以下语法。
研究生=梯度(演员,“出力”inputData)
在这里:
演员
是一个政策或价值函数近似者对象。inputData
包含值的输入通道近似者(如一个观察)。研究生
包含计算梯度。
有关更多信息,请参见梯度
。
syncParameters
的syncParameters
功能更新可学的一项政策或价值函数的参数的估计值的基础上的另一个接近者。这个函数是用于更新目标演员或评论家接近者,作为DDPG代理完成。两个近似者之间的同步参数值,使用以下语法。
newTargetApproximator = syncParameters (oldTargetApproximator,…sourceApproximator,…smoothFactor)
在这里:
oldTargetApproximator
是一种政策或参数值函数近似者对象 。sourceApproximator
是一种政策或价值函数近似者对象与相同的结构oldTargetRep
,但与参数 。smoothFactor
是一个平滑因子( )更新。newTargetApproximator
有相同的结构oldRep
,但它的参数 。
更多的信息,在MATLAB命令行中,键入帮助rl.function.AbstractFunction.syncParameters
损失函数
加强算法的损失函数之间的产品折扣奖励和操作的概率分布的对数(来自政策评估对于一个给定的观察),总结所有的时间步骤。定制培训的折扣奖励计算循环必须调整与操作的对数增加概率分布。
第一个输入参数必须是一个细胞功能返回的数组的评价函数的近似者对象。有关更多信息,请参见的描述outData
在评估
。第二、可选的输入参数包含额外的数据,可能需要通过损失计算函数。有关更多信息,请参见梯度
。
函数损失= actorLossFunction (ActProbCell lossFcnStruct)%提取产生的矩阵政策评估ActProb = ActProbCell {1};%创建行动指示矩阵。batchSize = lossFcnStruct.batchSize;Z = repmat (lossFcnStruct.actInfo.Elements ', 1, batchSize);actionIndicationMatrix = (lossFcnStruct.actionBatch (:,) = = Z);%调整贴现回到ActProb的大小。G = actionIndicationMatrix。* lossFcnStruct.discountedReturn;G =重塑(G,大小(ActProb));%轮不到eps eps任何行动的概率值。ActProb (ActProb < eps) =每股收益;%计算损失。损失=总和(G。*日志(ActProb),“所有”);结束
Helper函数
以下培训辅助函数创建一个图可视化。
函数[trainingPlt, lineRewd lineAvgRwd] = hBuildFigure () plotRatio = 16/9;trainingPlt =图(…可见=“关闭”,…HandleVisibility =“关闭”,…NumberTitle =“关闭”,…Name =“车杆定制培训”);trainingPlt.Position (3) =…plotRatio * trainingPlt.Position (4);甘氨胆酸ax = (trainingPlt);lineRewd = animatedline (ax);lineAvgRwd = animatedline (ax,颜色=“r”、线宽= 3);包含(ax,“集”);ylabel (ax,“奖励”);传奇(ax,“累积奖励”,“平均回报”,…位置=“西北”)标题(ax,“训练发展”);结束