使用自定义训练循环训练强化学习策略
这个例子展示了如何为强化学习策略定义一个自定义训练循环。您可以使用此工作流使用自己的自定义训练算法来训练强化学习策略,而不是使用来自强化学习工具箱™软件的内置代理之一。
使用此工作流,您可以训练使用下列任何策略和值函数近似器的策略。
rlValueFunction
-状态值函数逼近器rlQValueFunction
-带有标量输出的状态-动作值函数逼近器rlVectorQValueFunction
-带有矢量输出的状态-动作函数逼近器rlContinuousDeterministicActor
-连续确定性行动者rlDiscreteCategoricalActor
-离散随机actorrlContinuousGaussianActor
-连续高斯actor(随机)
在本例中,使用REINFORCE算法(没有基线)训练具有离散动作空间的离散行为者策略。有关REINFORCE算法的更多信息,请参见政策梯度代理.
固定随机生成器种子的再现性。
rng (0)
有关可用于自定义培训的函数的详细信息,请参见定制培训的功能.
环境
对于本例,强化学习策略是在离散的车杆环境中训练的。在这种环境下,目标是通过在推车上施加力(动作)来平衡杆子。属性创建环境rlPredefinedEnv
函数。
环境= 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日“名字”,“fc1”) reluLayer (“名字”,“relu1”) fullyConnectedLayer(24日“名字”,“取得”) reluLayer (“名字”,“relu2”) fullyConnectedLayer (2“名字”,“输出”) softmaxLayer (“名字”,“actionProb”));actorNetwork = dlnetwork(actorNetwork)
actorNetwork = dlnetwork with properties: Layers: [7×1 nnet.cnn.layer.Layer] Connections: [6×2 table] Learnables: [6×3 table] State: [0×3 table] InputNames: {' State '} OutputNames: {'actionProb'} Initialized: 1 .初始化
属性创建参与者rlDiscreteCategoricalActor
对象。
actor = rlDiscreteCategoricalActor(actorNetwork,obsInfo,actInfo);
加速actor的梯度计算。
Actor = accelerate(Actor,true);
使用创建优化器rlOptimizer
而且rlOptimizerOptions
函数。
actorOpts = rlOptimizerOptions(“LearnRate”1 e - 3);actorOptimizer = rlooptimizer (actorOpts);
培训的设置
将培训配置为使用以下选项:
将训练设置为最多5000集,每集最多250步。
为了计算折现奖励,选择一个折现因子0.995。
在达到最大集数或100集的平均奖励达到220时终止训练。
nummepisodes = 5000;maxStepsPerEpisode = 250;折扣因子= 0.995;aveWindowSize = 100;trainingTerminationValue = 230;
创建一个向量,用于存储每个训练集的累积奖励。
episodecumulativeredvector = [];
自定义培训循环
自定义训练循环的算法如下:每集:
重置环境。
创建缓冲区来存储经验信息:观察、行动和奖励。
产生经验,直到最后的情况发生。为此,评估策略以获得行动,将这些行动应用于环境,并获得结果观察和奖励。将动作、观察结果和奖励存储在缓冲区中。
将培训数据收集为一批经验。
计算一集蒙特卡罗回报,也就是未来的折现回报。
计算损失函数相对于策略参数的梯度。
使用计算的梯度更新策略。
更新培训可视化。
如果策略已经过充分培训,则终止培训。
doTraining = false;如果doTraining使用hBuildFigure帮助函数创建一个用于训练可视化的图形。[trainingPlot,lineReward,lineAveReward] = hBuildFigure;启用训练可视化图。集(trainingPlot,“可见”,“上”);训练策略的最大集数或直到平均集数%奖励表示该策略已经过充分训练。为episodeCt = 1:numEpisodes% 1。重置本集开始时的环境Obs = reset(env);(maxStepsPerEpisode,1);% 2。创建缓冲区来存储经验。每个缓冲区的尺寸%必须如下所示。%%用于观察缓冲:% numberOfObservations x numberOfObservationChannels x batchSize%对于动作缓冲区:% numbero派系x numberOfActionChannels x batchSize%%奖励缓冲:% 1 x batchSize%observationBuffer = 0 (numObs,1,maxStepsPerEpisode);actionBuffer = 0 (numAct,1,maxStepsPerEpisode);rewardBuffer = 0 (1,maxStepsPerEpisode);% 3。生成经验的最大数量的步骤%发作或直到达到晚期状态。为step pct = 1:maxStepsPerEpisode根据当前策略计算操作%的观察。action = getAction(actor,{obs});动作=动作{1};将动作应用到环境中,并获得结果观察和奖励。[nextObs,reward,isdone] = step(env,action);将行动、观察和奖励经验存储在缓冲区中。observationBuffer(:,:,stepCt) = obs;actionBuffer(:,:,stepCt) = action;rewardBuffer(:,stepCt) =奖励;episodeReward(stepCt) =奖励;obs = nextObs;到达终端条件时停止。如果结束打破;结束结束% 4。创建培训数据。训练是使用批数据进行的。的%批大小等于插曲的长度。batchSize = min(step pct,maxStepsPerEpisode);observationBatch = observationBuffer(:,:,1:batchSize);actionBatch = actionBuffer(:,:,1:batchSize);rewardBatch = rewardBuffer(:,1:batchSize);计算未来的折现奖励。discountereturn = 0 (1,batchSize);为t = 1:batchSize G = 0;为k = t:batchSize G = G + discountFactor ^ (k-t) * rewardBatch(k);结束discountereturn (t) = G;结束% 5。组织数据以传递给损失函数。lossData。batchSize =;lossData。actInfo = actInfo;lossData。actionBatch = actionBatch;lossData。discountereturn = discountereturn;% 6。计算损失相对于策略的梯度%的参数。(actor,@actorLossFunction,...{observationBatch}, lossData);% 7。使用计算的梯度更新角色网络。[actor,actorOptimizer] = update(actorOptimizer,actor,actorGradient);% 8。更新培训可视化。episodeCumulativeReward = sum(episodeReward);episodecumulativeredvector = cat(2,...episodeCumulativeRewardVector episodeCumulativeReward);movingAveReward = movmean(episodecumulativerwardvector,...aveWindowSize, 2);addpoints (lineReward episodeCt episodeCumulativeReward);addpoints (lineAveReward、episodeCt movingAveReward(结束));drawnow;% 9。如果网络得到了充分的训练,则终止训练。如果max(movingAveReward) > trainingTerminationValue打破结束结束其他的负载(“CustomActor.mat”);结束
模拟
训练后,模拟训练后的策略。
模拟前,请重置环境。
Rng (0) obs = reset(env);
启用环境可视化,在每次调用环境步骤函数时更新该环境可视化。
情节(env)
对于每个模拟步骤,执行以下操作。
方法从策略中采样,以获取动作
getAction
函数。使用获得的动作值对环境进行步骤。
如果达到终端条件,则终止。
为step pct = 1:maxStepsPerEpisode根据训练的策略选择行动action = getAction(actor,{obs});步骤环境[nextObs,reward,isdone] = step(env,action{1});检查终端状况如果结束打破结束obs = nextObs;结束
定制培训的功能
为了从强化学习工具箱策略和值函数近似器中获得给定观察的动作和值函数,您可以使用以下函数。
getValue
—获取预估状态值或状态-动作值函数。getAction
—根据当前的观察结果,从行为人那里获取动作。getMaxQValue
-获得离散q值逼近器的估计最大状态-动作值函数。
如果您的策略或值函数逼近器是一个循环神经网络,即至少有一层具有隐藏状态信息的神经网络,则上述函数可以返回当前网络状态。您可以使用以下函数语法来获取和设置近似器的状态。
状态= getState(批评家)
-获取近似器的状态评论家
.newCritic = setState(oldCritic,state)
—设置近似器的状态newCritic
,并返回结果oldCritic
.newCritic = resetState(oldCritic)
—重置所有的状态值oldCritic
为0并返回结果newCritic
.
方法可以获取和设置近似器的可学习参数getLearnableParameters
而且setLearnableParameters
函数,分别。
除了这些函数外,您还可以使用setLoss
,梯度
,优化
,syncParameters
函数为策略和值函数逼近器设置参数和计算梯度。
梯度
的梯度
函数计算近似器损失函数的梯度。你可以计算几种不同的梯度。例如,要计算近似器输出相对于输入的梯度,请使用以下语法。
Grad =梯度(actor,“出力”inputData)
在这里:
演员
策略或值函数近似器对象。inputData
包含到近似器的输入通道的值。研究生
包含计算的梯度。
有关详细信息,请在MATLAB命令行中键入帮助rl.function.AbstractFunction.gradient
syncParameters
的syncParameters
函数根据一个策略或值函数逼近器的可学习参数更新另一个逼近器的可学习参数。这个函数对于更新目标参与者或评论家近似器非常有用,就像DDPG代理一样。要在两个近似器之间同步参数值,请使用以下语法。
newtargetapproximation = syncParameters(oldtargetapproximation, sourceapproximation,smoothFactor)
在这里:
oldTargetApproximator
策略函数或值函数是否具有参数的近似对象 .sourceApproximator
策略或值函数近似对象是否具有相同的结构oldTargetRep
,但有参数 .smoothFactor
是平滑因子( )查阅最新资料。newTargetApproximator
有相同的结构oldRep
,但它的参数是 .
损失函数
REINFORCE算法中的损失函数是折现奖励和策略日志的乘积,在所有时间步骤中求和。在自定义训练循环中计算的折扣奖励必须调整大小,使其与策略的乘法兼容。
函数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的任何策略值。Policy (Policy < eps) = eps;计算损失。loss = -sum(G .* log(policy),“所有”);结束
Helper函数
下面的助手函数为训练可视化创建一个图形。
函数[trainingPlot, lineReward, lineAveReward] = hBuildFigure() plotRatio = 16/9;trainingPlot = figure(...“可见”,“关闭”,...“HandleVisibility”,“关闭”,...“NumberTitle”,“关闭”,...“名字”,“车杆定制培训”);trainingPlot.Position(3) = plotRatio * trainingPlot.Position(4);ax = gca(trainingPlot);lineReward = animatedline(ax);lineAveReward = animatedline(ax,“颜色”,“r”,“线宽”3);包含(ax,“集”);ylabel (ax,“奖励”);传奇(ax,“累积奖励”,的平均回报的,“位置”,“西北”)标题(ax,“训练发展”);结束