DQN算法

news2024/9/24 13:26:08

DQN算法

教程链接

DataWhale强化学习课程JoyRL

https://johnjim0816.com/joyrl-book/#/ch7/main

DQN算法

DQN(Deep Q-Network) 主要创新点在于将Q-learning算法中的Q表记录动作价值函数转为引入深度神经网络来近似动作价值函数 Q ( s , a ) Q(s,a) Q(s,a),从而能够处理连续状态情况,即较高维度的状态空间。

因此,在Q表中我们描述状态空间的时候一般用的是状态个数,而在神经网络中我们用的是状态维度

当然,神经网络也存在缺点,即虽然它的输入可以是连续的,但是输出只能是离散的,即只能适用于离散的动作空间。如果要处理连续的动作空间,需要考虑策略梯度方法。

本质上来说强化学习和深度学习解决的问题是完全不同的,前者用于解决序列决策问题,后者用于解决静态问题例如回归、分类、识别等等。

  • 经验回放

状态转移元组 ( s t , a t , s t + 1 , r t + 1 ) (s_t, a_t, s_{t+1}, r_{t + 1}) (st,at,st+1,rt+1)强化学习是与环境实时交互得到样本然后进行训练的,这个样本一般包括当前的状态 s t s_t st、当前动作 a t a_t at、下一时刻的状态 s t + 1 s_{t+1} st+1 、奖励 r t + 1 r_{t+1} rt+1 以及终止状态的标志 d o n e done done.

这样做存在的问题?

  1. 在 Q-learning 算法中,每次交互得到一个样本之后,就立马拿去更新模型了。首先每次用单个样本去迭代网络参数很容易导致训练的不稳定,从而影响模型的收敛。
  2. 每次迭代的样本都是从环境中实时交互得到的,这样的样本是有关联的,而梯度下降法是基于一个假设的,即训练集中的样本是独立同分布的。
  3. 直接将 Q-learning 算法训练的方式来更新 DQN 的模型相当于是最原始的梯度下降方式,距离目前最成熟的小批量梯度下降方式还有一定的差距。

因此DQN的训练过程中,会把每次通过环境交互的样本存储在一个经验回放中,然后每次从经验吃中随机抽取一批样本来训练网络。

首先每次迭代的样本都是从经验池中随机抽取的,因此每次迭代的样本都是独立同分布的,这样就满足了梯度下降法的假设。其次,经验池中的样本是从环境中实时交互得到的,因此每次迭代的样本都是相互关联的,这样的方式相当于是把每次迭代的样本都进行了一个打乱的操作,这样也能够有效地避免训练的不稳定性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 目标网络

其次为了保障训练的稳定,避免Q值的估计发散。考虑使用一个每隔若干步才更新的目标网络。目标网络和当前网络结构都是相同的,都用于近似 Q值,在实践中每隔若干步才把每步更新的当前网络参数复制给目标网络。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

练习题

  1. 相比于 Q − l e a r n i n g Q-learning Qlearning算法, D Q N DQN DQN算法做了哪些改进?

DQN使用了深度神经网络来近似动作价值函数,解决了Q-learning使用表格存储Q值使得状态空间过大或者状态连续的问题。

  1. 为什么要在 D Q N DQN DQN算法中引入 ε − greedy \varepsilon-\text{greedy} εgreedy策略?

引入策略是为了平衡探索与利用的过程,如果智能体只进行利用,那么它可能会陷入局部最优,而忽略了更好的动作或状态;如果智能体只进行探索,那么它可能会浪费时间和资源,而无法收敛到最优的策略。因此,智能体需要在探索和利用之间进行权衡,以达到最佳的学习效果。

  1. D Q N DQN DQN算法为什么要多加一个目标网络?

目标网络的引入是为了增加DQN算法的稳定性和收敛性。DQN算法的核心是用深度神经网络来近似Q函数,即状态-动作值函数。如果我们只用一个神经网络来计算估计值和目标值,那么每次更新参数后,目标值也会随之改变,这样就会导致目标值不稳定,甚至发生震荡,从而影响神经网络的收敛。考虑使用一个每隔若干步才更新的目标网络。目标网络和当前网络结构都是相同的,都用于近似 Q值。

  1. 经验回放的作用?

深度神经网络训练要求数据符合独立同分布,经验回放的作用是消除智能体收集经验时相邻的两个四元组之间的相关性,使得每次从数组里面随机抽取的四元组都是独立的,从而提高DQN的训练效果。

DQN算法进阶

介绍一些基于DQN算法的进阶算法,例如 D o u b l e D Q N 、 D u e l i n g D Q N Double DQN、Dueling DQN DoubleDQNDuelingDQN这些从网络模型层面改进以及 P E R D Q N PER DQN PERDQN从经验回放的角度改进。

  • Double DQN算法。

主要贡献在于通过引入两个网络用于解决Q值过估计问题.

KaTeX parse error: \tag works only in display equations

其中 y t = r t + γ max ⁡ a Q θ ^ ( s t + 1 , a t + 1 ) y_t = r_t+\gamma\max _{a}Q_{\hat{\theta}}(s_{t+1},a_{t+1}) yt=rt+γamaxQθ^(st+1,at+1)是估计值,这个意思就是直接拿目标网络中各个动作对应的最大的 Q值来当作估计值,这样一来就会存在过估计的问题。

因此, D o u b l e D Q N Double DQN DoubleDQN的思路就是现在当前网络中找出最大Q值对应的动作,然后再将这个动作代入到目标网络中计算Q值。

KaTeX parse error: \tag works only in display equations

然后将这个找出来的动作代入到目标网络里面去计算目标的 Q 值,进而计算估计值,

KaTeX parse error: \tag works only in display equations

这样做相当于是把动作选择和动作评估这两个过程分离开来,从而减轻了过估计问题。即Double DQN 算法中大臣会根据自己的判断将自己认为最优的情报汇报给皇帝,做到了情报的精简与较高质量。

  • Dueling DQN算法

Dueling DQN算法是通过优化神经网络的结构来优化算法的。DQN算法使用的网络架构是一个全连接网络,包含一个输入层、隐藏层以及输出层。DuelingDQN则是在输出层之前分流出价值层(估计每个状态的价值)与优势层(用于估计每个动作带来的优势)。

[外链图片转存中…(img-COZ6YXfc-1700835492466)]

去掉这里的价值层即优势层就是普通的 Q 网络了,另外会对优势层做一个中心化处理,即减掉均值。

  • PER DQN算法

PER DQN算法进一步优化经验回放的设计从而提高模型的收敛能力与鲁棒性。会在采样过程中赋予经验回放中样本的优先级。优先级的依据来自于TD误差。广义的定义是值函数(包括状态价值函数和动作价值函数)的估计值与实际值之差,在 DQN 算法中就是目标网络计算的 Q值和策略网络(当前网络)计算的 Q值之差,也就是 DQN 网络中损失函数的主要构成部分。

TD误差越大,损失函数的值也越大,对于反向传播的作用也就越大。 这样一来如果 TD 误差较大的样本更容易被采到的话,那么算法也会更加容易收敛。

练习题

  1. DQN算法为什么会产生Q值的过估计问题?

DQN是直接拿目标网络中各个动作对应的最大的 Q值来当作估计值。但目标值仍然依赖于神经网络的输出,而神经网络的输出可能存在偏差和误差。特别是,当我们用**maxa′Q(s′,a′)**来选择下一个状态的最优动作时,我们可能会选择一个Q值被高估的动作,而不是真正的最优动作。这样,我们就会用一个高估的Q值来更新当前状态的Q值,从而导致Q值的过估计

  1. 同样是提高探索,Noisy DQN与 ε − greedy \varepsilon-\text{greedy} εgreedy策略有什么区别

Noisy DQN是在神经网络的权重上添加参数化的噪音,从而使Q函数的输出具有随机性,而ε-greedy策略是在选择动作时以一定的概率随机选择一个动作,而不是最优的动作。同时Noisy DQN的探索是基于权重的,可以影响所有的动作的选择,而ε-greedy策略的探索是基于动作的,只影响单个的动作的选择。因此,Noisy DQN的探索更具有全局性和多样性,而ε-greedy策略的探索更具有局部性和随机性。
sy DQN的探索是基于权重的,可以影响所有的动作的选择,而ε-greedy策略的探索是基于动作的,只影响单个的动作的选择。因此,Noisy DQN的探索更具有全局性和多样性,而ε-greedy策略的探索更具有局部性和随机性。

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

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

相关文章

【Java 进阶篇】Jedis:让Java与Redis轻松对话的利器

在现代软件开发中,缓存系统是提高系统性能的常见手段之一,而Redis作为一个高性能的缓存数据库,被广泛应用于各类系统。如果你是Java开发者,那么使用Jedis库可以让你轻松地与Redis进行交互。本文将带你深入了解Jedis的快速入门&…

pat实现基于邻接矩阵表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(Graph G, int v) {visited[v] 1;printf("%c ", G.vexs[v]);for (int i 0; i < G.vexnum; i) {if (!visited[i] && G.arcs[v][i]) DFS(G, i);} }2.非递归 #include <stack> #include <iostream> …

【间歇振荡器2片555时基仿真】2022-9-24

缘由multisim出现这个应该怎么解决吖&#xff0c;急需解决-嵌入式-CSDN问答 输出一定要有电阻分压才能前后连接控制否则一定报错。

【Web】PhpBypassTrick相关例题wp

目录 ①[NSSCTF 2022 Spring Recruit]babyphp ②[鹤城杯 2021]Middle magic ③[WUSTCTF 2020]朴实无华 ④[SWPUCTF 2022 新生赛]funny_php 明天中期考&#xff0c;先整理些小知识点冷静一下 ①[NSSCTF 2022 Spring Recruit]babyphp payload: a[]1&b1[]1&b2[]2&…

C#,《小白学程序》第二课:数组,循环与排序

1 什么是数组&#xff1f; 数组 Array 是一组数值&#xff08;数 或 值&#xff09;。 int[] a; int[,] b; int[][] c; Anything[] d; 都是数组。 2 排序 排序就是按大小、名字、拼音或你指定的信息进行比较后排队。 排序是数组最基本的功能需求。 3 文本格式 /// <summa…

【C语言】memset函数

memset是C和C编程语言中的一个函数&#xff0c;用于将指定的内存区域设置为特定的值。这个函数的原型在<string.h>&#xff08;对于C&#xff09;或者<cstring>&#xff08;对于C&#xff09;头文件中定义。 函数原型如下&#xff1a; void *memset(void *str, i…

Halcon Solution Guide I basics(4): Blob Analysis(连通性解析)

文章目录 文章专栏前言文章解析开头步骤分析简单案例进阶方案 进阶代码案例crystal&#xff0c;结晶匹配需求分析 文章专栏 Halcon开发 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 前言 今天来看第三章内容&#xff0c;既然是零基础&#xff0c;而且我还有大…

数据库-MySQL之数据库必知必会10-13章

第10章 创建计算字段 拼接字段 使用Concat()函数 执行算术计算 示例&#xff1a;从 Products 表中返回 prod_id、prod_price 和 sale_price。sale_price 是一个包含促销价格的计算字段。提示&#xff1a;可以乘以 0.9&#xff0c;得到原价的 90%&#xff08;即 10%的折扣&…

C百题--7.输出乘法表

1.问题描述 输出9*9乘法表 2.解决思路 利用99乘法表行和列之间的关系&#xff0c;进行输出 注意&#xff1a;%-2d 2代表占两个字符&#xff1b;-代表左对齐 3.代码实现 #include<stdio.h> int main(){for(int i1;i<9;i){for(int j1;j<i;j){printf("%d*%d…

98、Text2Room: Extracting Textured 3D Meshes from 2D Text-to-Image Models

简介 github 利用预训练的2D文本到图像模型来合成来自不同姿势的一系列图像。为了将这些输出提升为一致的3D场景表示&#xff0c;将单目深度估计与文本条件下的绘画模型结合起来&#xff0c;提出了一个连续的对齐策略&#xff0c;迭代地融合场景帧与现有的几何形状&#xff0…

基于若依的ruoyi-nbcio流程管理系统增加流程节点配置(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 为了增加流程节点配置的功能的灵活性与方便性&#xff0c;这里增加流程节点的配置。 1、相应表结构如下&a…

百度云加速免费版下线,推荐几款目前仍旧免费的CDN

近日&#xff0c;百度云加速实施了新政策&#xff0c;将不再支持免费套餐服务。现在免费的CDN也越来越少了&#xff0c;推荐几款目前仍旧免费的CDN&#xff0c;大家且用且珍惜&#xff01; 1、雨云【点此直达】 源站为雨云产品可以免费使用CDN&#xff0c;源站非雨云产品流量包…

CANdelaStudio 使用教程2 新建 Interface

文章目录 简述ECU Information1、Supported Interfaces2、Services supported for interfaces 简述 新增 Interface 的话&#xff0c;只能在 CDDT 文件中新增&#xff0c;CDD 文件中只能选择接口 ECU Information 1、Supported Interfaces 创建和编辑ECU应支持的接口 1、…

三子棋游戏代码+分析思路

首先我们先看一下一个传统的三子棋长什么样子&#xff0c;再来模仿 其中里面有一个棋盘&#xff0c;并且有分隔符&#xff0c;那么开始你就得定义个二维数组&#xff0c;先初始化&#xff0c;放空格&#xff0c;然后打印出来看一下&#xff0c;注意右边界是没有竖杠分割&#x…

【C/PTA —— 10.函数1(课外实践)】

C/PTA —— 10.函数1&#xff08;课外实践&#xff09; 一.函数题6-1 符号函数6-2 求排列数6-3 求一个大于10的n位整数w的后n-1位的数&#xff0c;并作为函数值返回。6-4 其右上三角&#xff08;含主对角线&#xff09;元素之和。6-5 字符串比较6-6 使用函数求素数和6-7 使用函…

@RequestMapping

目录 作用&#xff1a; 位置&#xff1a; 属性 1.value 2.method 3.params 4.header 作用&#xff1a; 该注解是一个用来处理请求地址映射的注解。 位置&#xff1a; 可用于映射一个请求或一个方法&#xff0c;可以用在类或方法上。 用于方法上&#xff0c;表示在类的…

N皇后问题解的个数

暴力递归 #include <stdio.h>int count0,a[15],flag; void queen(int,int); int main(){int n;scanf("%d",&n);queen(n,n);printf("%d",count); } void queen(int n,int n0){if(n<1){flag1;for(int i1;i<n0;i){for(int j1;j<n0;j){if(…

搜索引擎语法

演示自定的Google hacking语法&#xff0c;解释含意以及在渗透过程中的作用 Google hacking site&#xff1a;限制搜索范围为某一网站&#xff0c;例如&#xff1a;site:baidu.com &#xff0c;可以搜索baidu.com 的一些子域名。 inurl&#xff1a;限制关键字出现在网址的某…

Java对象逃逸

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、相关知识3.1 逃逸…

C# 时间计算(一)

目录 一、概述 二、时间的基本用法 1.实例化 DateTime 2.获取当前的时间 3.获取当前时间的时分秒 三、格式化时间 1.将时间转换为特定字符串 1&#xff09;拼接字符串方式 2&#xff09;格式化字符串方式 2.将字符串转换为时间 1&#xff09;DateTime.Parse 2&…