强化学习:策略梯度概念

2.策略梯度方法

目标是使策略 不断更新,回报更高。

计算每一个轨迹的回报,和对应的概率
目标是使回报高的轨迹概率应该高。这样整个策略的期望回报也会高。

什么是策略期望回报?
就是用这个策略跑了若干个轨迹,得到回报,然后求平均

2.1 策略梯度的主要原理

![外链图片转存失败,源

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

    # 1. 采样一个完整的 episodelog_probs = []  # 存储每个 (s_t, a_t) 的 log π(a_t|s_t)rewards = []    # 存储每个时间步的奖励 r_twhile not done:action_probs = policy_net(state_tensor)  # π(a|s)action = sample_action(action_probs)     # a_t ~ π(a|s)log_prob = torch.log(action_probs[action])  # log π(a_t|s_t)log_probs.append(log_prob)next_state, reward, done = env.step(action)rewards.append(reward)# 2. 计算每个时间步的折扣回报 G_tdiscounted_rewards = compute_discounted_rewards(rewards, gamma=0.99)# 3. 计算策略梯度损失policy_loss = []for log_prob, G_t in zip(log_probs, discounted_rewards):policy_loss.append(-log_prob * G_t)  # 负号因为 PyTorch 默认做梯度下降# 4. 反向传播total_loss = torch.stack(policy_loss).sum()  # 求和所有时间步的损失optimizer.zero_grad()total_loss.backward()  # 计算梯度 ∇θ J(θ)optimizer.step()       # 更新 θ ← θ + α ∇θ J(θ)

2.2 Reinforce 算法,也称为蒙特卡洛策略梯度,是一种策略梯度算法,它使用来自整个 episode 的估计回报来更新策略参数

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as Fclass PolicyNetwork(nn.Module):"""策略网络,输入状态,输出动作概率"""def __init__(self, state_dim, action_dim, hidden_dim=64):super(PolicyNetwork, self).__init__()self.fc1 = nn.Linear(state_dim, hidden_dim)self.fc2 = nn.Linear(hidden_dim, action_dim)def forward(self, x):x = F.relu(self.fc1(x))x = F.softmax(self.fc2(x), dim=-1)return xdef reinforce(env, policy_net, optimizer, num_episodes=1000, gamma=0.99):"""REINFORCE算法实现参数:env: 环境policy_net: 策略网络optimizer: 优化器num_episodes: 训练episode数量gamma: 折扣因子返回:每个episode的奖励列表"""episode_rewards = []for episode in range(num_episodes):state = env.reset()log_probs = []rewards = []# 采样一个完整的episodedone = Falsewhile not done:# 将状态转换为tensorstate_tensor = torch.FloatTensor(state).unsqueeze(0)  # shape: (1, state_dim)# 通过策略网络获取动作概率action_probs = policy_net(state_tensor)  # shape: (1, action_dim)# 从概率分布中采样一个动作action = torch.multinomial(action_probs, 1).item()# 也可以# dist = torch.distributions.Categorical(action_probs)# action = dist.sample()  # 标量值# 计算动作的log概率log_prob = torch.log(action_probs.squeeze(0)[action])  # shape: scalar# 执行动作next_state, reward, done, _ = env.step(action)# 存储log概率和奖励log_probs.append(log_prob)rewards.append(reward)# 更新状态state = next_state# 计算episode的折扣回报discounted_rewards = []R = 0for r in reversed(rewards):R = r + gamma * Rdiscounted_rewards.insert(0, R)# 标准化折扣回报(减少方差)discounted_rewards = torch.FloatTensor(discounted_rewards)discounted_rewards = (discounted_rewards - discounted_rewards.mean()) / (discounted_rewards.std() + 1e-9)# 计算策略梯度损失policy_loss = []for log_prob, R in zip(log_probs, discounted_rewards):policy_loss.append(-log_prob * R)  # 负号因为我们要最大化回报# 反向传播optimizer.zero_grad()policy_loss = torch.stack(policy_loss).sum()  # shape: scalarpolicy_loss.backward()optimizer.step()# 记录总奖励episode_rewards.append(sum(rewards))return episode_rewards

开始以为policy_loss 计算的是策略梯度,感觉很不合理,其实不是的,差了一个求导呢。

在这里插入图片描述

在这里插入图片描述

总结,policy_loss 的梯度 和 目标函数的梯度符号相反。
两者的梯度 符号相反。因此最大化目标函数等于最小化policy_loss

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

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

相关文章

Java 中高级开发岗技能与面试要点梳理

目录 一、核心技术深度掌握 (一)Java 语言高阶特性 JVM 底层原理剖析 并发编程高级应用 Java 新特性实战 (二)主流框架与中间件精通 Spring 生态全面掌控 分布式中间件实战精通 (三)数据库与存储优化专家 SQL 与 ORM 高级应用 分库分表实战 NoSQL 实战(Elas…

职场生存发展指南 | 边界 / 责任 / 社交 / 情绪

注:本文为“职场生存发展”相关合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 职场生存发展指南 | 边界 / 责任 / 社交 / 情绪 职场如江湖,充满机遇与挑战。在单位中立足,需深谙生存智慧——既要守住底线、…

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…

linux中执行脚本命令的source和“.”和“./”的区别

在 Linux 或类 Unix 系统中&#xff0c;source、. 和 ./ 的使用场景各有不同&#xff0c;以下详细介绍何时使用它们&#xff1a; 命令用途适合场景source和“.”等效。脚本在当前 shell 环境中执行并影响当前 shell 的状态和环境变量 1. 加载环境变量配置文件&#xff0c;无需…

games101 hw1

原理 背景 将三维空间中一个旋转的三角形&#xff0c;显示在屏幕上。 假设三角形初始点位为 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要将这三个点的坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形。 mvp AI回答&#xff1a; 在计算机…

Mybatis逆向工程详解(附源码文件)动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…

android studio中修改java逻辑对应配置的xml文件

在android studio新建一个activity&#xff0c;自动生成一个xml&#xff0c;可以更改到另一个xml吗&#xff1f; 可以。 新建一个activity&#xff1a; 如下 上图中的activity_second为xml文件&#xff0c;SecondActivity为java文件。点击后&#xff0c; AndroidManifest.x…

@SchedulerLock处理Spring Task在分布式环境下的重复执行问题

本文大纲&#x1f4d6; 1、背景&#x1f342;2、SchedulerLock注解3、实现原理 1、背景&#x1f342; Spring生态下&#xff0c;日常开发定时任务&#xff0c;使用Spring Task框架还是很常见的选择&#xff0c;但Spring Task并不是为分布式环境设计的&#xff0c;分布式环境下…

Prompt工程指南中文版

Prompt-Engineering-Guide-zh Prompt工程指南中文版 github 本文翻译改编自 Dair-ai/Prompt-Engineering-Guide 中文原帖地址为 大型语言模型Prompt书写指南 为了方便理解以及补充缺少的知识点&#xff0c;内容有所添改。除非另有说明&#xff0c;本文中所有的例子都是使用te…

「pandas 与 numpy」数据分析与处理全流程【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 106 篇 - Date: 2025 - 06 - 12 Author: 郑龙浩&#xff08;仟墨&#xff09; 文中使用的所有文件在文章顶部的资源展示 数据分析与处理 「pandas 与 numpy」 文章目录 数据分析与处理 「pandas 与 numpy」一了解数据处理1 数据处理2 数据分析第三方库 二 numpy1 基本介绍…

Fastapi + vue3 自动化测试平台(6):AI + Web UI的完美结合

&#x1f916;✨ AI Web自动化革命&#xff1a;用自然语言重塑测试体验&#xff01; 基于FastAPI Vue3的下一代Web自动化测试平台诞生&#xff01;将大语言模型 与 Web UI自动化深度结合&#xff0c;让测试脚本维护进入自然语言时代 —— 告别繁琐代码&#xff0c;拥抱智能测…

【QT】 QGraphicsItem 获取点坐标的几种方法

目录 1. 获取图元在场景中的位置 对于 QGraphicsEllipseItem&#xff08;点图元&#xff09; 2. 从 QMap 获取所有点坐标 3. 响应点击事件获取坐标 4. 获取选中点的坐标 5. 坐标转换说明 注意事项 在 Qt 图形视图框架中&#xff0c;从 QGraphicsItem&#xff08;特别是点…

伊吖学C笔记(6、数、求和、排列)

一、数 1.自然数、奇偶数 自然数也就是非负整数&#xff0c;C的循环语句很容易输出自然数&#xff0c;比如&#xff1a;输出100以内的自然数。 奇数、偶数也都是自然数&#xff1a; 2. 约数、因数 题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“…

SpringMVC与Struts2对比教学

SpringMVC 和 Struts2 就像武林中的两大门派&#xff0c;虽然都是处理 Web 请求的高手&#xff08;MVC 框架&#xff09;&#xff0c;但招式风格和内功心法大不相同。来&#xff0c;咱们用最接地气的方式掰扯掰扯&#xff0c;保准你笑着记住&#xff01; 核心区别一句话概括&a…

Nginx配置指南与最佳实践

Nginx 的配置文件通常位于 /etc/nginx/nginx.conf&#xff0c;并通过 include 指令加载其他目录&#xff08;如 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/&#xff09;中的配置片段。以下是一个结构化指南&#xff1a; 核心配置结构 # 全局配置 (主上下文) user nginx…

Apache 反向代理Unity服务器

Apache 反向代理Unity服务器 前言项目使用PHPStudy开启服务修改配置文件修改配置负载均衡&#xff08;可选&#xff09;重启 总结 前言 使用Unity开了个后台服务器&#xff0c;但是另一个Java服务器进行大量异步请求时会导致服务器回复过慢&#xff0c;所以开一个Apache缓冲一…

【力扣 简单 C++】94. 二叉树的中序遍历

目录 题目 解法一&#xff1a;递归 解法二&#xff1a;迭代 解法三&#xff1a;Morris遍历 题目 解法一&#xff1a;递归 class Solution { private:void traverse(TreeNode* root, vector<int>& inorder){if (!root)return;traverse(root->left, inorder);i…

idea2024版本设置TODO快捷键

直接开干&#xff1a; 首先打开File–>Settings…–>Editor–>Live Templates 复制文本&#xff1a;//wk TODO $data$ 定义自定义todo使用范围&#xff1a; 设置自定义todo的过滤器&#xff1a; 正式开始设置todo的过滤器&#xff1a; 复制文本&#xff1a; \bwk TO…

云原生核心技术 (12/12): 终章:使用 GitLab CI 将应用自动部署到 K8s (保姆级教程)

大家好&#xff0c;欢迎来到《云原生核心技术》系列的最终章&#xff01; 我们一起走过了漫长而充实的旅程。从 Docker 的集装箱&#xff0c;到 K8s 这座自动化的数字港口&#xff1b;从部署单个 Pod&#xff0c;到构建复杂的有状态应用。现在&#xff0c;我们站在了实现全自动…

DEVICENET转MODBUS TCP网关连接ABB机器人配置案例

在工业自动化场景中&#xff0c;DeviceNet和Modbus TCP是两种常见的通信协议。DeviceNet通常用于连接现场设备&#xff08;如传感器、执行器等&#xff09;&#xff0c;而Modbus TCP则广泛应用于以太网环境下的远程监控和数据采集。当需要将基于DeviceNet协议的ABB机器人集成到…