广告
返回顶部
首页 > 资讯 > 后端开发 > Python >利用PyTorch实现爬山算法
  • 820
分享到

利用PyTorch实现爬山算法

2024-04-02 19:04:59 820人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录0. 前言1. 使用 PyTorch 实现爬山算法1.1 爬山算法简介1.2 使用爬山算法进行 CartPole 游戏2. 改进爬山算法0. 前言 在随机搜索策略中,每个回合都是

0. 前言

在随机搜索策略中,每个回合都是独立的。因此,随机搜索中的所有回合都可以并行运行,最终选择能够得到最佳性能的权重。我们还通过绘制总奖励随回合增加的变化情况进行验证,可以看到奖励并没有上升的趋势。在本节中,我们将实现爬山算法 (hill-climbing alGorithm),以将在一个回合中学习到的知识转移到下一个回合中。

1. 使用 PyTorch 实现爬山算法

1.1 爬山算法简介

在爬山算法中,我们同样从随机选择的权重开始。但是,对于每个回合,我们都会为权重添加一些噪声数据。如果总奖励有所改善,我们将使用新的权重来更新原权重;否则,将保持原权重。通过这种方法,随着回合的增加,权重也会逐步修改,而不是在每个回合中随机改变。

1.2 使用爬山算法进行 CartPole 游戏

接下来,我们使用 PyTorch 实现爬山算法。首先,导入所需的包,创建一个 CartPole 环境实例,并计算状态空间和动作空间的尺寸。重用 run_episode 函数,其会根据给定权重,模拟一个回合后返回总奖励:

import gym
import torch
from matplotlib import 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)

def run_episode(env, weight):
    state = env.reset()
    total_reward = 0
    is_done = False
    while not is_done:
        state = torch.from_numpy(state).float()
        action = torch.argmax(torch.matmul(state, weight))
        state, reward, is_done, _ = env.step(action.item())
        total_reward += reward
    return total_reward

模拟 1000 个回合,并初始化变量用于跟踪最佳的总奖励以及相应的权重。同时,初始化一个空列表用于记录每个回合的总奖励:

n_episode = 1000
best_total_reward = 0
best_weight = torch.randn(n_state, n_action)

total_rewards = []

正如以上所述,我们在每个回合中为权重添加一些噪音,为了使噪声不会覆盖原权重,我们还将对噪声进行缩放,使用 0.01 作为噪声缩放因子:

noise_scale = 0.01

然后,就可以运行 run_episode 函数进行模拟。

随机选择初始权重之后,在每个回合中执行以下操作:

  • 为权重增加随机噪音
  • 智能体根据线性映射采取动作
  • 回合终止并返回总奖励
  • 如果当前奖励大于到目前为止获得的最佳奖励,更新最佳奖励和权重;否则,最佳奖励和权重将保持不变
  • 记录每回合的总奖励
for e in range(n_episode):
    weight = best_weight + noise_scale * torch.rand(n_state, n_action)
    total_reward = run_episode(env, weight)
    if total_reward >= best_total_reward:
        best_total_reward = total_reward
        best_weight = weight
    total_rewards.append(total_reward)
print('Episode {}: {}'.fORMat(e + 1, total_reward))

计算使用爬山算法所获得的平均总奖励:

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

2. 改进爬山算法

为了评估使用爬山算法的训练效果,多次重复训练过程,使用循环语句多次执行爬山算法,可以观察到平均总奖励的波动变化较大:

for i in range(10):
    best_total_reward = 0
    best_weight = torch.randn(n_state, n_action)
    total_rewards = []
    for e in range(n_episode):
        weight = best_weight + noise_scale * torch.rand(n_state, n_action)
        total_reward = run_episode(env, weight)
        if total_reward >= best_total_reward:
            best_total_reward = total_reward
            best_weight = weight
        total_rewards.append(total_reward)
        # print('Episode {}: {}'.format(e + 1, total_reward))

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

以下是我们运行10次后得到的结果:

Average total reward over 1000 episode: 200.0
Average total reward over 1000 episode: 9.846
Average total reward over 1000 episode: 82.1
Average total reward over 1000 episode: 9.198
Average total reward over 1000 episode: 9.491
Average total reward over 1000 episode: 9.073
Average total reward over 1000 episode: 149.421
Average total reward over 1000 episode: 49.584
Average total reward over 1000 episode: 8.827
Average total reward over 1000 episode: 9.369

产生如此差异的原因是什么呢?如果初始权重较差,则添加的少量噪声只会小范围改变权重,且对改善性能几乎没有影响,导致算法收敛性能不佳。另一方面,如果初始权重较为合适,则添加大量噪声可能会大幅度改变权重,使得权重偏离最佳权重并破坏算法性能。为了使爬山算法的训练更稳定,我们可以使用自适应噪声缩放因子,类似于梯度下降中的自适应学习率,随着模型性能的提升改变噪声缩放因子的大小。

为了使噪声具有自适应性,执行以下操作:

  • 指定初始噪声缩放因子
  • 如果回合中的模型性能有所改善,则减小噪声缩放因子,本节中,每次将噪声缩放因子减小为原来的一半,同时设置缩放因子最小值为 0.0001
  • 而如果回合中中的模型性能下降,则增大噪声缩放因子,本节中,每次将噪声缩放因子增大为原来的 2 倍,同时设置缩放因子最大值为 2
noise_scale = 0.01
best_total_reward = 0
best_weight = torch.randn(n_state, n_action)
total_rewards = []
for e in range(n_episode):
    weight = best_weight + noise_scale * torch.rand(n_state, n_action)
    total_reward = run_episode(env, weight)
    if total_reward >= best_total_reward:
        best_total_reward = total_reward
        best_weight = weight
        noise_scale = max(noise_scale/2, 1e-4)
    else:
        noise_scale = min(noise_scale*2, 2)
    total_rewards.append(total_reward)
    print('Episode {}: {}'.format(e + 1, total_reward))

可以看到,奖励随着回合的增加而增加。训练过程中,当一个回合中可以运行 200 个步骤时,模型的性能可以得到保持,平均总奖励也得到了极大的提升:

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

接下来,为了更加直观的观察,我们绘制每个回合的总奖励的变化情况,如下所示,可以看到总奖励有明显的上升趋势,然后稳定在最大值处:

plt.plot(total_rewards, label='search')
plt.xlabel('episode')
plt.ylabel('total_reward')
plt.legend()
plt.show()

多次运行训练过程过程,可以发现与采用恒定噪声缩放因子进行学习相比,自适应噪声缩放因子可以得到稳定的训练结果。

接下来,我们测试所得到的模型策略在 1000 个新回合中的性能表现:

n_episode_eval = 1000
total_rewards_eval = []
for episode in range(n_episode_eval):
    total_reward = run_episode(env, best_weight)
    print('Episode {}: {}'.format(episode+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: 199.98

可以看到在测试阶段的平均总奖励接近 200,即 CartPole 环境中可以获得的最高奖励。通过多次运行评估,可以获得非常一致的结果。

到此这篇关于利用PyTorch实现爬山算法的文章就介绍到这了,更多相关PyTorch爬山算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用PyTorch实现爬山算法

本文链接: https://www.lsjlt.com/news/119406.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用PyTorch实现爬山算法
    目录0. 前言1. 使用 PyTorch 实现爬山算法1.1 爬山算法简介1.2 使用爬山算法进行 CartPole 游戏2. 改进爬山算法0. 前言 在随机搜索策略中,每个回合都是...
    99+
    2022-11-11
  • 怎么利用PyTorch实现爬山算法
    这篇文章主要介绍“怎么利用PyTorch实现爬山算法”,在日常操作中,相信很多人在怎么利用PyTorch实现爬山算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用PyTorch实现爬山算法”的疑惑有所...
    99+
    2023-07-02
  • 使用Pytorch实现强化学习——DQN算法
    目录 一、强化学习的主要构成 二、基于python的强化学习框架 三、gym 四、DQN算法 1.经验回放 2.目标网络 五、使用pytorch实现DQN算法 1.replay memory 2.神经网络部分 3.Agent 4.模型训练...
    99+
    2023-09-24
    python 开发语言
  • Pytorch如何实现常用乘法算子TensorRT
    这篇文章主要介绍了Pytorch如何实现常用乘法算子TensorRT的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Pytorch如何实现常用乘法算子TensorRT文章都会有所收获,下面我们一起来看看吧。1.乘...
    99+
    2023-06-30
  • PyTorch实现FedProx联邦学习算法
    目录I. 前言III. FedProx1. 模型定义2. 服务器端3. 客户端更新IV. 完整代码I. 前言 FedProx的原理请见:FedAvg联邦学习FedProx异质网络优化...
    99+
    2022-11-11
  • PyTorch怎么实现基本算法FedAvg
    本文小编为大家详细介绍“PyTorch怎么实现基本算法FedAvg”,内容详细,步骤清晰,细节处理妥当,希望这篇“PyTorch怎么实现基本算法FedAvg”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数据介绍联...
    99+
    2023-06-30
  • pytorch 膨胀算法实现大眼效果
    目录算法思路:应用场景:代码实现:实验效果: 论文:Interactive Image Warping(1993年Andreas Gustafsson) 算法思路: 以眼睛中心为中...
    99+
    2022-11-12
  • pytorch 液态算法实现瘦脸效果
    论文:Interactive Image Warping(1993年Andreas Gustafsson) 算法思路: 假设当前点为(x,y),手动指定变形区域的中心点为C(cx,...
    99+
    2022-11-12
  • pytorch MSELoss计算平均的实现方法
    给定损失函数的输入y,pred,shape均为bxc。 若设定loss_fn = torch.nn.MSELoss(reduction='mean'),最终的输出值其实是(y - p...
    99+
    2022-11-12
  • 怎么用pytorch膨胀算法实现大眼效果
    本篇内容主要讲解“怎么用pytorch膨胀算法实现大眼效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用pytorch膨胀算法实现大眼效果”吧!算法思路:以眼睛中心为中心点,对眼睛区域向外...
    99+
    2023-06-21
  • PyTorch怎么实现FedProx联邦学习算法
    这篇文章主要介绍了PyTorch怎么实现FedProx联邦学习算法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PyTorch怎么实现FedProx联邦学习算法文章都会有所收获,下面我们一起来看看吧。I. 前言...
    99+
    2023-06-30
  • 利用Pytorch实现获取特征图的方法详解
    目录简单加载官方预训练模型图片预处理提取单个特征图提取多个特征图简单加载官方预训练模型 torchvision.models预定义了很多公开的模型结构 如果pretrained参数设...
    99+
    2022-11-11
  • 如何利用python实现Simhash算法
    目录1. 为什么需要Simhash2. 文章关键词特征提取算法TD-IDF3. Simhash原理4. Simhash的不足5. Simhash算法实现1. 为什么需要Simhash...
    99+
    2022-11-11
  • 怎么利用python实现Simhash算法
    本文小编为大家详细介绍“怎么利用python实现Simhash算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用python实现Simhash算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 为什...
    99+
    2023-07-02
  • Pytorch实现常用乘法算子TensorRT的示例代码
    目录1.乘法运算总览2.乘法算子实现2.1矩阵乘算子实现2.2点乘算子实现本文介绍一下 Pytorch 中常用乘法的 TensorRT 实现。 pytorch 用于训练,Tensor...
    99+
    2022-11-11
  • PyTorch实现联邦学习的基本算法FedAvg
    目录I. 前言II. 数据介绍特征构造III. 联邦学习1. 整体框架2. 服务器端3. 客户端IV. 代码实现1. 初始化2. 服务器端3. 客户端4. 测试V. 实验及结果VI....
    99+
    2022-11-11
  • pytorch液态算法如何实现瘦脸效果
    这篇文章主要介绍了pytorch液态算法如何实现瘦脸效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。算法思路:假设当前点为(x,y),手动指定变形区域的中心点为C(cx,c...
    99+
    2023-06-21
  • 怎么利用PyTorch实现图像识别
    这篇文章主要介绍“怎么利用PyTorch实现图像识别”,在日常操作中,相信很多人在怎么利用PyTorch实现图像识别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用PyTorch实现图像识别”的疑惑有所...
    99+
    2023-07-05
  • 利用OpenCV实现质心跟踪算法
    目录质心跟踪算法步骤项目结构使用 OpenCV 实现质心跟踪实现对象跟踪驱动程序脚本限制和缺点目标跟踪的过程: 1、获取对象检测的初始集 2、为每个初始检测创建唯一的ID 3、然后在...
    99+
    2022-11-13
  • Java利用位运算实现乘法运算详解
    目录前言正文十进制相乘二进制相乘思路分析代码实现总结前言 在上一篇中,我们介绍了使用位运算实现加法和减法运算,接下来本文主要介绍如何用位运算实现乘法运算,在实现乘法时要用位运算实现,...
    99+
    2023-05-15
    Java位运算实现乘法运算 Java位运算 乘法运算 Java位运算
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作