强化学习笔记之【DDPG算法】

news2024/11/29 13:33:59

强化学习笔记之【DDPG算法】


文章目录

前言:

本文为强化学习笔记第二篇,第一篇讲的是Q-learning和DQN

就是因为DDPG引入了Actor-Critic模型,所以比DQN多了两个网络,网络名字功能变了一下,其它的就是软更新之类的小改动而已

本文初编辑于2024.10.6

CSDN主页:https://blog.csdn.net/rvdgdsva

博客园主页:https://www.cnblogs.com/hassle

博客园本文链接:

真 · 图文无关

原论文伪代码

  • 上述代码为DDPG原论文中的伪代码

DDPG算法

需要先看:

Deep Reinforcement Learning (DRL) 算法在 PyTorch 中的实现与应用【DDPG部分】【没有在选择一个新的动作的时候,给policy函数返回的动作值增加一个噪音】【critic网络与下面不同】

深度强化学习笔记——DDPG原理及实现(pytorch)【DDPG伪代码部分】【这个跟上面的一样没有加噪音】【critic网络与上面不同】

【深度强化学习】(4) Actor-Critic 模型解析,附Pytorch完整代码【选看】【Actor-Critic理论部分】


如果需要给policy函数返回的动作值增加一个噪音,实现如下

def select_action(self, state, noise_std=0.1):
    state = torch.FloatTensor(state.reshape(1, -1))
    action = self.actor(state).cpu().data.numpy().flatten()
    
    # 添加噪音,上面两个文档的代码都没有这个步骤
    noise = np.random.normal(0, noise_std, size=action.shape)
    action = action + noise
    
    return action


DDPG 中的四个网络

注意!!!这个图只展示了Critic网络的更新,没有展示Actor网络的更新

  • Actor 网络(策略网络)
    • 作用:决定给定状态 ss 时,应该采取的动作 a=π(s)a=π(s),目标是找到最大化未来回报的策略。
    • 更新:基于 Critic 网络提供的 Q 值更新,以最大化 Critic 估计的 Q 值。
  • Target Actor 网络(目标策略网络)
    • 作用:为 Critic 网络提供更新目标,目的是让目标 Q 值的更新更为稳定。
    • 更新:使用软更新,缓慢向 Actor 网络靠近。
  • Critic 网络(Q 网络)
    • 作用:估计当前状态 ss 和动作 aa 的 Q 值,即 Q(s,a)Q(s,a),为 Actor 提供优化目标。
    • 更新:通过最小化与目标 Q 值的均方误差进行更新。
  • Target Critic 网络(目标 Q 网络)
    • 作用:生成 Q 值更新的目标,使得 Q 值更新更为稳定,减少振荡。
    • 更新:使用软更新,缓慢向 Critic 网络靠近。

大白话解释:

​ 1、DDPG实例化为actor,输入state输出action
​ 2、DDPG实例化为actor_target
​ 3、DDPG实例化为critic_target,输入next_state和actor_target(next_state)经DQN计算输出target_Q
​ 4、DDPG实例化为critic,输入state和action输出current_Q,输入state和actor(state)【这个参数需要注意,不是action】经负均值计算输出actor_loss

​ 5、current_Q 和target_Q进行critic的参数更新
​ 6、actor_loss进行actor的参数更新

action实际上是batch_action,state实际上是batch_state,而batch_action != actor(batch_state)

因为actor是频繁更新的,而采样是随机采样,不是所有batch_action都能随着actor的更新而同步更新

Critic网络的更新是一发而动全身的,相比于Actor网络的更新要复杂要重要许多


代码核心更新公式

t a r g e t   ‾ Q = c r i t i c   ‾ t a r g e t ( n e x t   ‾ s t a t e , a c t o r   ‾ t a r g e t ( n e x t   ‾ s t a t e ) ) t a r g e t   ‾ Q = r e w a r d + ( 1 − d o n e ) × g a m m a × t a r g e t   ‾ Q . d e t a c h ( ) target\underline{~}Q = critic\underline{~}target(next\underline{~}state, actor\underline{~}target(next\underline{~}state)) \\target\underline{~}Q = reward + (1 - done) \times gamma \times target\underline{~}Q.detach() target Q=critic target(next state,actor target(next state))target Q=reward+(1done)×gamma×target Q.detach()

  • 上述代码与伪代码对应,意为计算预测Q值

c r i t i c   ‾ l o s s = M S E L o s s ( c r i t i c ( s t a t e , a c t i o n ) , t a r g e t   ‾ Q ) c r i t i c   ‾ o p t i m i z e r . z e r o   ‾ g r a d ( ) c r i t i c   ‾ l o s s . b a c k w a r d ( ) c r i t i c   ‾ o p t i m i z e r . s t e p ( ) critic\underline{~}loss = MSELoss(critic(state, action), target\underline{~}Q) \\critic\underline{~}optimizer.zero\underline{~}grad() \\critic\underline{~}loss.backward() \\critic\underline{~}optimizer.step() critic loss=MSELoss(critic(state,action),target Q)critic optimizer.zero grad()critic loss.backward()critic optimizer.step()

  • 上述代码与伪代码对应,意为使用均方误差损失函数更新Critic

a c t o r   ‾ l o s s = − c r i t i c ( s t a t e , a c t o r ( s t a t e ) ) . m e a n ( ) a c t o r   ‾ o p t i m i z e r . z e r o   ‾ g r a d ( ) a c t o r   ‾ l o s s . b a c k w a r d ( ) a c t o r   ‾ o p t i m i z e r . s t e p ( ) actor\underline{~}loss = -critic(state,actor(state)).mean() \\actor\underline{~}optimizer.zero\underline{~}grad() \\ actor\underline{~}loss.backward() \\ actor\underline{~}optimizer.step() actor loss=critic(state,actor(state)).mean()actor optimizer.zero grad()actor loss.backward()actor optimizer.step()

  • 上述代码与伪代码对应,意为使用确定性策略梯度更新Actor

c r i t i c   ‾ t a r g e t . p a r a m e t e r s ( ) . d a t a = ( t a u × c r i t i c . p a r a m e t e r s ( ) . d a t a + ( 1 − t a u ) × c r i t i c   ‾ t a r g e t . p a r a m e t e r s ( ) . d a t a ) a c t o r   ‾ t a r g e t . p a r a m e t e r s ( ) . d a t a = ( t a u × a c t o r . p a r a m e t e r s ( ) . d a t a + ( 1 − t a u ) × a c t o r   ‾ t a r g e t . p a r a m e t e r s ( ) . d a t a ) critic\underline{~}target.parameters().data=(tau \times critic.parameters().data + (1 - tau) \times critic\underline{~}target.parameters().data) \\ actor\underline{~}target.parameters().data=(tau \times actor.parameters().data + (1 - tau) \times actor\underline{~}target.parameters().data) critic target.parameters().data=(tau×critic.parameters().data+(1tau)×critic target.parameters().data)actor target.parameters().data=(tau×actor.parameters().data+(1tau)×actor target.parameters().data)

  • 上述代码与伪代码对应,意为使用策略梯度更新目标网络

Actor和Critic的角色

  • Actor:负责选择动作。它根据当前的状态输出一个确定性动作。
  • Critic:评估Actor的动作。它通过计算状态-动作值函数(Q值)来评估给定状态和动作的价值。

更新逻辑

  • Critic的更新
    1. 使用经验回放缓冲区(Experience Replay)从中采样一批经验(状态、动作、奖励、下一个状态)。
    2. 计算目标Q值:使用目标网络(critic_target)来估计下一个状态的Q值(target_Q),并结合当前的奖励。
    3. 使用均方误差损失函数(MSELoss)来更新Critic的参数,使得预测的Q值(target_Q)与当前Q值(current_Q)尽量接近。
  • Actor的更新
    1. 根据当前的状态(state)从Critic得到Q值的梯度(即对Q值相对于动作的偏导数)。
    2. 使用确定性策略梯度(DPG)的方法来更新Actor的参数,目标是最大化Critic评估的Q值。

个人理解:

DQN算法是将q_network中的参数每n轮一次复制到target_network里面

DDPG使用系数 τ \tau τ来更新参数,将学习到的参数更加soft地拷贝给目标网络

DDPG采用了actor-critic网络,所以比DQN多了两个网络

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

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

相关文章

虚拟电厂可视化:智能能源管理新时代

通过图扑可视化技术,全方位展示虚拟电厂的运行状态,优化能源生产与消耗,提高电网效率和稳定性,实现智能能源管理。

第十一篇——鸡兔同笼:方程这个数学工具为什么很强大?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 数学的伟大思想;不仅仅是我们解决了某一个具体问题&#xff1…

TIBCO Jaspersoft Studio 创建数据源并进行测试

1、连接数据源: 右键Data Adapters ,然后新建 根自己的情况,进行创建,这里测试用的是excel表格。 2、新建Jasper Report,然后我们选择刚刚创建的数据源 这样report就建好了,然后我们进行测试。 3、先把不…

永旺梦乐城盛大开业,3300个停车位的智慧运营管理系统上线!

长沙首家! 永旺梦乐城 9月12日正式开业! 这座融合特色餐饮、娱乐体验的商场, 将为长沙消费者带来, 超越传统商业综合体的全新体验。 开业当日,占地1.3万平方米的永旺超市人声鼎沸,顾客络绎不绝&#x…

使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应:详细教程 在现代应用程序中,API调用是一个非常常见的任务。本文将通过一个完整的示例,讲解如何使用Java调用OpenAI的ChatGPT API,并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI…

红米Turbo 3工程固件预览 修复底层 体验原生态系统 默认开启diag端口

红米Turbo 3机型代码:peridot 国外版本:POCO F6 用于以下型号的小米机型:24069RA21C, 24069PC21G, 24069PC21I。搭载1.5K OLED屏、骁龙8s处理器、5000mAh电池+90W快充、5000万像素主摄。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝�…

探索MinimalModbus:Python中强大的Modbus通信库

文章目录 **探索MinimalModbus:Python中强大的Modbus通信库**一、背景介绍:为什么选择MinimalModbus?二、MinimalModbus是什么?三、如何安装MinimalModbus?四、MinimalModbus的基本使用4.1 读取寄存器4.2 写入寄存器4.…

【平方差 / C】

题目 思路 打表找规律 枚举小区间对于判断要妥协&#xff0c;我这里选取100内的x, y #include <bits/stdc.h> using namespace std; bool st[120]; int main() {for(int i 1; i < 100; i){for(int x 0; x < 100; x ){for(int y 0; y < 100; y){if(!st[i])i…

关于Zipf定律与TF—IDF的一个实践

在这篇文章中&#xff0c;我将通过机器学习中的线性回归来计算zipf定律中一个经验常数alpha&#xff0c;还会画TF-IDF的图像&#xff0c;此外还将简单介绍下与zipf、TF-IDF有关的知识。 在之前的一篇文章中我曾介绍过TF-IDF&#xff0c;但之后我又阅读了Ricardo Baeza-Yates和…

我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程

先上目录思维导图&#x1f447; 大家好&#xff0c;我是程普。 前段时间&#xff0c;我发布了第一个出海产品 PH Copilot&#xff0c;是一个基于 Plasmo 开发的 Chrome 插件和 Next.js 开发的落地页与服务端的全栈产品。 现在我把这个产品的完整实现写成系统性教程&#xff0…

强化学习笔记之【Q-learning算法和DQN算法】

强化学习笔记&#xff08;一&#xff09;——Q-learning和DQN算法核心公式 文章目录 强化学习笔记&#xff08;一&#xff09;——Q-learning和DQN算法核心公式前言&#xff1a;Q-learning算法DQN算法 前言&#xff1a; 强化学习领域&#xff0c;繁冗复杂的大段代码里面&#…

华为平板与非华为电脑多屏协同及Bug处理

本文参考B站空降猫咪、鱼翅2002、知乎奔跑的小牛、夏风微微等博主。 电脑版本型号&#xff1a;拯救者Y7000&#xff0c;核显3050Ti,无集成显卡 平板版本型号&#xff1a;华为matepad pro解决办法&#xff1a; 下载空降猫咪的安装器PCManagerInstaller_20230801 CSDN下载链接 …

Redis中BitMap实现签到与统计连续签到功能

服务层代码 //签到Overridepublic Result sign() {//1.获取当前登录的用户Long userId UserHolder.getUser().getId();//获取日期LocalDateTime now LocalDateTime.now();//拼接keyString keySuffix now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String …

网页打不开、找不到服务器IP地址

现象&#xff1a;网络连接ok&#xff0c;软件能正常使用&#xff0c;当网页打不开。 原因&#xff1a;DNS 配置错误导致网站域名无法正确解析造成。 影响DNS设置的&#xff1a;VPN软件、浏览器DNS服务选择、IPv4属性被修改。 1、VPN代理未关闭 2、浏览器DNS解析选择 3、以太…

华为eNSP:端口隔离

一&#xff0c;什么是端口隔离 端口隔离是一种网络配置技术&#xff0c;用于将不同的网络设备或用户隔离在不同的虚拟局域网&#xff08;VLAN&#xff09;中&#xff0c;以实现网络流量的隔离和安全性提升。通过在交换机或路由器上配置端口隔离&#xff0c;可以将连接到同一设…

原来大模型训练实战,是需要这些项目!!

去年侧重大模型和GPT的原理&#xff0c;今年就侧重项目实战了。找到的这个合集不仅收集了大模型训练实战&#xff0c;还有微调实战&#xff0c;分布式训练&#xff0c;真的很全。 下面汇总了我在大模型实践中训练相关的所有教程。从6B到65B&#xff0c;从全量微调到高效微调(L…

【AIGC】2021-arXiv-LoRA:大型语言模型的低秩自适应

2021-arXiv-LoRA: Low-Rank Adaptation of Large Language Models LoRA&#xff1a;大型语言模型的低秩自适应摘要1. 引言2. 问题陈述3. 现有的解决方案还不够好吗&#xff1f;4. 我们的方法4.1 低秩参数化更新矩阵4.2 将 LORA 应用于 Transformer 5. 实证实验5.1 基线5.2 ROBE…

常用组件详解(十):保存与加载模型、检查点机制的使用

文章目录 1.保存、加载模型2.torch.nn.Module.state_dict()2.1基本使用2.2保存和加载状态字典 3.创建Checkpoint3.1基本使用3.2完整案例 1.保存、加载模型 torch.save()用于保存一个序列化对象到磁盘上&#xff0c;该序列化对象可以是任何类型的对象&#xff0c;包括模型、张量…

C++基础(10)——初识vector

目录 1.vector 2.vector的使用 2.1vector的定义 2.2vector迭代器的使用 2.2.1begin和end 2.2.2rbegin和rend 2.3增删查改 2.3.1pop_back和push_back 2.3.2inset和erase 2.3.3find函数 2.3.4swap函数 2.3.5元素访问 2.4空间函数 2.4.1size和capacity 2.4.2reserv…

用HTML5+CSS+JavaScript庆祝国庆

用HTML5CSSJavaScript庆祝国庆 中华人民共和国的国庆日是每年的10月1日。 1949年10月1日&#xff0c;中华人民共和国中央人民政府成立&#xff0c;在首都北京天安门广场举行了开国大典&#xff0c;中央人民政府主席毛泽东庄严宣告中华人民共和国成立&#xff0c;并亲手升起了…