强化学习-4 DQN算法、DQN算法进阶


深度强化学习

DQN 算法,英文全称 Deep Q-Network , 顾名思义,它的主要贡献就是在 Q-learning 算法的基础上引入了深度神经网络来近似动作价值函数 𝑄(𝑠,𝑎),从而能够处理高维的状态空间。
除了用深度网络代替 𝑄 表之外,DQN 算法还引入了一些技巧,如经验回放和目标网络。

1 深度网络

神经网络就是一个函数,只不过不同于一般的数值函数,它的输入输出都是向量,并且拥有可以学习的参数 θ \theta θ,这些参数可以通过梯度下降的方式来优化,从而使得神经网络能够逼近任意函数。
在 𝑄 表中我们描述状态空间的时候一般用的是状态个数,而在神经网络中我们用的是状态维度。。另外注意,无论是 𝑄 表还是 DQN 中的神经网络,它们输出的都是每个动作对应的 𝑄 值,即预测,而不是直接输出动作。要想输出动作,就需要额外做一些处理,例如结合贪心算法选择 𝑄 值最大对应的动作等,这就是我们一直强调的控制过程。

2 经验回放

引入一些技巧来提高训练的稳定性。

3 目标网格

每隔若干步才更新的目标网格。

4 实战

养成先写出伪代码再编程的习惯,这样更有助于提高对算法的理解。

4.1 伪代码


DQN 算法

  1. 初始化当前网络参数 θ \theta θ
  2. 复制参数到目标网络 θ ^ ← θ \hat{\theta} \leftarrow \theta θ^θ
  3. 初始化经验回放库 D D D
  4. for 回合数 m = 1 , 2 , … , M m = 1, 2, \ldots, M m=1,2,,M do
    1. 重置环境,获得初始状态 s 0 s_0 s0
    2. for 时步 t = 1 , 2 , … , T t = 1, 2, \ldots, T t=1,2,,T do
      1. 动作选择:
        • 根据 ϵ \epsilon ϵ-greedy 策略选择动作 a t a_t at
      2. 执行动作,反馈奖励 r t r_t rt 和下一个状态 s t + 1 s_{t+1} st+1
      3. 将样本 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1) 存到经验回放库 D D D
      4. 更新状态 s t + 1 ← s t s_{t+1} \leftarrow s_t st+1st
      5. 模型更新:
        1. D D D 中随机采样一个批量的样本
        2. 计算 Q Q Q 的期望值,即 y i = r t + γ max ⁡ a ′ Q ( s t + 1 , a ′ ; θ ^ ) y_i = r_t + \gamma \max_{a'} Q(s_{t+1}, a'; \hat{\theta}) yi=rt+γmaxaQ(st+1,a;θ^)
        3. 计算损失 L ( θ ) = E [ ( y i − Q ( s i , a i ; θ ) ) 2 ] L(\theta) = \mathbb{E}[(y_i - Q(s_i, a_i; \theta))^2] L(θ)=E[(yiQ(si,ai;θ))2],并关于参数 θ \theta θ 做随机梯度下降
      6. C C C 步复制参数到目标网络 θ ^ ← θ \hat{\theta} \leftarrow \theta θ^θ
    3. end for
  5. end for

4.1.1 伪代码解释

  1. 初始化阶段

    • 初始化当前网络的参数 θ \theta θ
    • 复制参数到目标网络 θ ^ \hat{\theta} θ^,即 θ ^ ← θ \hat{\theta} \leftarrow \theta θ^θ
    • 初始化经验回放库 D D D
  2. 训练回合循环

    • 重置环境,获得初始状态 s 0 s_0 s0
    • 在每个时间步 t t t,根据 ϵ \epsilon ϵ-greedy 策略选择动作 a t a_t at,然后执行动作,获得奖励 r t r_t rt 和下一个状态 s t + 1 s_{t+1} st+1
    • 将样本 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1) 存储到经验回放库 D D D 中。
    • 更新状态 s t + 1 ← s t s_{t+1} \leftarrow s_t st+1st
  3. 模型更新

    • 从经验回放库 D D D 中随机采样一个批量的样本。
    • 计算 Q Q Q 的期望值 y i = r t + γ max ⁡ a ′ Q ( s t + 1 , a ′ ; θ ^ ) y_i = r_t + \gamma \max_{a'} Q(s_{t+1}, a'; \hat{\theta}) yi=rt+γmaxaQ(st+1,a;θ^)
    • 计算损失 L ( θ ) = E [ ( y i − Q ( s i , a i ; θ ) ) 2 ] L(\theta) = \mathbb{E}[(y_i - Q(s_i, a_i; \theta))^2] L(θ)=E[(yiQ(si,ai;θ))2],并使用随机梯度下降法更新参数 θ \theta θ
  4. 参数更新

    • C C C 步将当前网络的参数复制到目标网络 θ ^ ← θ \hat{\theta} \leftarrow \theta θ^θ

通过以上步骤,DQN 算法能够在环境中学习并优化其策略。

4.2 定义模型

定义模型,就是定义两个神经网路,即当前网络和目标网络。

uses
uses
MLP
+fc1: torch.nn.Linear
+fc2: torch.nn.Linear
+fc3: torch.nn.Linear
+forward(x: torch.Tensor)
ReplayBuffer
+capacity: int
+buffer: list
+position: int
+push(experience: tuple)
+sample(batch_size: int)
+__len__()
Agent
+policy_net:MLP
+target_net:MLP
+optimizer:optim.Adam
+memory:ReplayBuffer
+sample_count:int
+epsilon:float
+epsilon_start:float
+epsilon_end:float
+epsilon_decay:int
+gamma:float
+lr:float
+batch_size:int
+target_update:int
+sample_action(state)
+predict_action(state)
+update()

DQN算法为什么要进行改进?

模型改进点目标
Double DQN改进目标 𝑄 值的计算型层面提高预测的精度介于DQN 和Nature DQN之间
Dueling DQN优化神经网络的结构提高 𝑄 值的估计精度
Noisy DQN优化网络结构增强网络的探索能力
PER DQN经验回放的角度提高控制过程中的探索度
C51算法
Rainbow DQN算法

5 Double DQN算法

Double DQN 算法中我们是通过改进目标 𝑄 值的计算来优化算法。
把动作选择和动作评估这两个过程分离开来,从而减轻了过估计问题。

6 Dueling DQN 算法

Dueling DQN 算法中则是通过优化神经网络的结构来优化算法。

在输出层之前分流(dueling)出了两个层,价值层和优势层。
优势层用于估计每个动作带来的优势,输出维度为动作数。
价值层用于估计每个状态的价值,输出维度为1。

7 Noisy DQN

探索-利用平衡的问题。

𝜀−greedy 策略是从智能体与环境的交互过程改善探索能力,以避免陷入局部最优解。
深度强化学习既要考虑与环境交互过程中的探索能力,也要考虑深度模型本身的探索能力,从而尽量避免陷入局部最优解的困境之中。
Noisy DQN 算法其实是在 DQN 算法基础上在神经网络中引入了噪声层来提高网络性能的,即将随机性应用到神经网络中的参数或者说权重,增加了 𝑄 网络对于状态和动作空间的探索能力,从而提高收敛速度和稳定性。

8 PER DQN

目标方法技术是一环套一环的,一个技术中又会有许多需要优化的地方。

目的:
方法:优化经验回放的设计提高模型的收敛能力和鲁棒性。
技术点:通过TD误差来为经验回放中的样本赋予不同优先级。
工具:SumTree二叉树结构。
优缺点:单纯根据 TD 误差进行优先采样有可能会错过对当前网络“信息量”更大的样本。其次,被选中样本的 TD 误差会在当前更新后下降,然后优先级会排到后面去,下次这些样本就不会被选中,这样来来回回都是那几个样本。
随机优先级采样 优化TD采样。

9 C51算法

核心思想:是将传统 DQN 算法中的值函数 𝑄(𝑠,𝑎) 换成了值分布 𝑍(𝑥,𝑎),即将值函数的输出从一个数值变成了一个分布,这样就能更好地处理值函数估计不准确以及离散动作空间的问题。

将值函数 𝑄 看成是一个随机变量,它的期望值就是 𝑄 函数,而它的方差就是 𝑄 函数的不确定性。

该公式是强化学习中的Q函数定义,它表示在给定状态和动作下的期望累计回报。以下是对公式的详细解释:

9.1 公式解析

Q π ( x , a ) : = E Z π ( x , a ) = E [ ∑ t = 0 ∞ γ t R ( x t , a t ) ] Q^\pi(x, a) := \mathbb{E}Z^\pi(x, a) = \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t R(x_t, a_t) \right] Qπ(x,a):=EZπ(x,a)=E[t=0γtR(xt,at)]

9.1.1 含义

  • Q π ( x , a ) Q^\pi(x, a) Qπ(x,a): 在策略 π \pi π 下,从状态 x x x 执行动作 a a a 开始的状态-动作值函数。它表示在状态 x x x 采取动作 a a a 时,按照策略 π \pi π 继续行动所能获得的期望累计回报。
  • E \mathbb{E} E: 期望值运算符,表示对未来的随机性取期望。
  • Z π ( x , a ) Z^\pi(x, a) Zπ(x,a): 从状态 x x x 采取动作 a a a 开始,按照策略 π \pi π 的行为得到的回报序列的期望值。
  • ∑ t = 0 ∞ γ t R ( x t , a t ) \sum_{t=0}^{\infty} \gamma^t R(x_t, a_t) t=0γtR(xt,at): 累计回报。表示从时间步 t = 0 t=0 t=0 开始,未来各个时间步的奖励 R ( x t , a t ) R(x_t, a_t) R(xt,at) 按照折扣因子 γ \gamma γ 加权求和。

9.1.2 状态分布

公式下面的解释是描述状态 x t x_t xt 和动作 a t a_t at 的分布及其关系:

  • x t ∼ P ( ⋅ ∣ x t − 1 , a t − 1 ) x_t \sim P(\cdot \mid x_{t-1}, a_{t-1}) xtP(xt1,at1): 状态 x t x_t xt 根据先前状态 x t − 1 x_{t-1} xt1 和动作 a t − 1 a_{t-1} at1 通过状态转移概率分布 P P P 得到。
  • a t ∼ π ( ⋅ ∣ x t ) a_t \sim \pi(\cdot \mid x_t) atπ(xt): 动作 a t a_t at 根据当前状态 x t x_t xt 和策略 π \pi π 得到。
  • x 0 = x x_0 = x x0=x: 初始状态为 x x x
  • a 0 = a a_0 = a a0=a: 初始动作为 a a a

9.2 直观理解

  • Q函数:表示在特定状态下采取某个动作,并且以后按照某个策略行动所能获得的总奖励。这个值越高,意味着从这个状态采取这个动作是有利的。
  • 期望:由于未来状态和奖励可能是随机的,所以计算期望值是为了得到一个平均的回报值。
  • 折扣因子 γ \gamma γ:用于衡量未来奖励的重要性, γ ∈ [ 0 , 1 ) \gamma \in [0, 1) γ[0,1) γ \gamma γ 越接近1,表示未来奖励的重要性越高;越接近0,表示更关注短期奖励。

9.3 应用

这个公式是强化学习中Q学习、深度Q网络(DQN)等算法的基础,通过估计这个函数,智能体可以找到最佳策略,从而在给定环境中获得最大的累计回报。

总结来说,公式定义了在特定状态和动作下的期望累计回报,通过期望和折扣因子考虑了未来的所有可能性和长期收益。

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DQN算法是一种基于Q-learning的深度强化学习算法,其目标是学习一个Q函数,使得该函数能够最大化累积奖励。DDQN算法是对DQN算法的改,通过解决DQN算法中过高估计Q值的问题,提高了算法的性能。Dueling DQN算法则是在DDQN算法的基础上,提出了一种新的神经网络结构,使得算法学习效率更高。 下面是DQN算法的公式推导分析: 1. Q-learning的更新公式为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma \max_{a} Q(s_{t+1},a) - Q(s_t,a_t))$ 2. DQN算法使用了深度神经网络来逼近Q函数,将更新公式改为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma \max_{a} Q(s_{t+1},a; \theta^-) - Q(s_t,a_t; \theta))$,其中$\theta$为当前网络的参数,$\theta^-$为目标网络的参数,$\max_{a} Q(s_{t+1},a; \theta^-)$表示在下一个状态$s_{t+1}$中,选择动作$a$所得到的最大Q值。 3. DDQN算法DQN算法的基础上,使用了双网络结构,解决了DQN算法中过高估计Q值的问题。更新公式为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma Q(s_{t+1},\arg\max_{a} Q(s_{t+1},a; \theta); \theta^-) - Q(s_t,a_t; \theta))$,其中$\arg\max_{a} Q(s_{t+1},a; \theta)$表示在下一个状态$s_{t+1}$中,选择动作$a$所得到的最大Q值对应的动作。 4. Dueling DQN算法在DDQN算法的基础上,提出了一种新的神经网络结构,使得算法学习效率更高。具体来说,Dueling DQN算法的输出包括两个分支,分别是该状态的状态价值V(标量)和每个动作的优势值A(与动作空间同维度的向量)。网络结构如下图所示: [Dueling DQN网络结构](https://img-blog.csdn.net/20170727145756345?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnhpYW9fYmFpZHUx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 更新公式为:$Q(s_t,a_t) \leftarrow V(s_t) + (A(s_t,a_t) - \frac{1}{|\mathcal{A}|} \sum_{a} A(s_t,a))$,其中$V(s_t)$表示状态$s_t$的价值,$A(s_t,a_t)$表示在状态$s_t$下选择动作$a_t$的优势值,$\frac{1}{|\mathcal{A}|} \sum_{a} A(s_t,a)$表示所有动作的平均优势值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值