24/11/12 算法笔记<强化学习> Policy Gradient策略梯度

gradient的核心就是每次更新前要重新收集,每个阶段的actor是不一样的.

策略梯度算法的核心思想:

  1. 策略表示:首先,策略梯度方法需要一个策略,该策略能够根据当前的状态选择一个动作。这个策略通常由一个参数化的函数表示,例如一个神经网络。

  2. 梯度上升:算法通过梯度上升方法来优化策略的参数,使得期望回报最大化。梯度上升的方向是梯度的反方向,因为我们要最大化回报。

  3. 采样:在策略梯度方法中,智能体(Agent)会与环境交互,根据当前策略采样一系列的状态-动作对。

  4. 计算梯度:对于采样得到的数据,算法会计算策略参数相对于期望回报的梯度。这个梯度可以通过蒙特卡洛方法或者时间差分学习(Temporal Difference Learning, TD)来估计。

  5. 参数更新:最后,算法根据计算出的梯度来更新策略的参数。

策略梯度算法的关键步骤:

  1. 初始化:选择一个初始策略参数(通常是随机的),并初始化一些必要的变量。

  2. 交互:智能体根据当前策略与环境交互,收集状态-动作-奖励的样本。

  3. 计算回报:对于每个采样的样本,计算其回报。在策略梯度中,这通常是通过折扣回报来完成的。

  4. 估计梯度:对于每个样本,估计策略参数相对于该样本回报的梯度。

  5. 更新策略:使用梯度上升方法更新策略参数。

  6. 重复:重复步骤2-5,直到策略收敛或达到一定的迭代次数。

θ是Policy Gradient中模型的参数,给定一组模型参数它去玩n次游戏,一整把游戏的所有state、action和reward我们统称为τ 。τ 作为训练资料被收集起来训练一次模型,参数被update之后,再次去玩游戏,收集数据,之后更新模型。直至模型收敛为止。

如果先不考虑R ( τ^n ) 将每一个state都输入到network里面,整个训练过程就可以被视作是分类问题。这个式子,在 的情况下,采取 会得到高分,所以我们希望出现这个情况的概率越大越好。

而乘上R ( τ^n ) 的话,其实就是将得到的Reward当作是一个系数,放大得到高分Reward的τ 的概率。所以其实整个Policy Gradient并不是模型端有什么新的改进,甚至可以用之前常见的分类网络来做这个事情,它是一个强化学习的训练思路。

我们来看一下它的代码

import torch
import torch.nn as nn
import torch.optim as optim #优化器
import torch.distributions as dist #分布模块
import numpy as np# 定义策略网络
class PolicyNet(nn.Module):def __init__(self, state_dim, hidden_dim, action_dim):super(PolicyNet, self).__init__()self.fc1 = nn.Linear(state_dim, hidden_dim)self.fc2 = nn.Linear(hidden_dim, action_dim)def forward(self, x):x = torch.relu(self.fc1(x))x = self.fc2(x)return torch.softmax(x, dim=-1)# 定义策略梯度算法
class PolicyGradient:def __init__(self, state_dim, hidden_dim, action_dim, learning_rate, gamma, device):self.policy_net = PolicyNet(state_dim, hidden_dim, action_dim).to(device)self.optimizer = optim.Adam(self.policy_net.parameters(), lr=learning_rate)self.gamma = gammaself.device = devicedef take_action(self, state):state = torch.tensor([state], dtype=torch.float).to(self.device)probs = self.policy_net(state)action_dist = dist.Categorical(probs)action = action_dist.sample()return action.item()def update(self, transition_dict):states = torch.tensor(transition_dict['states'], dtype=torch.float).to(self.device)actions = torch.tensor(transition_dict['actions'], dtype=torch.int).to(self.device)rewards = torch.tensor(transition_dict['rewards'], dtype=torch.float).to(self.device)# 计算折扣回报G = 0returns = []for r in rewards[::-1]:G = r + self.gamma * Greturns.insert(0, G)returns = torch.tensor(returns).to(self.device)# 梯度上升self.optimizer.zero_grad()for i in range(len(states)):state = states[i]action = actions[i]log_prob = torch.log(self.policy_net(state)[action])loss = -log_prob * returns[i]loss.backward()self.optimizer.step()# 主函数
def main():device = torch.device("cuda" if torch.cuda.is_available() else "cpu")state_dim = 4  # 状态空间维度hidden_dim = 128  # 隐藏层维度action_dim = 2  # 动作空间维度learning_rate = 0.01  # 学习率gamma = 0.99  # 折扣因子num_episodes = 1000  # 训练回合数agent = PolicyGradient(state_dim, hidden_dim, action_dim, learning_rate, gamma, device)for episode in range(num_episodes):state = env.reset()done = Falserewards = []states = []actions = []while not done:action = agent.take_action(state)next_state, reward, done, _ = env.step(action)rewards.append(reward)states.append(state)actions.append(action)state = next_state# 将回合数据打包成字典transition_dict = {'states': states,'actions': actions,'rewards': rewards}# 更新策略agent.update(transition_dict)if __name__ == "__main__":main()

我们来分析每段代码

1.定义策略网络

class PolicyNet(nn.Module):def __init__(self, state_dim, hidden_dim, action_dim):super(PolicyNet, self).__init__()self.fc1 = nn.Linear(state_dim, hidden_dim)self.fc2 = nn.Linear(hidden_dim, action_dim)def forward(self, x):x = torch.relu(self.fc1(x)) #这行代码将输入数据 x 通过第一个全连接层 fc1,然后应用ReLU激活函数。ReLU函数可以增加非线性,并且有助于解决梯度消失问题。x = self.fc2(x) #这行代码将经过ReLU激活的输出作为第二个全连接层 fc2 的输入。return torch.softmax(x, dim=-1)

层这样分布的好处包括:

  • 简单性:这个网络结构非常简单,易于实现和理解。
  • 灵活性:通过调整 hidden_dim 的大小,可以灵活地控制网络的容量。
  • 非线性:ReLU激活函数引入非线性,使得网络可以学习复杂的状态-动作映射关系。
  • 概率输出:softmax输出使得网络可以直接预测每个动作的概率,这对于强化学习中的决策过程非常有用。
  • 适用于多种任务:这种结构不仅适用于强化学习,也可以用于其他需要预测概率分布的任务。

2.定义策略梯度算法类

class PolicyGradient:def __init__(self, state_dim, hidden_dim, action_dim, learning_rate, gamma, device):#策略网络self.policy_net = PolicyNet(state_dim, hidden_dim, action_dim).to(device)self.optimizer = optim.Adam(self.policy_net.parameters(), lr=learning_rate)self.gamma = gammaself.device = device

这个类初始化策略梯度算法,包括策略网络、优化器、折扣因子和设备(CPU或GPU)。优化器使用Adam算法,这是一种常用的梯度下降优化器。

什么叫策略网络?

策略网络(Policy Network)是强化学习(Reinforcement Learning, RL)中的一个概念,它是一种用于决策的神经网络,其目的是学习一个策略(policy),这个策略能够根据当前的环境状态(state)来选择一个最优的动作(action)。在强化学习中,策略网络通常被用来近似或学习一个策略函数,这个函数将状态映射到动作的概率分布。

3.策略网络采样动作

    def take_action(self, state):state = torch.tensor([state], dtype=torch.float).to(self.device)probs = self.policy_net(state)action_dist = dist.Categorical(probs)action = action_dist.sample()return action.item()

这个方法根据当前策略网络和给定的状态,采样一个动作。它首先将状态转换为张量,然后通过策略网络获取动作的概率分布,接着使用这个分布来采样一个动作。

4.更新策略网络

    def update(self, transition_dict):states = torch.tensor(transition_dict['states'], dtype=torch.float).to(self.device)actions = torch.tensor(transition_dict['actions'], dtype=torch.int).to(self.device)rewards = torch.tensor(transition_dict['rewards'], dtype=torch.float).to(self.device)# 计算折扣回报G = 0returns = []for r in rewards[::-1]:G = r + self.gamma * Greturns.insert(0, G)returns = torch.tensor(returns).to(self.device)# 梯度上升self.optimizer.zero_grad()for i in range(len(states)):state = states[i]action = actions[i]log_prob = torch.log(self.policy_net(state)[action])loss = -log_prob * returns[i]loss.backward()self.optimizer.step()

这个方法用于更新策略网络。它首先将转换数据转换为张量,然后计算折扣回报。接着,它使用梯度上升来更新策略网络的参数。对于每个样本,它计算策略网络输出的对数概率和回报的乘积,然后进行反向传播。

5.主函数

def main():device = torch.device("cuda" if torch.cuda.is_available() else "cpu")state_dim = 4  # 状态空间维度hidden_dim = 128  # 隐藏层维度action_dim = 2  # 动作空间维度learning_rate = 0.01  # 学习率gamma = 0.99  # 折扣因子num_episodes = 1000  # 训练回合数agent = PolicyGradient(state_dim, hidden_dim, action_dim, learning_rate, gamma, device)for episode in range(num_episodes):state = env.reset()done = Falserewards = []states = []actions = []while not done:action = agent.take_action(state)next_state, reward, done, _ = env.step(action)rewards.append(reward)states.append(state)actions.append(action)state = next_state# 将回合数据打包成字典transition_dict = {'states': states,'actions': actions,'rewards': rewards}# 更新策略agent.update(transition_dict)if __name__ == "__main__":main()

主函数设置了一些超参数,包括状态空间维度、隐藏层维度、动作空间维度、学习率、折扣因子和训练回合数。然后,它创建了一个策略梯度算法的实例,并开始训练过程。在每个回合中,智能体与环境交互,收集状态、动作和奖励的数据,然后使用这些数据来更新策略网络。

缺点:

  1. 高方差: 策略梯度方法通常具有高方差,这意味着学习过程可能会非常不稳定,导致策略性能的大幅波动。

  2. 探索与利用的权衡: 虽然策略梯度方法内置了探索机制,但在实践中,找到合适的探索与利用平衡可能很困难,特别是在早期训练阶段。

  3. 计算成本: 策略梯度方法可能需要大量的采样来估计梯度,这可能导致高计算成本,尤其是在复杂的环境中。

  4. 对策略表示的敏感性: 策略梯度方法的性能可能对策略表示的选择非常敏感,包括网络架构、激活函数和参数初始化等。

  5. 难以处理稀疏奖励: 在稀疏奖励的环境中,策略梯度方法可能会遇到挑战,因为智能体可能需要很长时间才能学会将动作与奖励联系起来。

  6. 策略崩溃: 在某些情况下,策略梯度方法可能会遇到策略崩溃的问题,即策略在更新过程中突然变得非常糟糕,这通常是由于梯度估计的不准确或策略更新步长过大。

  7. 难以调试和分析: 由于策略梯度方法的复杂性,调试和分析学习过程可能非常困难,特别是当策略表现不佳时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470466.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物理设备命名规则(Linux网络服务器 15)

Linux系统中的一切都是文件,硬件设备也不例外。既然都是文件,就必须有文件名称。系统内核中udev设备管理器会自动把硬件名称规范化起来,目的是让用户通过设备文件的名字可以大致了解设备属性以及分区信息。这对于陌生的设备来说特别方便。另外…

SciPy:Python 科学计算工具包的全面教程

SciPy:Python 科学计算工具包的全面教程 引言 在数据科学和科学计算的领域,Python 已经成为一种流行的编程语言。作为 Python 的核心库之一,SciPy 提供了高效的数值计算功能,是科学计算、工程和数学应用中不可或缺的工具。本文将…

SAP_MM_SD_PP_FICO_视频课程几乎免费送

朋友们,都已经是2024年了,SAP中国区都已经被合并到樱花国的亚太区了,SAP上海研发中心也陆续撤离中*,竟然还有朋友花上万RMB学习SAP,钱花了可以在挣,主要是那个视频课程一个模块下来就得上百个小时&#xff…

如何在Puppeteer中实现表单自动填写与提交:问卷调查

一、介绍 在现代市场研究中,问卷调查是一种重要的工具。企业通过在线问卷调查了解消费者对产品或服务的需求、偏好和满意度,从而为产品开发、市场营销和服务优化提供指导。然而,对于爬虫技术专家来说,批量自动化地填写和提交问卷…

深度学习——权重初始化、评估指标、梯度消失和梯度爆炸

文章目录 🌺深度学习面试八股汇总🌺权重初始化零初始化 (Zero Initialization)随机初始化 (Random Initialization)Xavier 初始化(Glorot 初始化)He 初始化正交初始化(Orthogonal Initialization)预训练模型…

实验一:自建Docker注册中心

基于容器安装运行Registry Docker Registry主要负责镜像仓库的管理 创建并启动一个运行Docker Registry: docker run -d -p 5000:5000 --restartalways --name myregistry -v /opt/data/registry:/var/lib/registry registry -v:将主机的本地/opt/data/registry目…

同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡

1路DP/HDMI/TYPE-C(手机/平板等)视频信号输入1路MIC1路LINE OUT,带1路HDMI环出,USB免驱,分辨率4K60,可采集3路信号中其中1路,按钮切换,可采集带TYPE-C接口的各品牌手机/平板/笔记本电脑等 同三维…

ReactPress技术揭秘

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 一、引言 ReactPress是一个基于React构建的开源发布平台,它不仅可以帮助用户在支持React和MySQL数据库的服务器上快速搭建自己的博客或网站,还能作为一个…

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个:客户端和服务器。客户端是提供请求的,归用户使用,发送的请求会被服务器接收,服务器根据请求做出响应,然后再将响应的数据包返回给客户端。 作为程序员,我们主要关心应…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

SpringBoot(八)使用AES库对字符串进行加密解密

博客的文章详情页面传递参数是使用AES加密过得,如下图所示: 这个AES加密是通用的加密方式,使用同一套算法,前端和后端都可以对加密之后的字符串进行加密解密操作。 目前线上正在使用的是前端javascript进行加密操作,将…

拦截器实现http请求访问本地图片

本文来记录下拦截器实现http请求访问本地图片 文章目录 概述代码实现本文小结 概述 如下图,本机(服务器)存储的图片想要在浏览器上通过Url地址访问: 浏览器直接访问 代码实现 烂机器实现文件真实地址和物理地址之间的映射 Slf4j Configuration public cl…

gpu-V100显卡相关知识

一、定义 RuntimeError: FlashAttention only supports Ampere GPUs or newer.torch attention注意力接口学习V100 架构是什么? 二、实现 RuntimeError: FlashAttention only supports Ampere GPUs or newer. 报错原因分析: GPU机器配置低,…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器,并且可以进行双向迭代。list的底层是一个双向链表,双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…

《DiffusionDet: Diffusion Model for Object Detection》ICCV2023

摘要 本文提出了一种新的框架DiffusionDet,它将目标检测任务表述为从带噪声的边界框到目标边界框的去噪扩散过程(如图一所示)。在训练阶段,目标边界框逐渐扩散到随机分布,模型学习逆转这一加噪过程。在推理阶段&#…

词嵌入方法(Word Embedding)

词嵌入方法(Word Embedding) Word Embedding是NLP中的一种技术,通过将单词映射到一个空间向量来表示每个单词 ✨️常见的词嵌入方法: 🌟Word2Vec:由谷歌提出的方法,分为CBOW(conti…

Mit6.S081-实验环境搭建

Mit6.S081-实验环境搭建 注:大家每次做一些操作的时候觉得不太保险就先把虚拟机克隆一份 前言 qemu(quick emulator):这是一个模拟硬件环境的软件,利用它可以运行我们编译好的操作系统。 准备一个Linux系统&#xf…

qt QVideoWidget详解

1. 概述 QVideoWidget是Qt框架中用于视频播放的控件。它继承自QWidget,并提供了与QMediaPlayer等多媒体播放类集成的功能。QVideoWidget可以嵌入到Qt应用程序的用户界面中,用于显示视频内容。它支持多种视频格式,并提供了基本的视频播放控制…

10款PDF合并工具的使用体验与推荐!!!

在如今的信息洪流中,我们几乎每个人都被淹没在大量的数字文档之中。无论是学生、教师还是职场人士,我们都需要高效地管理和处理这些文档。而PDF文件,凭借其跨平台的稳定性和通用性,成了最常用的文档格式之一。我们经常需要处理、编…

【AI大模型】ELMo模型介绍:深度理解语言模型的嵌入艺术

学习目标 了解什么是ELMo.掌握ELMo的架构.掌握ELMo的预训练任务.了解ELMo的效果和成绩.了解ELMo的优缺点. 目录 🍔 ELMo简介 🍔 ELMo的架构 2.1 总体架构 2.2 Embedding模块 2.3 两部分的双层LSTM模块 2.4 词向量表征模块 🍔 ELMo的预…