【深度强化学习】DQN, Double DQN, Dueling DQN

2023-12-17 08:12

本文主要是介绍【深度强化学习】DQN, Double DQN, Dueling DQN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


DQN

更新方程

Q θ ( s t , a t ) ← Q θ ( s t , a t ) + α ( r t + γ max ⁡ a ′ Q θ ( s t + 1 , a ′ ) − Q θ ( s t , a t ) ) Q_\theta(s_t,a_t) \leftarrow Q_\theta(s_t,a_t) + \alpha \left( r_t + \gamma \red{\max_{a'} Q_\theta(s_{t+1},a')} - Q_{\theta}(s_t,a_t)\right) Qθ(st,at)Qθ(st,at)+α(rt+γmaxaQθ(st+1,a)Qθ(st,at))

缺点:

  1. 频繁更新,算法不稳定
  2. 数据并不满足 i.i.d.

解决方法

  • 经验回放
  • 双网络结构(评估网络、目标网络)

经验回放

直觉:利用记忆,降低方差,增加稳定性。
做法:训练过程中存储 ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s) 到 buffer,训练的时候均匀/非均匀采样

优先经验回放(PER)

直觉:样本的TD 误差也不同,并且样本数量也不同。
如:打游戏,一般的关卡打小怪,比较容易,TD loss 很小,训练样本也多;最后一关打boss,难度大, TD loss 大,训练样本也少。
因此我们需要调整样本的采样概率,TD loss 大的样本给更大的采样概率,并给较小的学习率。
我们存储数据到 Buffer 的时候,还额外存储一个采样概率 p t + ϵ p_t +\epsilon pt+ϵ

p t = ∣ δ t ∣ p_t = |\delta_{t}| pt=δt
δ t \delta_{t} δt代表这个样本的TD loss

选中概率
P ( t ) = p t α ∑ k p k α P(t)=\frac{p_t^\alpha}{\sum_k p_k^\alpha} P(t)=kpkαptα

重要性采样调整学习率
ω t = ( N × P ( t ) ) − β max ⁡ i ω i \omega_t = \frac{(N\times P(t))^{-\beta}}{\max_i \omega_i} ωt=maxiωi(N×P(t))β

双网络结构

直觉:避免使用自举法,自己评价自己。这样 label 背后的机制在一段时间内总是稳定的,部分解决了DQN的偏差大的问题
用慢 Q 网络计算 TD target
目标 = r t + γ max ⁡ a ′ Q θ − ( s t + 1 , a ′ ) 目标 = r_t + \gamma \red{\max_{a'} Q_{\theta-}(s_{t+1},a')} 目标=rt+γamaxQθ(st+1,a)


Double DQN

但是使用了双网络(慢Q用来计算 TD target)之后,由于仍然使用 max 操作,会有**过估计的问题,导致算法容易过于自信,**高估 q ∗ ( s , a ) q_*(s,a) q(s,a) 的值。因此使用 Double DQN,对 TD target 的 max 重写为 argmax 的形式

DQN(快慢双Q、慢Q计算TD)
y t = r r + γ Q θ − ( s t + 1 , arg ⁡ max ⁡ a ′ Q θ − ( s t + 1 , a ′ ) ) y_t = r_r + \gamma \red{Q_{\theta -}(s_{t+1},\arg \max_{a'}\blue{ Q_{\theta -}}(s_{t+1},a'))} yt=rr+γQθ(st+1,argamaxQθ(st+1,a))

Double DQN(快慢双Q、慢Q只评估TD值、快Q计算max动作)
y t = r r + γ Q θ − ( s t + 1 , arg ⁡ max ⁡ a ′ Q θ ( s t + 1 , a ′ ) ) y_t = r_r + \gamma \red{Q_{\theta -}(s_{t+1},\arg \max_{a'}\green{Q_{\theta}}(s_{t+1},a'))} yt=rr+γQθ(st+1,argamaxQθ(st+1,a))


Dueling DQN

我们继续往 Double DQN 里面引入另外的模型假设,就有可能继续提升模型的性能:

这里的假设/直觉是:
部分环境反馈 Q 可能仅与状态 s 有关,和 a 无关。换句话说: Q ( s , a 1 ) Q(s,a_1) Q(s,a1) Q ( s , a 2 ) Q(s,a_2) Q(s,a2) 之间并不是完全无关的,对于部分反馈,他们之间是正相关的。
例子:

s = 小明考试得 0 分
a1 = 小明不做任何事
a2 = 小明和妈妈说“妈妈我爱你”Q(s,a1) < 0 这是显然的
Q(s,a2) < 0 也同样有很大可能发生

在上面的例子中,如果我们独立地估计两个值,那么在估计第二个 Q 值的时候,TD loss 会比没有使用 Dueling 大(因为 Dueling 已经可以用 V ( s ) V(s) V(s)作为一个 baseline 估计),因为在这个场景下,Q 很大程度由 s 决定,如果能整体地学习 Q 关于 a 的加权函数,比如说 ∑ a π ( a ∣ s ) Q ( s , a ) \sum_a \pi(a|s) Q(s,a) aπ(as)Q(s,a) ,也就是 V ( s ) V(s) V(s),那么可以预期模型的收敛速度会加快。

在这里插入图片描述
因此,Dueling DQN 使用两个网络,Q被表示为两个网络的输出的和
Q ( s , a ) = A ( s , a ) + V ( s ) Q(s,a) = A(s,a) + V(s) Q(s,a)=A(s,a)+V(s)
这里 A A A 被称作优势函数, A A A 相对于单纯的 Q Q Q 更强调动作 a a a的好坏,而 V V V只关注状态的好坏。

不同的优势函数聚合形式

在这里插入图片描述

这篇关于【深度强化学习】DQN, Double DQN, Dueling DQN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503705

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499