本篇内容主要讲解“通过CartPole游戏详解PPO优化的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“通过CartPole游戏详解PPO优化的方法”吧!在一个光滑的轨道上有个推车,杆子垂直微置在推车上,随时有倒的风险。系统每次对推车施加向左或者向右的力,但我们的目标是让杆子保持直立。杆子保持直立的每个时间单位都会获得 +1 的奖励。但是当杆子与垂直方向成 15 度以上的位置,或者推车偏离中心点超过 2.4 个单位后,这一轮局游戏结束。因此我们可以获得的最高回报等于 200 。我们这里就是要通过使用 PPO 算法来训练一个强化学习模型 actor-critic ,通过对比模型训练前后的游戏运行 gif 图,可以看出来我们训练好的模型能长时间保持杆子处于垂直状态。这段代码主要是导入所需的库,并设置了一些超参数。(1)这里定义了一个函数 discounted_cumulative_sums
,免费云主机域名接受两个参数 x
和 discount
,该函数的作用是计算给定奖励序列 x
的折扣累计和,折扣因子 discount
是一个介于 0 和 1 之间的值,表示对未来奖励的折扣程度。 在强化学习中,折扣累计和是一个常用的概念,表示对未来奖励的折扣累加。(2)这里定义了一个Buffer类,用于存储训练数据。类中有如下主要的函数:init: 初始化函数,用于设置成员变量的初始值store: 将观测值、行为、奖励、价值和对数概率存储到对应的缓冲区中finish_trajectory: 结束一条轨迹,用于计算优势和回报,并更新 trajectory_start_index 的值get: 获取所有缓冲区的值,用在训练模型过程中。在返回缓冲区的值之前,将优势缓冲区的值进行标准化处理,使其均值为 0 ,方差为 1(3)这里定义了一个多层感知机(Multi-Layer Perceptron,MLP)的网络结构,有如下参数:x
:输入的张量sizes
:一个包含每一层的神经元个数的列表activation
:激活函数,用于中间层的神经元output_activation
:输出层的激活函数该函数通过循环生成相应个数的全连接层,并将 x
作为输入传入。其中,units
指定每一层的神经元个数,activation
指定该层使用的激活函数,返回最后一层的结果。(4)这里定义了一个函数 logprobabilities
,用于计算给定动作 a
的对数概率。函数接受两个参数,logits
和 a
,其中 logits
表示模型输出的未归一化的概率分布,a
表示当前采取的动作。函数首先对 logits
进行 softmax 归一化,然后对归一化后的概率分布取对数,得到所有动作的对数概率。接着,函数使用 tf.one_hot
函数生成一个 one-hot 编码的动作向量,并与所有动作的对数概率向量相乘,最后对结果进行求和得到给定动作的对数概率。(5)这里定义了一个函数 sample_action
。该函数接受一个 observation
(观测值)参数,并在 actor 网络上运行该观测值以获得动作 logits(逻辑值)。然后使用逻辑值(logits)来随机采样出一个动作,并将结果作为函数的输出。(6)这里定义了一个用于训练策略的函数train_policy
。该函数使用带权重裁剪的 PPO 算法,用于更新 actor 的权重。observation_buffer
:输入的观测缓冲区action_buffer
:输入的动作缓冲区logprobability_buffer
:输入的对数概率缓冲区advantage_buffer
:输入的优势值缓冲区在该函数内部,使用tf.GradientTape
记录执行的操作,用于计算梯度并更新策略网络。计算的策略损失是策略梯度和剪裁比率的交集和。使用优化器policy_optimizer
来更新actor的权重。最后,计算并返回 kl 散度的平均值,该值用于监控训练的过程。(7)这里实现了价值函数(critic)的训练过程,函数接受两个参数:一个是 observation_buffer
,表示当前存储的状态观察序列;另一个是 return_buffer
,表示状态序列对应的回报序列。在函数内部,首先使用 critic
模型来预测当前状态序列对应的状态值(V), 然后计算当前状态序列的平均回报与 V 之间的均方误差,并对其进行求和取平均得到损失函数 value_loss
。接下来计算梯度来更新可训练的变量值。这里用于构建强化学习中的 Actor-Critic 网络模型。首先,使用 gy m库中的 CartPole-v0 环境创建一个环境实例 env 。然后,定义了两个变量,分别表示观测空间的维度 observation_dimensions 和动作空间的大小 num_actions,这些信息都可以从 env 中获取。接着,定义了一个 Buffer 类的实例,用于存储每个时间步的观测、动作、奖励、下一个观测和 done 信号,以便后面的训练使用。然后,使用 Keras 库定义了一个神经网络模型 Actor ,用于近似模仿策略函数,该模型输入是当前的观测,输出是每个动作的概率分布的对数。另外,还定义了一个神经网络模型 Critic ,用于近似模仿值函数,该模型输入是当前的观测,输出是一个值,表示这个观测的价值。最后,定义了两个优化器,policy_optimizer 用于更新 Actor 网络的参数,value_optimizer 用于更新 Critic 网络的参数。在未训练模型之前,将模型控制游戏的情况保存是 gif ,可以看出来技术很糟糕,很快就结束了游戏。这里主要是训练模型,执行 eopch 轮,每一轮中循环 steps_per_epoch 步,每一步就是根据当前的观测结果 observation 来抽样得到下一步动作,然后将得到的各种观测结果、动作、奖励、value 值、对数概率值保存在 buffer 对象中,待这一轮执行游戏运行完毕,收集了一轮的数据之后,就开始训练策略和值函数,并打印本轮的训练结果,不断重复这个过程,打印:完成第 1 轮训练, 平均奖励: 30.864197530864196
完成第 2 轮训练, 平均奖励: 40.32258064516129
…
完成第 9 轮训练, 平均奖励: 185.1851851851852
完成第 11 轮训练, 平均奖励: 172.41379310344828
…
完成第 14 轮训练, 平均奖励: 172.41379310344828
…
完成第 18 轮训练, 平均奖励: 185.1851851851852
…
完成第 20 轮训练, 平均奖励: 200.0在训练模型之后,将模型控制游戏的情况保存是 gif ,可以看出来技术很娴熟,可以在很长的时间内使得棒子始终保持近似垂直的状态。到此,相信大家对“通过CartPole游戏详解PPO优化的方法”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
相关推荐: SpringBoot项目中怎么使用Swagger2及注解解释
本文小编为大家详细介绍“SpringBoot项目中怎么使用Swagger2及注解解释”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot项目中怎么使用Swagger2及注解解释”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。