PyTorch策略梯度算法详情

目录
  • 0. 前言
  • 1. 策略梯度算法
  • 2. 使用策略梯度算法解决CartPole问题

0. 前言

本节中,我们使用策略梯度算法解决 CartPole 问题。虽然在这个简单问题中,使用随机搜索策略和爬山算法就足够了。但是,我们可以使用这个简单问题来更专注的学习策略梯度算法,并在之后的学习中使用此算法解决更加复杂的问题。

1. 策略梯度算法

策略梯度算法通过记录回合中的所有时间步并基于回合结束时与这些时间步相关联的奖励来更新权重训练智能体。使智能体遍历整个回合然后基于获得的奖励更新策略的技术称为蒙特卡洛策略梯度。

在策略梯度算法中,模型权重在每个回合结束时沿梯度方向移动。关于梯度的计算,我们将在下一节中详细解释。此外,在每一时间步中,基于当前状态和权重计算的概率得到策略,并从中采样一个动作。与随机搜索和爬山算法(通过采取确定性动作以获得更高的得分)相反,它不再确定地采取动作。因此,策略从确定性转变为随机性。例如,如果向左的动作和向右的动作的概率为 [0.8,0.2],则表示有 80% 的概率选择向左的动作,但这并不意味着一定会选择向左的动作。

2. 使用策略梯度算法解决CartPole问题

在本节中,我们将学习使用 PyTorch 实现策略梯度算法了。 导入所需的库,创建 CartPole 环境实例,并计算状态空间和动作空间的尺寸:

import gym
import torch
import matplotlib.pyplot as plt
env = gym.make('CartPole-v0')

n_state = env.observation_space.shape[0]
print(n_state)

n_action = env.action_space.n
print(n_action)

定义 run_episode 函数,在此函数中,根据给定输入权重的情况下模拟一回合 CartPole 游戏,并返回奖励和计算出的梯度。在每个时间步中执行以下操作:

  • 根据当前状态和输入权重计算两个动作的概率 probs
  • 根据结果概率采样一个动作 action
  • 以概率作为输入计算 softmax 函数的导数 d_softmax,由于只需要计算与选定动作相关的导数,因此:

\frac {\partial p_i} {\partial z_j} = p_i(1-p_j), i=j∂zj​∂pi​​=pi​(1−pj​),i=j

  • 将所得的导数 d_softmax 除以概率 probs,以得与策略相关的对数导数 d_log
  • 根据链式法则计算权重的梯度 grad

\frac {dy}{dx}=\frac{dy}{du}\cdot\frac{du}{dx}dxdy​=dudy​⋅dxdu​

  • 记录得到的梯度 grad
  • 执行动作,累积奖励并更新状态
def run_episode(env, weight):
    state = env.reset()
    grads = []
    total_reward = 0
    is_done = False
    while not is_done:
        state = torch.from_numpy(state).float()
        # 根据当前状态和输入权重计算两个动作的概率 probs
        z = torch.matmul(state, weight)
        probs = torch.nn.Softmax(dim=0)(z)
        # 根据结果概率采样一个动作 action
        action = int(torch.bernoulli(probs[1]).item())
        # 以概率作为输入计算 softmax 函数的导数 d_softmax
        d_softmax = torch.diag(probs) - probs.view(-1, 1) * probs
        # 计算与策略相关的对数导数d_log
        d_log = d_softmax[action] / probs[action]
        # 计算权重的梯度grad
        grad = state.view(-1, 1) * d_log
        grads.append(grad)
        state, reward, is_done, _ = env.step(action)
        total_reward += reward
        if is_done:
            break
    return total_reward, grads

回合完成后,返回在此回合中获得的总奖励以及在各个时间步中计算的梯度信息,用于之后更新权重。

接下来,定义要运行的回合数,在每个回合中调用 run_episode 函数,并初始化权重以及用于记录每个回合总奖励的变量:

n_episode = 1000
weight = torch.rand(n_state, n_action)
total_rewards = []

在每个回合结束后,使用计算出的梯度来更新权重。对于回合中的每个时间步,权重都根据学习率、计算出的梯度和智能体在剩余时间步中的获得的总奖励进行更新。

我们知道在回合终止之前,每一时间步的奖励都是 1。因此,我们用于计算每个时间步策略梯度的未来奖励是剩余的时间步数。在每个回合之后,我们使用随机梯度上升方法将梯度乘以未来奖励来更新权重。这样,一个回合中经历的时间步越长,权重的更新幅度就越大,这将增加获得更大总奖励的机会。我们设定学习率为 0.001

learning_rate = 0.001

for e in range(n_episode):
    total_reward, gradients = run_episode(env, weight)
    print('Episode {}: {}'.format(e + 1, total_reward))
    for i, gradient in enumerate(gradients):
        weight += learning_rate * gradient * (total_reward - i)
    total_rewards.append(total_reward)

然后,我们计算通过策略梯度算法获得的平均总奖励:

print('Average total reward over {} episode: {}'.format(n_episode, sum(total_rewards)/n_episode))

我们可以绘制每个回合的总奖励变化情况,如下所示:

plt.plot(total_rewards)
plt.xlabel('Episode')
plt.ylabel('Reward')
plt.show()

在上图中,我们可以看到奖励会随着训练回合的增加呈现出上升趋势,然后能够在最大值处稳定。我们还可以看到,即使在收敛之后,奖励也会振荡,这是由于策略梯度算法是一种随机策略算法。

最后,我们查看学习到策略在 1000 个新回合中的性能表现,并计算平均奖励:

n_episode_eval = 1000
total_rewards_eval = []
for e in range(n_episode_eval):
    total_reward, _ = run_episode(env, weight)
    print('Episode {}: {}'.format(e+1, total_reward))
    total_rewards_eval.append(total_reward)

print('Average total reward over {} episode: {}'.format(n_episode_eval, sum(total_rewards_eval)/n_episode_eval))
# Average total reward over 1000 episode: 200

进行测试后,可以看到回合的平均奖励接近最大值 200。可以多次测试训练后的模型,得到的平均奖励较为稳定。正如我们一开始所说的那样,对于诸如 CartPole 之类的简单环境,策略梯度算法可能大材小用,但它为我们解决更加复杂的问题奠定了基础。

到此这篇关于PyTorch策略梯度算法详情的文章就介绍到这了,更多相关PyTorch梯度算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用Pytorch实现简单的线性回归算法

    最近听了张江老师的深度学习课程,用Pytorch实现神经网络预测,之前做Titanic生存率预测的时候稍微了解过Tensorflow,听说Tensorflow能做的Pyorch都可以做,而且更方便快捷,自己尝试了一下代码的逻辑确实比较简单. Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量),对于这些概念我也是一知半解,tensor和向量,矩阵等概念都有交叉的部分,下次有时间好好补一下数学的基础知识,不过现阶段的任务主要是应用,学习掌握思维和方法即可,就不再

  • 利用PyTorch实现爬山算法

    目录 0. 前言 1. 使用 PyTorch 实现爬山算法 1.1 爬山算法简介 1.2 使用爬山算法进行 CartPole 游戏 2. 改进爬山算法 0. 前言 在随机搜索策略中,每个回合都是独立的.因此,随机搜索中的所有回合都可以并行运行,最终选择能够得到最佳性能的权重.我们还通过绘制总奖励随回合增加的变化情况进行验证,可以看到奖励并没有上升的趋势.在本节中,我们将实现爬山算法 (hill-climbing algorithm),以将在一个回合中学习到的知识转移到下一个回合中. 1. 使用

  • PyTorch实现FedProx联邦学习算法

    目录 I. 前言 III. FedProx 1. 模型定义 2. 服务器端 3. 客户端更新 IV. 完整代码 I. 前言 FedProx的原理请见:FedAvg联邦学习FedProx异质网络优化实验总结 联邦学习中存在多个客户端,每个客户端都有自己的数据集,这个数据集他们是不愿意共享的. 数据集为某城市十个地区的风电功率,我们假设这10个地区的电力部门不愿意共享自己的数据,但是他们又想得到一个由所有数据统一训练得到的全局模型. III. FedProx 算法伪代码: 1. 模型定义 客户端的模

  • pytorch 液态算法实现瘦脸效果

    论文:Interactive Image Warping(1993年Andreas Gustafsson) 算法思路: 假设当前点为(x,y),手动指定变形区域的中心点为C(cx,cy),变形区域半径为r,手动调整变形终点(从中心点到某个位置M)为M(mx,my),变形程度为strength,当前点对应变形后的目标位置为U.变形规律如下, 圆内所有像素均沿着变形向量的方向发生偏移 距离圆心越近,变形程度越大 距离圆周越近,变形程度越小,当像素点位于圆周时,该像素不变形 圆外像素不发生偏移 其中,

  • PyTorch实现联邦学习的基本算法FedAvg

    目录 I. 前言 II. 数据介绍 特征构造 III. 联邦学习 1. 整体框架 2. 服务器端 3. 客户端 IV. 代码实现 1. 初始化 2. 服务器端 3. 客户端 4. 测试 V. 实验及结果 VI. 源码及数据 I. 前言 在之前的一篇博客联邦学习基本算法FedAvg的代码实现中利用numpy手搭神经网络实现了FedAvg,手搭的神经网络效果已经很好了,不过这还是属于自己造轮子,建议优先使用PyTorch来实现. II. 数据介绍 联邦学习中存在多个客户端,每个客户端都有自己的数据集

  • pytorch 膨胀算法实现大眼效果

    目录 算法思路: 应用场景: 代码实现: 实验效果:  论文:Interactive Image Warping(1993年Andreas Gustafsson) 算法思路: 以眼睛中心为中心点,对眼睛区域向外放大,就实现了大眼的效果.大眼的基本公式如下, 假设眼睛中心点为O(x,y),大眼区域半径为Radius,当前点位为A(x1,y1),对其进行改进,加入大眼程度控制变量Intensity,其中Intensity的取值范围为0-100.  其中,dis表示AO的欧式距离,k表示缩放比例因子,

  • Python强化练习之PyTorch opp算法实现月球登陆器

    目录 概述 强化学习算法种类 PPO 算法 Actor-Critic 算法 Gym LunarLander-v2 启动登陆器 PPO 算法实现月球登录器 PPO main 输出结果 概述 从今天开始我们会开启一个新的篇章, 带领大家来一起学习 (卷进) 强化学习 (Reinforcement Learning). 强化学习基于环境, 分析数据采取行动, 从而最大化未来收益. 强化学习算法种类 On-policy vs Off-policy: On-policy: 训练数据由当前 agent 不断

  • PyTorch策略梯度算法详情

    目录 0. 前言 1. 策略梯度算法 2. 使用策略梯度算法解决CartPole问题 0. 前言 本节中,我们使用策略梯度算法解决 CartPole 问题.虽然在这个简单问题中,使用随机搜索策略和爬山算法就足够了.但是,我们可以使用这个简单问题来更专注的学习策略梯度算法,并在之后的学习中使用此算法解决更加复杂的问题. 1. 策略梯度算法 策略梯度算法通过记录回合中的所有时间步并基于回合结束时与这些时间步相关联的奖励来更新权重训练智能体.使智能体遍历整个回合然后基于获得的奖励更新策略的技术称为蒙特

  • pytorch创建tensor函数详情

    目录 1.通过复制数据构造张量 1.1 torch.tensor() 1.2 将numpy的ndarray转为tensor 2.生成全0或者全1的tensor 3.生成序列 3.1. 生成一个指定步长的等差序列 3.2 生成一个指定步数的等差数列 4.生成指定大小的单位矩阵 5.生成一个指定大小张量 6. 创建一个指定大小的张量.张量的数据是填充的指定值 1.通过复制数据构造张量 1.1 torch.tensor() torch.tensor([[0.1, 1.2], [2.2, 3.1], [

  • pytorch的梯度计算以及backward方法详解

    基础知识 tensors: tensor在pytorch里面是一个n维数组.我们可以通过指定参数reuqires_grad=True来建立一个反向传播图,从而能够计算梯度.在pytorch中一般叫做dynamic computation graph(DCG)--即动态计算图. import torch import numpy as np # 方式一 x = torch.randn(2,2, requires_grad=True) # 方式二 x = torch.autograd.Variabl

  • pytorch对梯度进行可视化进行梯度检查教程

    目的: 在训练神经网络的时候,有时候需要自己写操作,比如faster_rcnn中的roi_pooling,我们可以可视化前向传播的图像和反向传播的梯度图像,前向传播可以检查流程和计算的正确性,而反向传播则可以大概检查流程的正确性. 实验 可视化rroi_align的梯度 1.pytorch 0.4.1及之前,需要声明需要参数,这里将图片数据声明为variable im_data = Variable(im_data, requires_grad=True) 2.进行前向传播,最后的loss映射为

  • Python实现归一化算法详情

    目录 1.前言 2.Min-Max方法 2.1 公式 2.2 算法实现逻辑 2.3 代码 2.4局限 3 Z-score标准化 3.1 公式 3.2 算法实现逻辑 3.3 代码 3.4 局限 4 小数定标法 4.1 公式 4.2 算法实现逻辑 4.3 代码实现 4.4 局限 1.前言 归一化算法Normalization将数据处理成量纲一直的数据,一般限定在[0,1].[-1,1]一般在进行建模的时候需要进行数据归一化处理, 原因如下: 降低计算难度 有可能提高模型的预测精度 消除量纲影响 下面

  • Pytorch中使用TensorBoard详情

    目录 前言 一. Introduction to TensorBoard 二.TensoBoard Pipeline 三.后端数据记录 1. SummaryWriter类 2. 添加数据 3. 关闭SummaryWriter 4. Summary 四.前端显示数据 1. 默认使用 2. 修改端口 五.Summary 1. SummaryWriter APIs 本文记录了如何在Pytorch中使用Tensorboard(主要是为了备忘) 前言 虽然我本身就会用TensorBoard,但是因为Ten

  • JavaScript二叉树及各种遍历算法详情

    目录 什么是二叉树 满二叉树 完全二叉树 二叉树的存储 数组存储 链表存储 与二叉树相关的算法 深度优先遍历 广度优先遍历 先序遍历 中序遍历 后序遍历 前言: 上一篇文章中介绍了树的概念.深度优先遍历和广度优先遍历,这篇文章我们来学习一个特殊的树——二叉树. 什么是二叉树 二叉树是每个节点最多只能有两个子节点的树,如下图所示: 一个二叉树具有以下几个特质: 第i层的节点最有只有2^(i-1)个: 如果这颗二叉树的深度为k,那二叉树最多有2^k-1个节点: 在一个非空的二叉树中,若使用n0表示叶

  • React函数组件hook原理及构建hook链表算法详情

    目录 写在前面的小结 Demo fiber hook 链表 hook 对象及其属性介绍 useState Hook 对象 useRef Hook useEffect.useLayoutEffect 以及 useImperativeHandle useMemo useCallback 构建 Hook 链表的源码 renderWithHooks 函数组件执行 构建 hook 链表的算法 mountWorkInProgressHook 构建 hook 链表算法 updateWorkInProgress

  • python数学建模之三大模型与十大常用算法详情

    目录 前言 1 三大模型与十大常用算法[简介] 1-1 三大模型 1-2 十大常用算法 2 python数据分析之Pandas 2-1什么是pandas 2-2 pandas读取文件 2-3 pandas数据结构 2-3-1 pandas数据结构之DataFrame 2-3-1 Pandas 数据结构之Series 2-4查询数据 前言 数学建模的介绍与作用 全国大学生数学建模竞赛:全国大学生数学建模竞赛创办于1992年,每年一届,已成为全国高校规模最大的基础性学科竞赛,也是世界上规模最大的数学

随机推荐