主要内容

基于模型的强化学习使用自定义训练循环

这个例子显示了如何定义一个自定义为基于模型的强化学习训练循环(MBRL)算法。您可以使用此流程来训练一个MBRL政策与定制培训从强化学习算法使用政策和价值函数表征工具箱™软件。

例如如何使用内置的基于模型的政策优化(MBPO)代理,看看火车MBPO代理Cart-Pole平衡系统。内置MBPO代理的概述,请参阅基于模型的政策优化(MBPO)代理

在本例中,您使用过渡模型来产生更多的经验在训练一个自定义DQN[2]代理cart-pole环境中。在这个例子中使用的算法是基于一个MBPO算法[1]。的原始MBPO算法训练一个随机模型和软actor-critic (SAC)代理任务连续操作。相比之下,这个例子火车三个确定性模型和一个DQN代理与离散任务的行为。下图总结了这个示例中使用的算法。

图1。概述MBRL本例中使用

代理生成实际经验与环境进行交互。这些经验是用来训练一组转换模型,用于生成额外的经验。然后训练算法使用真正的和生成的经验更新代理政策。

创建环境

对于这个示例,强化学习策略训练在一个离散cart-pole环境。在这种环境下目标是平衡极运用部队(操作)在购物车。创建环境使用rlPredefinedEnv函数。解决随机发生器再现性的种子。这个环境的更多信息,请参阅负载预定义的控制系统环境

清楚clc rngSeed = 1;rng (rngSeed);env = rlPredefinedEnv (“CartPole-Discrete”);

从环境中提取观测和操作规范。

obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

获得观测的数量(numObservations)和行为(numActions)。

numObservations = obsInfo.Dimension (1);%的离散动作,-10年或10numActions =元素个数(actInfo.Elements);numContinuousActions = 1;%的力量

评论家建设

DQN是一个基于价值观的强化学习算法估计累积折扣回报使用一个评论家。在这个例子中,评论家网络包含fullyConnectedLayer,reluLayer层。

qNetwork = [featureInputLayer (obsInfo.Dimension (1) fullyConnectedLayer (24) reluLayer fullyConnectedLayer (24) reluLayer fullyConnectedLayer(长度(actInfo.Elements))];qNetwork = dlnetwork (qNetwork);

创建一个使用指定的评论家表示神经网络和选项。有关更多信息,请参见rlQValueFunction

评论家= rlVectorQValueFunction (qNetwork obsInfo actInfo);

创建优化器对象更新评论家。有关更多信息,请参见rlOptimizerOptions

optimizerOpt = rlOptimizerOptions (LearnRate = 1 e - 3,GradientThreshold = 1);criticOptimizer = rlOptimizer (optimizerOpt);

创建一个马克斯Q值的政策

政策= rlMaxQPolicy(批评);

创建转换模型

基于模型的强化学习使用过渡环境的模型。模型通常由一个转换函数,奖励功能,终端状态函数。

  • 转换函数预测下一个观察考虑到当前的观察和行动。

  • 奖励函数预测奖励给当前观察,行动,和下一个观察。

  • 终端状态函数预测终端状态的观察。

如以下图所示,这个示例使用三个过渡函数作为一个整体的过渡模型生成样本没有与环境互动。真正的回报函数和真正的终端状态函数给出了这个例子。

定义三个过渡模型的神经网络。神经网络预测下一个观察和当前观测之间的区别

numModels = 3;transitionNetwork1 =createTransitionNetwork (numObservations numContinuousActions);transitionNetwork2 =createTransitionNetwork (numObservations numContinuousActions);transitionNetwork3 =createTransitionNetwork (numObservations numContinuousActions);transitionNetworkVector = [transitionNetwork1,transitionNetwork2,transitionNetwork3];

创建经验缓冲区

创建一个缓冲区来存储代理经验经验(下观察,观察、行动、奖励,和结束)。

myBuffer。bufferSize = 1 e5;myBuffer。bufferIndex = 0;myBuffer。currentBufferLength = 0;myBuffer。观察= 0 (numObservations myBuffer.bufferSize);myBuffer。nextObservation =0 (numObservations myBuffer.bufferSize);myBuffer。action =0 (numContinuousActions 1 myBuffer.bufferSize);myBuffer。奖励= 0 (1、myBuffer.bufferSize);myBuffer。结束= zeros(1,myBuffer.bufferSize);

创建一个模型经验缓冲存储生成的经验模型。

myModelBuffer。bufferSize = 1 e5;myModelBuffer。bufferIndex = 0;myModelBuffer。currentBufferLength = 0;myModelBuffer。观察=0 (numObservations myModelBuffer.bufferSize);myModelBuffer。nextObservation =0 (numObservations myModelBuffer.bufferSize);myModelBuffer。action =0 (numContinuousActions myModelBuffer.bufferSize);myModelBuffer。奖励= 0 (1、myModelBuffer.bufferSize);myModelBuffer。结束= zeros(1,myModelBuffer.bufferSize);

配置培训

使用以下选项配置培训。

  • 最大数量的训练集- 250

  • 最大的步骤/训练集- 500

  • 折现系数- 0.99

  • 训练终止条件——平均奖励10集的值达到480

numEpisodes = 250;maxStepsPerEpisode = 500;discountFactor = 0.99;aveWindowSize = 10;trainingTerminationValue = 480;

配置模型的选择。

  • 火车过渡模型只有在收集2000个样本。

  • 火车模型使用所有的经历在现实经验在每一集里都会缓冲。使用一个mini-batch大小为256。

  • 2的模型生成轨迹长度在每集的开始。

  • 生成的轨迹numGenerateSampleIterationxnumModelsxminiBatchSize= 20 x 3 x 256 = 15360。

  • 使用相同的epsilon-greedy参数作为DQN代理,除了最低ε值。

  • 使用最小ε值为0.1,高于该值用于与环境进行交互。这样做允许模型生成更加多样化的数据。

warmStartSamples = 2000;numEpochs = 1;miniBatchSize = 256;horizonLength = 2;epsilonMinModel = 0.1;numGenerateSampleIteration = 20;sampleGenerationOptions。horizonLength = horizonLength;sampleGenerationOptions。numGenerateSampleIteration =numGenerateSampleIteration;sampleGenerationOptions。miniBatchSize= miniBatchSize; sampleGenerationOptions.numObservations = numObservations; sampleGenerationOptions.epsilonMinModel = epsilonMinModel;%优化器选择velocity1 = [];velocity2 = [];velocity3 = [];衰变= 0.01;动量= 0.9;learnRate = 0.0005;

配置DQN培训选项。

  • 使用ε贪婪算法,最初ε值是1,最小值为0.01,衰变率为0.005。

  • 更新目标网络每4步骤。

  • 设置真实的体验生成的经验比0.2:0.8设置RealRatio到0.2。设置RealRatio1.0是一样的模范自由DQN。

  • 采取5个梯度的步骤在每个环境的步骤。

ε= 1;epsilonMin = 0.01;epsilonDecay = 0.005;targetUpdateFrequency = 4;realRatio = 0.2;%设置为1 DQN运行标准numGradientSteps = 5;

创建一个向量来存储每个训练集的累积奖励。

episodeCumulativeRewardVector = [];

创建一个数据模型可视化使用培训hBuildFigureModelhelper函数。

[trainingPlotModel,lineLossTrain1,lineLossTrain2,lineLossTrain3,axModel] = hBuildFigureModel ();

创建一个数据模型验证使用的可视化hBuildFigureModelTesthelper函数。

[testPlotModel, lineLossTest1 axModelTest]= hBuildFigureModelTest ();

创建一个图DQN代理培训使用的可视化hBuildFigurehelper函数。

[trainingPlot, lineReward lineAveReward, ax = hBuildFigure;

火车代理

火车代理使用自定义训练循环。训练循环使用下面的算法。每集:

  1. 火车模型的过渡。

  2. 生成使用过渡的经验模型和存储模型中样本经验缓冲区。

  3. 生成一个真正的经验。为此,生成一个动作使用政策,应用环境行动,并获得结果的观察,奖励,并完成值。

  4. 创建一个mini-batch通过抽样的经历经验缓冲区和缓冲区模型经验。

  5. 计算目标的Q值。

  6. 计算损失函数的梯度对评论家表示参数。

  7. 更新使用计算梯度的评论家表示。

  8. 更新培训可视化。

  9. 如果评论家足够训练终止培训。

培训政策是一个计算密集型的过程。节省时间在运行这个例子中,加载一个pretrained代理设置doTraining。训练自己的政策,集doTraining真正的

doTrianing = false;如果doTrianing targetCritic =评论家;modelTrainedAtleastOnce = false;totalStepCt = 0;开始=抽搐;设置(trainingPlotModel,可见=“上”);设置(testPlotModel,可见=“上”);设置(trainingPlot,可见=“上”);episodeCt = 1: numEpisodes如果myBuffer。currentBufferLength > miniBatchSize & &totalStepCt > warmStartSamples如果realRatio < 1.0% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 1。火车过渡模型。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%培训三种转换模型[transitionNetworkVector (1)、loss1 velocity1] =trainTransitionModel (transitionNetworkVector (1),myBuffer、velocity1 miniBatchSize,numEpochs,动量,learnRate);[transitionNetworkVector (2)、loss2 velocity2] =trainTransitionModel (transitionNetworkVector (2),myBuffer、velocity2 miniBatchSize,numEpochs,动量,learnRate);[transitionNetworkVector (3)、loss3 velocity3] =trainTransitionModel (transitionNetworkVector (3),myBuffer、velocity3 miniBatchSize,numEpochs,动量,learnRate);modelTrainedAtleastOnce = true;%显示培训进展d =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain1 episodeCt loss1) addpoints (lineLossTrain2、episodeCt loss2) addpoints (lineLossTrain3、episodeCt loss3)传说(axModel,“Model1”,“Model2”,“Model3”);标题(axModel,”模式培训进展——集:“+ episodeCt +”,过去:“+ drawnow字符串(d))% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 2。使用模型生成的经验。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%创建numGenerateSampleIteration x% horizonLength xnumModels x miniBatchSize%的前女友)20 x 2 x 3 x 256 = 30720个样本myModelBuffer = generateSamples (myBuffer,myModelBuffer,actInfo transitionNetworkVector、政策,ε,sampleGenerationOptions);结束结束% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%与环境和培训代理。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%重置环境这一事件的开始观察=重置(env);episodeReward = 0 (maxStepsPerEpisode, 1);errorPreddiction = 0 (maxStepsPerEpisode, 1);stepCt = 1: maxStepsPerEpisode% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 3。生成一个经验。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -totalStepCt = totalStepCt + 1;%计算使用政策基于一个动作%当前观测。如果rand() <ε= actInfo.usample行动;其他的action = getAction(政策,{观察});结束action ={1}行动;% Udpateε如果totalStepCt > warmStartSamplesε= max(ε* (1-epsilonDecay),epsilonMin);结束%应用环境和获得的行动%结果观察和奖励。[nextObservation,奖励,结束]=步骤(env、动作);%检查预测dx =预测(transitionNetworkVector (1),dlarray(观察,“CB”),dlarray(行动,“CB”));predictedNextObservation = + dx观察;errorPreddiction (stepCt) =√sum (nextObservation -predictedNextObservation)。^ 2));%保存行动,观察,奖励和完成%的经验myBuffer = storeExperience (myBuffer,观察,行动,nextObservation、奖励、结束);episodeReward (stepCt) =奖励;观察= nextObservation;%火车DQN代理gradientCt = 1: numGradientSteps如果myBuffer。currentBufferLength > = miniBatchSize& & totalStepCt > warmStartSamples% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 4。从经验样本minibatch缓冲区。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[sampledObservation,sampledAction,sampledNextObservation,sampledReward,sampledIsdone]= sampleMinibatch (modelTrainedAtleastOnce,realRatio,miniBatchSize,myBuffer myModelBuffer);% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 5。计算目标的Q值。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%计算目标的Q值[targetQValues, MaxActionIndices] =getMaxQValue (targetCritic{重塑(sampledNextObservation[numObservations 1 miniBatchSize])});%计算目标非终结符targetQValues逻辑(sampledIsdone) (~) =逻辑(sampledIsdone sampledReward (~) +discountFactor。*targetQValues逻辑(sampledIsdone) (~);%计算目标终端状态targetQValues(逻辑(sampledIsdone)) =sampledReward(逻辑(sampledIsdone));lossData。batchSize = miniBatchSize;lossData。actInfo = actInfo;lossData。actionBatch = sampledAction;lossData。targetQValues = targetQValues;% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 6。计算梯度。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -criticGradient =梯度(评论家,@criticLossFunction,{重塑(sampledObservation[numObservations 1 miniBatchSize])},lossData);% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 7。更新网络评论家使用渐变。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[评论家,criticOptimizer] =更新(criticOptimizer,评论家,criticGradient);%更新政策参数使用评论家%的参数。政策= setLearnableParameters (政策,getLearnableParameters(批评));结束结束%定期更新目标评论家如果国防部(totalStepCt targetUpdateFrequency) = = 0 targetCritic =评论家;结束如果终端条件达到%停止。如果结束打破;结束结束%的插曲% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 8。更新培训可视化。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -episodeCumulativeReward =总和(episodeReward);episodeCumulativeRewardVector =猫(2episodeCumulativeRewardVector episodeCumulativeReward);movingAveReward = movmean (episodeCumulativeRewardVector,aveWindowSize, 2);addpoints (lineReward episodeCt episodeCumulativeReward);addpoints (lineAveReward、episodeCt movingAveReward(结束));标题(ax,“培训进展——集:“+ episodeCt +”,总一步:“字符串(totalStepCt) + +”,ε:“drawnow +字符串(ε));errorPreddiction = errorPreddiction (1: stepCt);%显示一步预测误差。addpoints (lineLossTest1 episodeCt,意味着(errorPreddiction))传说(axModelTest,“Model1”);标题(axModelTest,“一步预测误差模型——集:“+episodeCt +错误:“+drawnow字符串(意思是(errorPreddiction)))%显示培训进度每第十集如果(国防部(episodeCt 10) = = 0)流(“EP: % d,奖励:%。4 f, AveReward: %。4 f。”+“步骤:% d, TotalSteps: % d,ε:% f,”+“误差模型:% f \ n”,episodeCt,episodeCumulativeReward,movingAveReward(结束),stepCt totalStepCt,ε,意思是(errorPreddiction))结束% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% 9。终止培训%如果网络足够训练。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -如果马克斯(movingAveReward) trainingTerminationValue打破结束结束其他的负载(“cartPoleModelBasedCustomLoopPolicy.mat”);结束

模拟剂

首先模拟训练有素的特工,重置环境。

obs0 =重置(env);奥林匹克广播服务公司= obs0;

支持环境的可视化,这是每次更新环境阶跃函数。

情节(env)

为每个模拟步骤,执行以下操作。

  1. 被抽样的操作策略使用getAction函数。

  2. 步骤使用获得的环境行动的价值。

  3. 如果一个终端条件达到终止。

maxStepsPerEpisode actionVector = 0 (1);obsVector = 0 (numObservations maxStepsPerEpisode + 1);obsVector (: 1) = obs0;stepCt = 1: maxStepsPerEpisode%根据培训政策选择行动。action = getAction(政策,{奥林匹克广播服务公司});action ={1}行动;%一步环境。[nextObs,奖励,结束]=步骤(env、动作);obsVector (:, stepCt + 1) = nextObs;stepCt actionVector(1) =行动;%检查边界条件。如果结束打破结束奥林匹克广播服务公司= nextObs;结束

图车杆可视化工具包含一个坐标轴对象。坐标轴对象包含6行类型的对象,多边形。

lastStepCt = stepCt;

测试模型

测试的一个模型,预测下一个观察当前的观察和操作。

modelID = 3;predictedObsVector = 0 (numObservations lastStepCt);奥林匹克广播服务公司= dlarray (obsVector (: 1),“CB”);predictedObsVector(: 1) =奥林匹克广播服务公司;stepCt = 1: lastStepCt观察= dlarray (obsVector (:, stepCt),“CB”);stepCt action = dlarray (actionVector (1),“CB”);dx =预测(transitionNetworkVector (modelID),观察,动作);predictedObs奥林匹克广播服务公司+ dx =;predictedObsVector (:, stepCt + 1) = predictedObs;结束predictedObsVector = predictedObsVector (:, 1: lastStepCt);图(5)布局= tiledlayout (4 1“TileSpacing”,“紧凑”);我= 1:4 nexttile;errorPrediction = abs (predictedObsVector(我,1:lastStepCt)obsVector(我,1:lastStepCt));line1 =情节(errorPrediction,“DisplayName”,“绝对的错误”);标题(“观察”+ num2str(我));结束标题(布局、“预测绝对误差”)

图包含4轴对象。坐标轴对象1标题观察1包含一线类型的对象。这个对象表示绝对误差。坐标轴对象与标题观测2包含一个类型的对象。这个对象表示绝对误差。轴3标题观察3包含一个对象类型的线。这个对象表示绝对误差。坐标轴对象4标题观察4包含一个对象类型的线。这个对象表示绝对误差。

小绝对预测误差表明,模型成功地训练来预测下一个观察。

引用

[1]之上明,Koray Kavukcuoglu大卫银,亚历克斯·坟墓Ioannis Antonoglou,她女儿Wierstra,马丁Riedmiller。“玩雅达利与深度强化学习。”ArXiv: 1312.5602 (Cs)。2013年12月19日。https://arxiv.org/abs/1312.5602

[2]1月,迈克尔,贾斯汀傅,马文张,谢尔盖·莱文。“当你信任模型:基于模型的政策优化。”ArXiv: 1907.08253 (Cs,统计)2019年的11月5日。https://arxiv.org/abs/1906.08253

另请参阅

功能

对象

相关的例子

更多关于