使用自定义训练循环训练强化学习策略
此示例演示如何为强化学习策略定义自定义训练循环。您可以使用此工作流使用您自己的自定义训练算法来训练强化学习策略,而不是使用强化学习工具箱™软件中的一个内置代理。
使用此工作流,您可以训练使用下列任何策略和值函数近似器的策略。
rlValueFunction
-状态值函数逼近器rlQValueFunction
-带有标量输出的状态动作值函数逼近器rlVectorQValueFunction
-带有矢量输出的状态动作函数逼近器rlContinuousDeterministicActor
-连续的确定性行动者rlDiscreteCategoricalActor
-离散随机行动者rlContinuousGaussianActor
-连续高斯作用体(随机)
在本例中,使用REINFORCE算法(没有基线)训练具有离散动作空间的离散参与者策略。有关REINFORCE算法的更多信息,请参见政策梯度代理.
固定随机生成器种子的再现性。
rng (0)
有关可用于自定义培训的函数的详细信息,请参见定制培训功能.
环境
对于本例,强化学习策略是在离散的车杆环境中训练的。在这种环境下的目标是通过在推车上施加力(动作)来平衡杆。方法创建环境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)
actorNetwork = dlnetwork with properties: Layers: [7x1 nnet.cnn.layer.Layer] Connections: [6x2 table] Learnables: [6x3 table] State: [0x3 table] InputNames: {'input'} OutputNames: {'softmax'} Initialized: 1查看summary with summary。
方法创建参与者rlDiscreteCategoricalActor
对象。
演员= rlDiscreteCategoricalActor (actorNetwork obsInfo actInfo);
加速行为人的梯度计算。
演员=加速(演员,真的);
使用创建优化器rlOptimizer
而且rlOptimizerOptions
函数。
actorOpts = rlOptimizerOptions (LearnRate = 1依照);actorOptimizer = rlOptimizer (actorOpts);
培训的设置
配置培训使用以下选项:
将训练设置为持续最多5000集,每集持续最多250步。
为了计算折现奖励,选择0.995的折现因子。
在达到最大集数后或当100集的平均奖励达到220时终止训练。
numEpisodes = 5000;maxStepsPerEpisode = 250;discountFactor = 0.995;aveWindowSize = 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%%对于动作缓冲区:% numberofaction 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 ^ (k-t) * rewardBatch(k);结束discountedReturn (t) = G;结束% 5。组织传递给丢失函数的数据。lossData。batchSize = batchSize;lossData。actInfo = actInfo;lossData。actionBatch = actionBatch;lossData。discountedReturn = discountedReturn;% 6。计算损失相对于保单的梯度%的参数。@actorLossFunction actorGradient =梯度(演员,...{observationBatch}, lossData);% 7。使用计算的梯度更新参与者网络。(演员,actorOptimizer) =更新(actorOptimizer、演员、actorGradient);% 8。更新训练可视化。episodeCumulativeReward =总和(episodeReward);episodeCumulativeRewardVector =猫(2...episodeCumulativeRewardVector episodeCumulativeReward);movingAveReward = movmean (episodeCumulativeRewardVector,...aveWindowSize, 2);addpoints (lineReward episodeCt episodeCumulativeReward);addpoints (lineAveReward、episodeCt movingAveReward(结束));drawnow;% 9。如果网络已得到充分培训,则终止培训。如果马克斯(movingAveReward) > trainingTerminationValue打破结束结束
模拟
训练结束后,对训练的策略进行模拟。
在进行模拟之前,需要重置环境。
奥林匹克广播服务公司=重置(env);
启用环境可视化,每次调用环境步骤函数时都会更新该可视化。
情节(env)
对于每个模拟步骤,执行以下操作。
方法从策略中抽样获取动作
getAction
函数。使用获得的操作值对环境进行步进。
如果达到终端条件则终止。
为stepCt = 1: maxStepsPerEpisode根据培训政策选择行动action = getAction(演员,{奥林匹克广播服务公司});%踏入环境[nextObs,奖励,结束]=步骤(env,行动{1});检查终端情况如果结束打破结束奥林匹克广播服务公司= nextObs;结束
定制培训功能
要从强化学习工具箱策略和值函数近似器中获取给定观察结果的操作和值函数,可以使用以下函数。
getValue
—获取预估的状态值或状态动作值函数。getAction
—根据当前观察结果,获取参与者的动作。getMaxQValue
-获得离散q值逼近器的估计最大状态动作值函数。
如果你的策略或值函数逼近器是一个递归神经网络,即一个至少有一层具有隐藏状态信息的神经网络,那么上述函数可以返回当前网络状态。您可以使用以下函数语法来获取和设置近似器的状态。
国家= getState(批评)
-获得近似器的状态评论家
.newCritic =设置状态(oldCritic状态)
-设置近似器的状态newCritic
,并返回结果oldCritic
.newCritic = resetState (oldCritic)
—重置所有的状态值oldCritic
返回0并返回结果newCritic
.
方法可以获取和设置近似器的可学习参数getLearnableParameters
而且setLearnableParameters
函数,分别。
除这些函数外,您还可以使用梯度
,优化
,syncParameters
函数来为策略和值函数近似器设置参数和计算梯度。
梯度
的梯度
函数计算近似损失函数的梯度。你可以计算几种不同的梯度。例如,要计算近似器输出相对于输入的梯度,可以使用以下语法。
研究生=梯度(演员,“出力”inputData)
在这里:
演员
策略或值函数近似器对象。inputData
包含到近似器的输入通道的值。研究生
包含计算的梯度。
如需更多信息,请在MATLAB命令行中键入帮助rl.function.AbstractFunction.gradient
syncParameters
的syncParameters
函数根据另一个逼近器的参数更新一个策略或值函数逼近器的可学习参数。这个函数用于更新目标参与者或批评者近似器,就像DDPG代理一样。要同步两个近似器之间的参数值,请使用以下语法。
newTargetApproximator = syncParameters (oldTargetApproximator sourceApproximator smoothFactor)
在这里:
oldTargetApproximator
策略或值函数是带有参数的近似器对象吗 .sourceApproximator
策略或值函数近似器对象是否具有相同的结构oldTargetRep
,但有参数 .smoothFactor
是平滑因子( )以浏览更新。newTargetApproximator
有相同的结构oldRep
,但其参数为 .
损失函数
REINFORCE算法中的损失函数是折现奖励和策略的对数的乘积,在所有时间步骤中求和。在自定义训练循环中计算的折扣奖励必须调整大小,以使其与策略相乘兼容。函数的第一个输入参数必须是一个单元格数组,类似于函数近似器对象的求值返回的单元格数组。有关更多信息,请参见outData
在评估
.第二个可选的输入参数包含梯度计算可能需要的附加数据。
函数loss = actorLossFunction(policy, lossData) policy = policy{1};创建动作指示矩阵。batchSize = lossData.batchSize;Z = repmat (lossData.actInfo.Elements ', 1, batchSize);actionIndicationMatrix = lossData.actionBatch(:,:) == Z;将折现收益调整为保单的大小。G = actionIndicationMatrix .* lossdata . discountereturn;G =重塑(G,大小(政策);将小于eps的任何策略值四舍五入到eps。策略(策略< eps) = eps;%计算损失。loss = -sum(G .* log(policy),“所有”);结束
Helper函数
下面的助手函数为训练可视化创建一个图形。
函数[trainingPlot, lineReward, lineAveReward] = hBuildFigure() plotRatio = 16/9;trainingPlot =图(...可见=“关闭”,...HandleVisibility =“关闭”,...NumberTitle =“关闭”,...Name =“车杆定制培训”);trainingPlot.Position(3) = plotRatio * trainingPlot.Position(4);甘氨胆酸ax = (trainingPlot);lineReward = animatedline (ax);lineAveReward = animatedline (ax,颜色=“r”、线宽= 3);包含(ax,“集”);ylabel (ax,“奖励”);传奇(ax,“累积奖励”,...“平均回报”,...位置=“西北”)标题(ax,“训练发展”);结束