深度强化学习(王树森)笔记08

深度强化学习(DRL)

本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。

参考链接

Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL

源代码链接:https://github.com/DeepRLChinese/DeepRL-Chinese

B站视频:【王树森】深度强化学习(DRL)

豆瓣: 深度强化学习

文章目录

  • 深度强化学习(DRL)
  • 价值学习高级技巧
    • 经验回放
      • 经验回放的优点
      • 经验回放的局限性
      • 优先经验回放
    • 高估问题及解决方法
      • 自举导致偏差的传播
      • 最大化导致高估
      • 高估的危害
      • 使用目标网络
      • 双 Q 学习算法
      • 总结
    • 对决网络 (Dueling Network)
      • 最优优势函数
      • 对决网络
      • 解决不唯一性
      • 对决网络的实际实现
    • 噪声网络
      • 噪声网络的原理
      • 噪声 DQN
      • 训练流程
    • 总结
  • 后记

价值学习高级技巧

前面介绍了 DQN, 并且用 Q学习算法训练 DQN。如果用最原始的 Q 学习算法,那么训练出的 DQN 效果会很不理想。想要提升 DQN 的表现,需要用本章的高级技巧。文献中已经有充分实验结果表明这些高级技巧对 DQN 非常有效,而且这些技巧不冲突,可以一起使用。有些技巧并不局限于DQN,而是可以应用于多种价值学习和策略学习方法。

介绍经验回放 (experience replay) 和优先经验回放(prioritized experience replay)。讨论 DQN 的高估问题以及解决方案——目标网络(target network) 和双 Q 学习算法(double Q-learning)。

介绍两种方法改进 DQN 的神经网络结构 (不是对 Q 学习算法的改进):对决网络 (dueling network),它把动作价值 (action value) 分解成状态价值(state value) 与优势 (advantage);噪声网络 (noisy net), 它往神经网络的参数中加入随机噪声,鼓励探索。

经验回放

经验回放(experience replay)是强化学习中一个重要的技巧, 可以大幅提升强化学习的表现。经验回放的意思是把智能体与环境交互的记录 (即经验) 储存到一个数组里,事后反复利用这些经验训练智能体。这个数组被称为经验回放数组 (replay buffer)。

在这里插入图片描述

具体来说,把智能体的轨迹划分成 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)这样的四元组,存入一个数组。需要人为指定数组的大小 (记作 b b b)。数组中只保留最近 b b b 条数据;当数组存满之后,删除掉最旧的数据。数组的大小 b b b 是个需要调的超参数,会影响训练的结果。通常设置 b b b 1 0 5 ∼ 1 0 6 10^5\sim10^6 105106

在实践中,要等回放数组中有足够多的四元组时,才开始做经验回放更新 DQN。根据论文的实验分析,如果将 DQN 用于 Atari 游戏,最好是在收集到 20 万条四元组时才开始做经验回放更新 DQN; 如果是用更好的 Rainbow DQN, 收集到 8 万条四元组时就可以开始更新 DQN。在回放数组中的四元组数量不够的时候,DQN 只与环境交互, 而不去更新 DQN 参数,否则实验效果不好。

经验回放的优点

经验回放的一个好处在于打破序列的相关性。训练 DQN 的时候,每次我们用一个四元组对 DQN 的参数做一次更新。我们希望相邻两次使用的四元组是独立的。然而当智能体收集经验的时候,相邻两个四元组 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1) ( s t + 1 , a t + 1 , r t + 1 , s t + 2 ) (s_{t+1},a_{t+1},r_{t+1},s_{t+2}) (st+1,at+1,rt+1,st+2) 有很强的相关性。依次使用这些强关联的四元组训练 DQN, 效果往往会很差。经验回放每次从数组里随机抽取一个四元组,用来对 DQN 参数做一次更新。这样随机抽到的四元组都是独立的,消除了相关性。

经验回放的另一个好处是重复利用收集到的经验、而不是用一次就丢弃,这样可以用更少的样本数量达到同样的表现。重复利用经验、不重复利用经验的收敛曲线通常如图 6.2 所示。图的横轴是样本数量,纵轴是平均回报。

在这里插入图片描述

注 在阅读文献的时候请注意“样本数量"(sample complexity) 与“更新次数"两者的区别。样本数量是指智能体从环境中获取的奖励 r r r 的数量。而一次更新的意思是从经验回放数组里取出一个或多个四元组,用它对参数 w w w 做一次更新。通常来说,样本数量更重要, 因为在实际应用中收集经验比较困难。比如,在机器人的应用中, 需要在现实世界做一次实验才能收集到一条经验,花费的时间和金钱远大于做一次计算。相对而言,做更新的次数不是那么重要,更新次数只会影响训练时的计算量而已。

经验回放的局限性

需要注意,并非所有的强化学习方法都允许重复使用过去的经验。经验回放数组里的数据全都是用行为策略 (behavior policy) 控制智能体收集到的。在收集经验同时,我们也在不断地改进策略。策略的变化导致收集经验时用的行为策略是过时的策略,不同于当前我们想要更新的策略——即目标策略(target policy)。也就是说,经验回放数组中的经验通常是过时的行为策略收集的,而我们真正想要学的目标策略不同于过时的行为策略。

有些强化学习方法允许行为策略不同于目标策略。这样的强化学习方法叫做异策略(off-policy)。比如 Q \mathbb{Q} Q 学习、确定策略梯度 (DPG) 都属于异策略。由于它们允许行为策略不同于目标策略,过时的行为策略收集到的经验可以被重复利用。经验回放适用于异策略。

有些强化学习方法要求行为策略与目标策略必须相同。这样的强化学习方法叫做同策略 (on-policy)。比如 SARSA、REINFORCE、A2C 都属于同策略。它们要求经验必须是当前的目标策略收集到的,而不能使用过时的经验。经验回放不适用于同策略。

优先经验回放

优先经验回放 (prioritized experience replay) 是一种特殊的经验回放方法,它比普通的经验回放效果更好:既能让收敛更快,也能让收敛时的平均回报更高。经验回放数组里有 b b b 个四元组,普通经验回放每次均匀抽样得到一个样本——即四元组 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1). 用它来更新 DQN 的参数。优先经验回放给每个四元组一个权重,然后根据权重做非均匀随机抽样。如果 DQN 对 ( s j , a j ) (s_j,a_j) (sj,aj) 的价值判断不准确,即 Q ( s j , a j ; w ) Q(s_j,a_j;\boldsymbol{w}) Q(sj,aj;w) Q ⋆ ( s j , a j ) Q_\star(s_j,a_j) Q(sj,aj) 较远,则四元组 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 应当有较高的权重。

为什么样本的重要性会有所不同呢?设想你用强化学习训练一辆无人车。经验回放数组中的样本绝大多数都是车辆正常行驶的情形,只有极少数样本是意外情况,比如旁边车辆强行变道、行人横穿马路、警察封路要求绕行。数组中的样本的重要性显然是不同的。绝大多数的样本都是车辆正常行驶,而且正常行驶的情形很容易处理,出错的可能性非常小。意外情况的样本非常少,但是又极其重要,处理不好就会车毁人亡。所以意外情况的样本应当有更高的权重,受到更多关注。这两种样本不应该同等对待。

如何自动判断哪些样本更重要呢?举个例子,自动驾驶中的意外情况数量少、而且难以处理,导致 DQN 的预测 Q ( s j , a j ; w ) Q(s_j,a_j;\boldsymbol{w}) Q(sj,aj;w) 严重偏离真实价值 Q ⋆ ( s j , a j ) Q_\star(s_j,a_j) Q(sj,aj)。因此,要是 ∣ Q ( s j , a j ; w ) − Q ⋆ ( s j , a j ) ∣ \left|Q(s_j,a_j;\boldsymbol{w})-Q_\star(s_j,a_j)\right| Q(sj,aj;w)Q(sj,aj)较大,则应该给样本 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 较高的权重。然而实际上我们不知道 Q ⋆ Q_\star Q,因此无从得知 ∣ Q ( s j , a j ; w ) − Q ⋆ ( s j , a j ) ∣ \left|Q(s_j,a_j;\boldsymbol{w})-Q_\star(s_j,a_j)\right| Q(sj,aj;w)Q(sj,aj)。不妨把它替换成 TD 误差。回忆一下,TD 误差的定义是:
δ j = Δ Q ( s j , a j ; w n o w )   − [ r t + γ ⋅ max ⁡ a ∈ A Q ( s j + 1 , a ; w n o w ) ] ⏟ 即 TP 目标 . \begin{array}{rcl}\delta_j&\stackrel{\Delta}{=}&Q\big(s_j,a_j;\boldsymbol{w_\mathrm{now}}\big)\:-\underbrace{\left[r_t+\gamma\cdot\max_{a\in\mathcal{A}}Q\big(s_{j+1},a;\boldsymbol{w_\mathrm{now}}\big)\right]}_{\text{即 TP 目标}}.\end{array} δj=ΔQ(sj,aj;wnow) TP 目标 [rt+γaAmaxQ(sj+1,a;wnow)].

如果 TD 误差的绝对值 ∣ δ j ∣ |\delta_j| δj 大,说明 DQN 对 ( s j , a j ) (s_j,a_j) (sj,aj) 的真实价值的评估不准确,那么应该给 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 设置较高的权重。

优先经验回放对数组里的样本做非均匀抽样。四元组 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 的权重是 TD 误差的绝对值 ∣ δ j ∣ |\delta_j| δj。有两种方法设置抽样概率。一种抽样概率是:

p j   ∝   ∣ δ j ∣ + ϵ . p_j\:\propto\:|\delta_j|+\epsilon. pjδj+ϵ.

此处的 ϵ \epsilon ϵ是个很小的数,防止抽样概率接近零,用于保证所有样本都以非零的概率被抽到。另一种抽样方式先对 ∣ δ j ∣ |\delta_j| δj 做降序排列,然后计算

p j ∝ 1 rank ⁡ ( j ) . p_j\propto\frac{1}{\operatorname{rank}(j)}. pjrank(j)1.

此处的 rank ⁡ ( j ) \operatorname{rank}(j) rank(j) ∣ δ j ∣ |\delta_j| δj的序号。大的 ∣ δ j ∣ |\delta_j| δj的序号小,小的 ∣ δ j ∣ |\delta_j| δj的序号大。两种方式的原理是一样的, ∣ δ j ∣ |\delta_j| δj大的样本被抽样到的概率大。

优先经验回放做非均匀抽样,四元组 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 被抽到的概率是 p j p_j pj。抽样是非均匀的,不同的样本有不同的抽样概率,这样会导致 DQN 的预测有偏差。应该相应调整学习率,抵消掉不同抽样概率造成的偏差。TD 算法用“随机梯度下降”来更新参数:

w n e w   ←   w n o w − α ⋅ g , w_\mathrm{new}~\leftarrow~w_\mathrm{now}-\alpha\cdot g, wnew  wnowαg,

此处的α是学习率, g g g 是损失函数关于 w w w 的梯度。如果用均匀抽样,那么所有样本有相同的学习率 α \alpha α。如果做非均匀抽样的话,应该根据抽样概率来调整学习率 α \alpha α。如果一条样本被抽样的概率大,那么它的学习率就应该比较小。可以这样设置学习率:

α j   =   α ( b ⋅ p j ) β , \alpha_{j}\:=\:\frac{\alpha}{(b\cdot p_{j})^{\beta}}, αj=(bpj)βα,

此处的 b b b 是经验回放数组中样本的总数, β ∈ ( 0 , 1 ) \beta\in(0,1) β(0,1) 是个需要调的超参数(论文里建议一开始让 β \beta β 比较小,最终增长到 1)。

注 均匀抽样是一种特例,即所有抽样概率都相等 : p 1 = ⋯ = p b = 1 b :p_1=\cdots=p_b=\frac1b :p1==pb=b1。在这种情况下,有 ( b ⋅ p j ) β = 1 (b\cdot p_{j})^{\beta}=1 (bpj)β=1, 因此学习率都相同 : α 1 = ⋯ = α b = α o :\alpha_{1}=\cdots=\alpha_{b}=\alpha_{o} :α1==αb=αo

注 读者可能会问下面的问题。如果样本 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 很重要,它被抽到的概率 p j p_j pj 很大,可是它的学习率却很小。当 β = 1 \beta=1 β=1 时,如果抽样概率 p j p_j pj 变大 10 倍,则学习率 α j \alpha_j αj 减小 10 倍。抽样概率、学习率两者岂不是抵消了吗,那么优先经验回放有什么意义呢?大抽样概率、小学习率两者其实并没有抵消,因为下面两种方式并不等价:

  • 设置学习率为 α \alpha α,使用样本 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 计算一次梯度,更新一次参数 w w w ;
  • 设置学习率为 α 10 \frac\alpha{10} 10α, 使用样本 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 计算十次梯度,更新十次参数 w w w

乍看起来两种方式区别不大,但其实第二种方式是对样本更有效的利用。第二种方式的缺点在于计算量大了十倍,所以第二种方式只被用于重要的样本。

在这里插入图片描述

优先经验回放数组如图 6.3 所示。设 b b b 为数组大小,需要手动调整。如果样本 (即四元组) 的数量超过了 b b b,那么要删除最旧的样本。数组里记录了四元组、TD 误差、抽样概率、以及学习率。注意,数组里存的 TD 误差 δ j \delta_j δj 是用很多步之前过时的 DQN 参数计算出来的:

δ j   =   Q ( s j , a j ;   w o l d )   −   [ r t + γ ⋅ max ⁡ a ∈ A Q ( s j + 1 , a ;   w o l d ) ] . \delta_{j}\:=\:Q\big(s_{j},a_{j};\:\boldsymbol{w_{\mathrm{old}}}\big)\:-\:\Big[r_{t}+\gamma\cdot\max_{a\in\mathcal{A}}Q\big(s_{j+1},a;\:\boldsymbol{w_{\mathrm{old}}}\big)\Big]. δj=Q(sj,aj;wold)[rt+γaAmaxQ(sj+1,a;wold)].
做经验回放的时候,每次取出一个四元组,用它计算出新的 TD 误差:

δ j ′   =   Q ( s j , a j ;   w n o w )   −   [ r t + γ ⋅ max ⁡ a ∈ A Q ( s j + 1 , a ;   w n o w ) ] , \delta_{j}^{\prime}\:=\:Q\big(s_{j},a_{j};\:w_{\mathrm{now}}\big)\:-\:\Big[r_{t}+\gamma\cdot\max_{a\in\mathcal{A}}Q\big(s_{j+1},a;\:\boldsymbol{w_{\mathrm{now}}}\big)\Big], δj=Q(sj,aj;wnow)[rt+γaAmaxQ(sj+1,a;wnow)],

然后用它更新 DQN 的参数。用这个新的 δ j ′ \delta_j^{\prime} δj 取代数组中旧的 δ j \delta_{j} δj

高估问题及解决方法

Q 学习算法有一个缺陷:用 Q 学习训练出的 DQN 会高估真实的价值,而且高估通常是非均匀的。这个缺陷导致 DQN 的表现很差。高估问题并不是 DQN 模型的缺陷,而是 Q 学习算法的缺陷。 Q \mathbb{Q} Q 学习产生高估的原因有两个:第一,自举导致偏差的传播;第二,最大化导致 TD 目标高估真实价值。为了缓解高估,需要从导致高估的两个原因下手,改进 Q \mathbb{Q} Q学习算法。双 Q \mathbb{Q} Q学习算法是一种有效的改进,可以大幅缓解高估及其危害。

自举导致偏差的传播

在强化学习中,自举意思是“用一个估算去更新同类的估算”,类似于“自己把自己给举起来”。我们在前面的笔记中讨论过 SARSA 算法中的自举。下面回顾训练 DQN 用的 Q学习算法,研究其中存在的自举。算法每次从经验回放数组中抽取一个四元组 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1)。然后执行以下步骤,对 DQN 的参数做一轮更新:

1.计算TD目标:
y ^ j   =   r j   +   γ ⋅ max ⁡ a j + 1 ∈ A Q ( s j + 1 , a j + 1 ;   w n o w ) ⏟ DQN 自己做出的估计 \widehat y_j\:=\:r_j\:+\:\gamma\cdot\underbrace{\max_{a_{j+1}\in\mathcal{A}}Q\big(s_{j+1},a_{j+1};\:\boldsymbol{w_\mathrm{now}}\big)}_{\text{DQN 自己做出的估计}} y j=rj+γDQN 自己做出的估计 aj+1AmaxQ(sj+1,aj+1;wnow)

2.定义损失函数
L ( w )   =   1 2 [   Q ( s j , a j ; w )   −   y j ^ ⏟ 让DQN 拟合   y j ^ ] 2 . L(\boldsymbol{w})\:=\:\frac{1}{2}\Big[\:\underbrace{Q(s_{j},a_{j};\boldsymbol{w})\:-\:\widehat{y_{j}}}_{\text{让DQN 拟合}\:\widehat{y_{j}}}\Big]^{2}. L(w)=21[DQN 拟合yj Q(sj,aj;w)yj ]2.

3.把 y ^ j \widehat{y}_j y j看做常数,做一次梯度下降更新参数:

w n e w   ←   w n o w −   α ⋅ ∇ w L ( w n o w ) . w_\mathrm{new}\:\leftarrow\:w_\mathrm{now}-\:\alpha\cdot\nabla_{\boldsymbol{w}}L(\boldsymbol{w_\mathrm{now}}). wnewwnowαwL(wnow).

第一步中的 TD 目标 y ^ j \hat{y}_j y^j 部分基于 DQN 自己做出的估计。第二步让 DQN 去拟合 y ^ j \hat{y}_j y^j。这就意味着我们用了 DQN 自己做出的估计去更新 DQN 自己,这属于自举。

自举对 DQN 的训练有什么影响呢? Q ( s , a ; w ) Q(s,a;w) Q(s,a;w) 是对价值 Q ⋆ ( s , a ) Q_\star(s,a) Q(s,a) 的近似,最理想的情况下, Q ( s , a ; w ) = Q ⋆ ( s , a ) Q(s,a;\boldsymbol{w})=Q_\star(s,a) Q(s,a;w)=Q(s,a), ∀ s , a \forall s,a s,a。假如碰巧 Q ( s j + 1 , a j + 1 ; w ) Q(s_{j+1},a_{j+1};\boldsymbol{w}) Q(sj+1,aj+1;w)低估(或高估)真实价值 Q ⋆ ( s j + 1 , a j + 1 ) Q_\star(s_{j+1},a_{j+1}) Q(sj+1,aj+1), 则会发生下面的情况:
Q ( s j + 1 , a j + 1 ; w ) 低估(或高估) Q ⋆ ( s j + 1 , a j + 1 )    ⟹    y j ^ 低估(或高估) Q ⋆ ( s j , a j )    ⟹    Q ( s j , a j ; w ) 低估(或高估) Q ⋆ ( s j , a j ) . \begin{array}{cccc}&Q(s_{j+1},a_{j+1};\boldsymbol{w})&\text{低估(或高估)}&Q_{\star}(s_{j+1},a_{j+1})\\\implies&\widehat{y_j}&\text{低估(或高估)}&Q_{\star}(s_j,a_j)\\\implies&Q(s_j,a_j;\boldsymbol{w})&\text{低估(或高估)}&Q_{\star}(s_j,a_j).\end{array} Q(sj+1,aj+1;w)yj Q(sj,aj;w)低估(或高估)低估(或高估)低估(或高估)Q(sj+1,aj+1)Q(sj,aj)Q(sj,aj).
在这里插入图片描述

如果 Q ( s j + 1 , a j + 1 ; w ) Q(s_{j+1},a_{j+1};\boldsymbol{w}) Q(sj+1,aj+1;w) 是对真实价值 Q ⋆ ( s j + 1 , a j + 1 ) Q_\star(s_{j+1},a_{j+1}) Q(sj+1,aj+1) 的低估 (或高估), 就会导致 Q ( s j , a j ; w ) Q(s_j,a_j;\boldsymbol{w}) Q(sj,aj;w) 低估 (或高估) 价值 Q ⋆ ( s j , a j ) Q_\star(s_j,a_j) Q(sj,aj)。也就是说低估 (或高估) 从 ( s j + 1 , a j + 1 ) (s_{j+1},a_{j+1}) (sj+1,aj+1)传播到 ( s j , a j ) (s_j,a_j) (sj,aj), 让更多的价值被低估 (或高估)。

最大化导致高估

首先用数学解释为什么最大化会导致高估。设 x 1 , ⋯   , x d x_1,\cdots,x_d x1,,xd 为任意 d d d 个实数。往 x 1 x_1 x1, ⋯   , x d \cdots,x_d ,xd 中加入任意均值为零的随机噪声,得到 Z 1 , ⋯   , Z d Z_1,\cdots,Z_d Z1,,Zd, 它们是随机变量,随机性来源于随机噪声。很容易证明均值为零的随机噪声不会影响均值:
E [ mean ( Z 1 , ⋯   , Z d ) ]   =   m e a n ( x 1 , ⋯   , x d ) . \mathbb{E}\Big[\text{mean}\left(Z_1,\cdots,Z_d\right)\Big]\:=\:\mathrm{mean}\left(x_1,\cdots,x_d\right). E[mean(Z1,,Zd)]=mean(x1,,xd).

用稍微复杂一点的证明,可以得到:

E [ max ⁡ ( Z 1 , ⋯   , Z d ) ]   ≥   max ⁡ ( x 1 , ⋯   , x d ) . \mathbb{E}\Big[\max\left(Z_1,\cdots,Z_d\right)\Big]\:\geq\:\max\left(x_1,\cdots,x_d\right). E[max(Z1,,Zd)]max(x1,,xd).

公式中的期望是关于噪声求的。这个不等式意味着先加入均值为零的噪声,然后求最大值,会产生高估。

假设对于所有的动作 a ∈ A a\in\mathcal{A} aA 和状态 s ∈ S s\in\mathcal{S} sS, DQN 的输出是真实价值 Q ⋆ ( s , a ) Q_{\star}(s,a) Q(s,a) 加上均值为零的随机噪声 ϵ : \epsilon{:} ϵ:

Q ( s , a ; w )   =   Q ⋆ ( s , a ) + ϵ . Q\left(s,a;\boldsymbol{w}\right)\:=\:Q_{\star}\big(s,a\big)+\epsilon. Q(s,a;w)=Q(s,a)+ϵ.

显然 Q ( s , a ; w ) Q(s,a;\boldsymbol{w}) Q(s,a;w) 是对真实价值 Q ⋆ ( s , a ) Q_\star(s,a) Q(s,a) 的无偏估计。然而有这个不等式:
E ϵ [ max ⁡ a ∈ A Q ( s , a ; w ) ] ≥ max ⁡ a ∈ A Q ⋆ ( s , a ) . \mathbb{E}_\epsilon\Big[\max\limits_{a\in\mathcal{A}}Q(s,a;\boldsymbol{w})\Big]\geq\max\limits_{a\in\mathcal{A}}Q_\star(s,a). Eϵ[aAmaxQ(s,a;w)]aAmaxQ(s,a).
公式说明哪怕 DQN 是对真实价值的无偏估计,但是如果求最大化,DQN 就会高估真实价值。复习一下,TD 目标是这样算出来的:
y ^ j   =   r j   +   γ ⋅ max ⁡ a ∈ A   Q ( s j + 1 , a ;   w ) ⏟ 高估   max ⁡ a ∈ A Q ⋆ ( s j + 1 , a )   . \widehat{y}_{j}\:=\:r_{j}\:+\:\gamma\cdot\underbrace{\max_{a\in\mathcal{A}}\:Q\big(s_{j+1},a;\:\boldsymbol{w}\big)}_{\text{高估}\:\max_{a\in\mathcal{A}}Q_{\star}(s_{j+1},a)}\:. y j=rj+γ高估maxaAQ(sj+1,a) aAmaxQ(sj+1,a;w).

这说明 TD 目标 y ^ j \widehat{y}_j y j 通常是对真实价值 Q ⋆ ( s j , a j ) Q_\star(s_j,a_j) Q(sj,aj) 的高估。TD 算法鼓励 Q ( s j , a j ; w ) Q(s_j,a_j;\boldsymbol{w}) Q(sj,aj;w) 接近TD 目标 y ^ j \widehat{y}_j y j, 这会导致 Q ( s j , a j ; w ) Q(s_j,a_j;w) Q(sj,aj;w) 高估真实价值 Q ⋆ ( s j , a j ) Q_\star(s_j,a_j) Q(sj,aj)

在这里插入图片描述

即使 DQN 是真实价值 Q ⋆ Q_{\star} Q 的无偏估计,只要 DQN 不恒等于 Q ⋆ Q_{\star} Q, TD 目标就会高估真实价值。TD 目标是高估,而 Q \mathbb{Q} Q学习算法鼓励 DQN 预测接近 TD 目标,因此DQN 会出现高估。

高估的危害

我们为什么要避免高估?高估真的有害吗?如果高估是均匀的,则高估没有危害;如果高估非均匀,就会有危害。举个例子,动作空间是 A = { 左,右,上 } A= \{ 左,右,上\} A={左,右,上}。给定当前状态 s s s, 每个动作有一个真实价值:
Q ⋆ ( s , 左 )   =   200 , Q ⋆ ( s , 右 )   =   100 , Q ⋆ ( s , 上 )   =   230. Q_{\star}(s,\text{左})\:=\:200,\quad Q_{\star}(s,\text{右})\:=\:100,\quad Q_{\star}(s,\text{上})\:=\:230. Q(s,)=200,Q(s,)=100,Q(s,)=230.

智能体应当选择动作“上”,因为“上”的价值最高。假如高估是均匀的,所有的价值都被高估了100:

Q ( s , 左 ;   w )   =   300 , Q ( s , t ;   w )   =   200 , Q ( s ,   上 ;   w )   =   330. Q\big(s,左;\:\boldsymbol{w}\big)\:=\:300,\quad Q\big(s,\boldsymbol{t};\:\boldsymbol{w}\big)\:=\:200,\quad Q\big(s,\:\text{上};\:\boldsymbol{w}\big)\:=\:330. Q(s,;w)=300,Q(s,t;w)=200,Q(s,;w)=330.
那么动作“上”仍然有最大的价值,智能体会选择“上”。这个例子说明高估本身不是问题, 只要所有动作价值被同等高估。

但实践中,所有的动作价值会被同等高估吗?每当取出一个四元组 ( s , a , r , s ′ ) (s,a,r,s^{\prime}) (s,a,r,s) 用来更新一次 DQN, 就很有可能加重 DQN 对 Q ⋆ ( s , a ) Q_{\star}(s,a) Q(s,a) 的高估。对于同一个状态 s s s, 三种组合 ( s , 左 ) (s,左) (s,) ( s , 右 ) (s,右) (s,) ( s , 上 ) (s,上) (s,)出现在经验回放数组中的频率是不同的,所以三种动作被高估的程度是不同的。假如动作价值被高估的程度不同,比如

Q ( s , 左 ; w )   =   280 , Q ( s , 右 ; w )   =   300 , Q ( s , 上 ; w )   =   260 , Q\big(s,\text{左};\boldsymbol{w}\big)\:=\:280,\quad Q\big(s,\text{右};\boldsymbol{w}\big)\:=\:300,\quad Q\big(s,\text{上};\boldsymbol{w}\big)\:=\:260, Q(s,;w)=280,Q(s,;w)=300,Q(s,;w)=260,

那么智能体做出的决策就是向右走,因为“右”的价值貌似最高。但实际上“右”是最差的动作,它的实际价值低于其余两个动作。

综上所述,用 Q \mathbb{Q} Q学习算法训练 DQN 总会导致 DQN 高估真实价值。对于多数的 s ∈ S s\in S sS a ∈ A a\in\mathcal{A} aA, 有这样的不等式:

Q ( s , a ; w )   >   Q ⋆ ( s , a ) . Q(s,a;\boldsymbol{w})\:>\:Q_{\star}(s,a). Q(s,a;w)>Q(s,a).

高估本身不是问题,真正的麻烦在于DQN 的高估往往是非均匀的。如果 DQN 有非均匀的高估,那么用 DQN 做出的决策是不可靠的。我们已经分析过导致高估的原因:

  • TD 算法属于“自举”,即用 DQN 的估计值去更新 DQN 自己。自举会导致偏差的传播。如果 Q ( s j + 1 , a j + 1 ; w ) Q(s_{j+1},a_{j+1};\boldsymbol{w}) Q(sj+1,aj+1;w) 是对 Q ⋆ ( s j + 1 , a j + 1 ) Q_\star(s_{j+1},a_{j+1}) Q(sj+1,aj+1) 的高估,那么高估会传播到 ( s j , a j ) j (s_j,a_j)_j (sj,aj)j Q ( s j , a j ; w ) Q(s_j,a_j;\boldsymbol{w}) Q(sj,aj;w) 高估 Q ⋆ ( s j , a j ) Q_\star(s_j,a_j) Q(sj,aj)。自举导致 DQN 的高估从一个二元组 ( s , a ) (s,a) (s,a) 传播到更多的二元组。

  • TD 目标 y ^ \hat{y} y^ 中包含一项最大化,这会导致 TD 目标高估真实价值 Q ⋆ Q_{\star} Q。Q 学习算法鼓励 DQN 的预测接近 TD 目标,因此 DQN 会高估 Q ⋆ Q_{\star} Q

找到了产生高估的原因,就可以想办法解决问题。想要避免 DQN 的高估,要么切断自举,要么避免最大化造成高估。注意,高估并不是 DQN 自身的属性,高估纯粹是算法造成的。想要避免高估,就要用更好的算法替代原始的 Q 学习算法。

使用目标网络

上文已经讨论过,切断“自举”可以避免偏差的传播,从而缓解 DQN 的高估。回顾一下,Q 学习算法这样计算 TD 目标:
y ^ j   =   r j   +   γ ⋅ max ⁡ a ∈ A Q ( s j + 1 , a ;   w ) ⏟ DQN做出的估计   . \widehat{y}_{j}\:=\:r_{j}\:+\:\underbrace{\gamma\cdot\max_{a\in\mathcal{A}}Q(s_{j+1},a;\:\boldsymbol{w})}_{\text{DQN做出的估计}}\:. y j=rj+DQN做出的估计 γaAmaxQ(sj+1,a;w).

然后做梯度下降更新 w w w,使得 Q ( s j , a j ; w ) Q(s_j,a_j;\boldsymbol{w}) Q(sj,aj;w)更接近 y ^ j \widehat{y}_j y j。想要切断自举,可以用另一个神经网络计算 TD 目标,而不是用 DQN 自己计算 TD 目标。另一个神经网络被称作目标网络 (target network) 。把目标网络记作:

Q ( s , a ; w − ) . Q(s,a;\boldsymbol{w}^{-}). Q(s,a;w).

它的神经网络结构与 DQN 完全相同,但是参数 w − w^- w 不同于 w w w

使用目标网络的话,Q 学习算法用下面的方式实现。每次随机从经验回放数组中取一个四元组,记作 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1)。设 DQN 和目标网络当前的参数分别为 w n o w w_\mathrm{now} wnow w n o w ˉ \bar{w_\mathrm{now}} wnowˉ,

执行下面的步骤对参数做一次更新:
1.对 DQN 做正向传播,得到:
q ^ j   =   Q ( s j , a j ;   w n o w ) . \widehat q_{j}\:=\:Q\big(s_{j},a_{j};\:\boldsymbol{w_{\mathrm{now}}}\big). q j=Q(sj,aj;wnow).

2.对目标网络做正向传播,得到
q ^ j + 1 −   =   max ⁡ a ∈ A Q ( s j + 1 , a ;   w n o w − ) . \widehat q_{j+1}^{-}\:=\:\max_{a\in\mathcal{A}}Q\big(s_{j+1},a;\:\boldsymbol{w_{\mathrm{now}}^{-}}\big). q j+1=aAmaxQ(sj+1,a;wnow).

3.计算 TD 目标和 TD 误差:
y ^ j −   =   r j + γ ⋅ q ^ j + 1 − 和 δ j   =   q ^ j − y ^ j − . \widehat y_{j}^{-}\:=\:r_{j}+\gamma\cdot\widehat q_{j+1}^{-}\quad\text{和}\quad\delta_{j}\:=\:\widehat q_{j}-\widehat y_{j}^{-}. y j=rj+γq j+1δj=q jy j.

4.对 DQN 做反向传播,得到梯度 ∇ w Q ( s j , a j ; w n o w ) \nabla_wQ(s_j,a_j;\boldsymbol{w}_\mathrm{now}) wQ(sj,aj;wnow)

5.做梯度下降更新 DQN 的参数:
w n e w   ←   w n o w   −   α   ⋅   δ j   ⋅   ∇ w   Q ( s j , a j ;   w n o w ) . \boldsymbol{w_\mathrm{new}}\:\leftarrow\:\boldsymbol{w_\mathrm{now}}\:-\:\alpha\:\cdot\:\delta_{j}\:\cdot\:\nabla_{\boldsymbol{w}}\:Q\big(s_{j},a_{j};\:\boldsymbol{w_\mathrm{now}}\big). wnewwnowαδjwQ(sj,aj;wnow).

6.设 τ ∈ ( 0 , 1 ) \tau\in(0,1) τ(0,1) 是需要手动调的超参数。做加权平均更新目标网络的参数:
w n e w ˉ   ←   τ ⋅ w n e w   +   ( 1 − τ ) ⋅ w n o w − . \bar{w_\mathrm{new}}\:\leftarrow\:\tau\cdot\boldsymbol{w_\mathrm{new}}\:+\:\left(1-\tau\right)\cdot\boldsymbol{w_\mathrm{now}^-}. wnewˉτwnew+(1τ)wnow.

在这里插入图片描述

如图 6.4 (左) 所示,原始的 Q学习算法用 DQN 计算 y ^ \widehat{y} y ,然后拿 y ^ \hat{y} y^ 更新 DQN 自己, 造成自举。如图 6.4(右)所示,可以改用目标网络计算 y ^ \widehat{y} y ,这样就避免了用 DQN 的估计更新 DQN 自己,降低自举造成的危害。然而这种方法不能完全避免自举,原因是目标网络的参数仍然与 DQN 相关。

双 Q 学习算法

造成 DQN 高估的原因不是 DQN 模型本身的缺陷,而是 Q 学习算法有不足之处:第一,自举造成偏差的传播;第二,最大化造成 TD 目标的高估。在 Q 学习算法中使用目标网络,可以缓解自举造成的偏差,但是无助于缓解最大化造成的高估。本小节介绍双 Q \mathbb{Q} Q 学习 (double Q learning) 算法,它在目标网络的基础上做改进,缓解最大化造成的高估。

注 本小节介绍的双 Q 学习算法在文献中被称作 double DQN, 缩写 DDQN。本书不采用DDQN这名字,因为这个名字比较误导。双 Q 学习 (即所谓的 DDQN) 只是一种 TD 算法而已,它可以把 DQN 训练得更好。双 Q 学习并没有用区别于 DQN 的模型。本节中的模型只有一个,就是 DQN。我们讨论的只是训练 DQN 的三种 TD 算法:原始的 Q 学习、 用目标网络的 Q 学习、双 Q 学习。

为了解释原始的 Q 学习、用目标网络的 Q 学习、以及双 Q 学习三者的区别,我们再回顾一下Q 学习算法中的 TD 目标:
y ^ j   =   r j   +   γ ⋅ max ⁡ a ∈ A Q ( s j + 1 , a ;   w ) . \widehat y_j\:=\:r_j\:+\:\gamma\cdot\max_{a\in\mathcal{A}}Q\left(s_{j+1},a;\:\boldsymbol{w}\right). y j=rj+γaAmaxQ(sj+1,a;w).

不妨把最大化拆成两步:
1.选择——即基于状态 s j + 1 s_{j+1} sj+1,选出一个动作使得 DQN 的输出最大化:

a ⋆   =   argmax ⁡ a ∈ A   Q ( s j + 1 , a ;   w ) . a^{\star}\:=\:\underset{a\in\mathcal{A}}{\operatorname*{argmax}}\:Q\left(s_{j+1},a;\:\boldsymbol{w}\right). a=aAargmaxQ(sj+1,a;w).

2.求值——即计算 ( s j + 1 , a ⋆ ) (s_{j+1},a^\star) (sj+1,a) 的价值,从而算出 TD 目标:
y ^ j   =   r j + Q ( s j + 1 , a ⋆ ;   w ) . \widehat{y}_{j}\:=\:r_{j}+Q(s_{j+1},a^{\star};\:\boldsymbol{w}). y j=rj+Q(sj+1,a;w).

以上是原始的 Q 学习算法,选择和求值都用 DQN。上一小节改进了 Q 学习,选择和求值都用目标网络:
选择: a −   =   a r g m a x a ∈ A   Q ( s j + 1 , a ;   w − ) , 求值: y ~ j   =   r j + Q ( s j + 1 , a − ;   w − ) . \begin{array}{rcl}{\text{选择:}}&{{a^{-}\:=\:\mathrm{argmax}}_{a\in\mathcal{A}}\:Q\big(s_{j+1},a;\:\boldsymbol{w^{-}}\big),}\\{\text{求值:}}&{{\widetilde{y}_{j}\:=\:r_{j}+Q\big(s_{j+1},\boldsymbol{a}^{-};\:\boldsymbol{w}^{-}\big).}}\end{array} 选择:求值:a=argmaxaAQ(sj+1,a;w),y j=rj+Q(sj+1,a;w).

本小节介绍双 Q 学习,第一步的选择用 DQN, 第二步的求值用目标网络:

选择: a ⋆   =   a r g m a x a ∈ A   Q ( s j + 1 , a ;   w ) , 求值: y ~ j   =   r j + Q ( s j + 1 , a ⋆ ;   w − ) . \begin{array}{rcl}{\text{选择:}}&{{a^{\star}\:=\:\mathrm{argmax}}_{a\in\mathcal{A}}\:Q\big(s_{j+1},a;\:\boldsymbol{w}\big),}\\{\text{求值:}}&{{\widetilde{y}_{j}\:=\:r_{j}+Q\big(s_{j+1},\boldsymbol{a}^{\star};\:\boldsymbol{w}^{-}\big).}}\end{array} 选择:求值:a=argmaxaAQ(sj+1,a;w),y j=rj+Q(sj+1,a;w).

为什么双 Q 学习可以缓解最大化造成的高估呢?不难证明出这个不等式:

Q ( s j + 1 , a ⋆ ; w − ) ⏟ 双 Q 学习   ≤   max ⁡ a ∈ A Q ( s j + 1 , a ; w − ) ⏟ 用目标网络的 Q 学习   . \underbrace{Q(s_{j+1},\color{red}{a^{\star}};\boldsymbol{w^{-}})}_{\text{双 Q 学习}}\:\leq\:\underbrace{\max_{a\in\mathcal{A}}Q(s_{j+1},\color{red}{a};\boldsymbol{w^{-}})}_{\text{用目标网络的 Q 学习}}\:.  Q 学习 Q(sj+1,a;w)用目标网络的 Q 学习 aAmaxQ(sj+1,a;w).

因此,

y ~ t ⏟ 双Q学习 ≤ y t ^ ⏟ 用目标网络的 Q 学习 . \underbrace{\widetilde{y}_{t}}_\text{双Q学习}{ \leq }\underbrace{\widehat{y_{t}}}_{\text{用目标网络的 Q 学习}} . Q学习 y t用目标网络的 Q 学习 yt .

这个公式说明双 Q 学习得到的 TD 目标更小。也就是说,与用目标网络的 Q 学习相比, 双 Q学习缓解了高估。

双 Q 学习算法的流程如下。每次随机从经验回放数组中取出一个四元组,记作 ( s j s_j sj, a j , r j , s j + 1 ) a_j,r_j,s_{j+1}) aj,rj,sj+1)。设 DQN 和目标网络当前的参数分别为 w n o w w_\mathrm{now} wnow w n o w − w_\mathrm{now}^- wnow, 执行下面的步骤对参数做一次更新:

1.对 DQN 做正向传播,得到:

q ^ j   =   Q ( s j , a j ;   w n o w ) . \widehat q_{j}\:=\:Q\big(s_{j},a_{j};\:\boldsymbol{w_{\mathrm{now}}}\big). q j=Q(sj,aj;wnow).

2.选择:

a ⋆   =   argmax ⁡ a ∈ A Q ( s j + 1 , a ;   w n o w ) . a^{\star}\:=\:\underset{a\in\mathcal{A}}{\operatorname*{argmax}}Q\left(s_{j+1},a;\:\boldsymbol{w_{\mathrm{now}}}\right). a=aAargmaxQ(sj+1,a;wnow).

3.求值:

q ^ j + 1   =   Q ( s j + 1 , a ⋆ ;   w n o w ˉ ) . \widehat q_{j+1}\:=\:Q\big(s_{j+1},a^{\star};\:\bar{\boldsymbol{w_{now}}}\big). q j+1=Q(sj+1,a;wnowˉ).

4.计算 TD 目标和 TD 误差:
y ~ j   =   r j + γ ⋅ q ^ j + 1 和 δ j   =   q ^ j − y ~ j . \widetilde{y}_{j}\:=\:r_{j}+\gamma\cdot\widehat{q}_{j+1}\quad\text{和}\quad\delta_{j}\:=\:\widehat{q}_{j}-\widetilde{y}_{j}. y j=rj+γq j+1δj=q jy j.
5.对 DQN 做反向传播,得到梯度 ∇ w Q ( s j , a j ; w n o w ) \nabla_wQ(s_j,a_j;w_\mathrm{now}) wQ(sj,aj;wnow)

6.做梯度下降更新 DQN 的参数:
w n e w   ←   w n o w −   α ⋅ δ j ⋅ ∇ w Q ( s j , a j ;   w n o w ) . w_{\mathrm{new}}\:\leftarrow\:w_{\mathrm{now}}-\:\alpha\cdot\delta_{j}\cdot\nabla_{\boldsymbol{w}}Q\big(s_{j},a_{j};\:\boldsymbol{w_{\mathrm{now}}}\big). wnewwnowαδjwQ(sj,aj;wnow).

7.设 τ ∈ ( 0 , 1 ) \tau\in(0,1) τ(0,1) 是需要手动调整的超参数。做加权平均更新目标网络的参数:
w n e w ˉ   ←   τ ⋅ w n e w   +   ( 1 − τ ) ⋅ w n o w − . \bar{w_\mathrm{new}}\:\leftarrow\:\tau\cdot w_\mathrm{new}\:+\:\left(1-\tau\right)\cdot\boldsymbol{w_\mathrm{now}^-}. wnewˉτwnew+(1τ)wnow.

总结

本节研究了 DQN 的高估问题以及解决方案。DQN 的高估不是 DQN 模型造成的,不是 DQN 的本质属性。高估只是因为原始 Q 学习算法不好。Q 学习算法产生高估的原因有两个:第一,自举导致偏差从一个 ( s , a ) (s,a) (s,a) 二元组传播到更多的二元组;第二,最大化造成 TD 目标高估真实价值。

想要解决高估问题,就要从自举、最大化这两方面下手。本节介绍了两种缓解高估的算法:使用目标网络、双Q 学习。Q 学习算法与目标网络的结合可以缓解自举造成的偏差。双 Q \mathbb{Q} Q学习基于目标网络的想法,进一步将 TD 目标的计算分解成选择和求值两步, 缓解了最大化造成的高估。图 6.5 总结了本节研究的三种算法。

在这里插入图片描述

注 如果使用原始 Q 学习算法,自举和最大化都会造成严重高估。在实践中,应当尽量使用双 Q 学习,它是三种算法中最好的。

注 如果使用 SARSA 算法 (比如在 actor-critic 中), 自举的问题依然存在,但是不存在最大化造成高估这一问题。对于 SARSA, 只需要解决自举问题,所以应当将目标网络应用到 SARSA 。

对决网络 (Dueling Network)

本节介绍对决网络 (dueling network), 它是对 DQN 的神经网络结构的改进。它的基本想法是将最优动作价值 Q ⋆ Q_{\star} Q 分解成最优状态价值 V ⋆ V_{\star} V 加最优优势 D ⋆ D_{\star} D。对决网络的训练与 DQN 完全相同,可以用 Q 学习算法或者双 Q 学习算法 。

最优优势函数

在介绍对决网络 (dueling network)之前,先复习一些基础知识。动作价值函数 Q π ( s , a ) Q_\pi(s,a) Qπ(s,a) 是回报的期望:

Q π ( s , a )   =   E [ U t ∣   S t = s , A t = a ] . Q_{\pi}(s,a)\:=\:\mathbb{E}\Big[U_{t}\Big|\:S_{t}=s,A_{t}=a\Big]. Qπ(s,a)=E[Ut St=s,At=a].

最优动作价值 Q ⋆ Q_{\star} Q的定义是:

Q ⋆ ( s , a )   =   max ⁡ π   Q π ( s , a ) , ∀   s ∈ S ,   a ∈ A . Q_{\star}(s,a)\:=\:\max_{\pi}\:Q_{\pi}(s,a),\quad\forall\:s\in\mathcal{S},\:a\in\mathcal{A}. Q(s,a)=πmaxQπ(s,a),sS,aA.

状态价值函数 V π ( s ) V_{\pi}(s) Vπ(s) Q π ( s , a ) Q_{\pi}(s,a) Qπ(s,a) 关于 a a a 的期望:

V π ( s )   =   E A ∼ π [ Q π ( s , A ) ] . V_{\pi}(s)\:=\:\mathbb{E}_{A\sim\pi}\Big[Q_{\pi}(s,A)\Big]. Vπ(s)=EAπ[Qπ(s,A)].

最优状态价值函数 V ⋆ V_{\star} V的定义是:

V ⋆ ( s )   =   max ⁡ π   V π ( s ) , ∀   s ∈ S . V_{\star}\big(s\big)\:=\:\operatorname*{max}_{\pi}\:V_{\pi}\big(s\big),\quad\forall\:s\in\mathcal{S}. V(s)=πmaxVπ(s),sS.

最优优势函数 (optimal advantage function) 的定义是:

D ⋆ ( s , a )   ≜   Q ⋆ ( s , a )   −   V ⋆ ( s ) . \boxed{D_{\star}(s,a)\:\triangleq\:Q_{\star}(s,a)\:-\:V_{\star}(s).} D(s,a)Q(s,a)V(s).

通过数学推导,可以证明下面的定理:

在这里插入图片描述

Q ⋆ ( s , a ) = V ⋆ ( s ) + D ⋆ ( s , a ) − max ⁡ a ∈ A D ⋆ ( s , a ) ⏟ 恒等于零 ∀ s ∈ S , a ∈ A . Q_{\star}(s,a)=V_{\star}(s)+D_{\star}(s,a)-\underbrace{\max_{a\in\mathcal{A}}D_{\star}(s,a)}_{\text{恒等于零}}\quad\forall s\in\mathcal{S},a\in\mathcal{A}. Q(s,a)=V(s)+D(s,a)恒等于零 aAmaxD(s,a)sS,aA.

对决网络

与 DQN 一样,对决网络 (dueling network) 也是对最优动作价值函数 Q ⋆ Q_{\star} Q 的近似。对决网络与 DQN 的区别在于神经网络结构不同。直观上,对决网络可以了解到哪些状态有价值或者没价值,而无需了解每个动作对每个状态的影响。实践中,对决网络具有更好的效果。由于对决网络与 DQN 都是对 Q ⋆ Q_{\star} Q 的近似,可以用完全相同的算法训练两种神经网络。

对决网络由两个神经网络组成。一个神经网络记作 D ( s , a ; w D ) D(s,a;w^D) D(s,a;wD), 它是对最优优势函数 D ⋆ ( s , a ) D_\star(s,a) D(s,a) 的近似。另一个神经网络记作 V ( s ; w V ) V(s;w^V) V(s;wV),它是对最优状态价值函数 V ⋆ ( s ) V_{\star}(s) V(s) 的近似。把定理 6.1 中的 D ⋆ D_{\star} D V ⋆ V_{\star} V 替换成相应的神经网络,那么最优动作价值函数 Q ⋆ Q_{\star} Q 就被近似成下面的神经网络:

Q ( s , a ; w ) ≜ V ( s ; w V ) + D ( s , a ; w D ) − max ⁡ a ∈ A D ( s , a ; w D ) . ( 6.1 ) Q\big(s,a;\boldsymbol{w}\big)\triangleq V\big(s;\boldsymbol{w}^{V}\big)+D\big(s,a;\boldsymbol{w}^{D}\big)-\max_{a\in\mathcal{A}}D\big(s,a;\boldsymbol{w}^{D}\big).\quad{(6.1)} Q(s,a;w)V(s;wV)+D(s,a;wD)aAmaxD(s,a;wD).(6.1)

公式左边的 Q ( s , a ; w ) Q(s,a;\boldsymbol{w}) Q(s,a;w) 就是对决网络,它是对最优动作价值函数 Q ⋆ Q_{\star} Q 的近似。它的参数记作 w ≜ ( w V ; w D ) w\triangleq(w^V;w^D) w(wV;wD)

对决网络的结构如图 6.6 所示。

在这里插入图片描述

可以让两个神经网络 D ( s , a ; w D ) D(s,a;w^D) D(s,a;wD) V ( s ; w V ) V(s;w^V) V(s;wV) 共享部分卷积层;这些卷积层把输入的状态 s s s 映射成特征向量,特征向量是“优势头”与“状态价值头”的输入。优势头输出一个向量,向量的维度是动作空间的大小 ∣ A ∣ |A| A, 向量每个元素对应一个动作。举个例子,动作空间是$A= { 左,右,上 左,右,上 左,右,上} $。优势头的输出是三个值:
D ( s , 左 ; w D )   =   − 90 , D ( s , 右 ; w D )   =   − 420 , D ( s ,   上 ; w D )   =   30. D\big(s,\textit{左};\boldsymbol{w}^D\big)\:=\:-90,\quad D\big(s,\textit{右};\boldsymbol{w}^D\big)\:=\:-420,\quad D\big(s,\:\text{上};\boldsymbol{w}^D\big)\:=\:30. D(s,;wD)=90,D(s,;wD)=420,D(s,;wD)=30.

状态价值头输出的是一个实数,比如

V ( s ;   w V )   =   300. V(s;\:\boldsymbol{w}^{V})\:=\:300. V(s;wV)=300.

首先计算

max ⁡ a D ( s , a ; w D )   =   max ⁡ {   − 90 ,   − 420 ,   30 }   =   30. \operatorname*{max}_{a}D\big(s,a;\boldsymbol{w}^{D}\big)\:=\:\operatorname*{max}\big\{\:-90,\:-420,\:30\big\}\:=\:30. amaxD(s,a;wD)=max{90,420,30}=30.

然后用公式 (6.1) 计算出:

Q ( s , 左 ; w )   =   180 , Q ( s , 右 ; w )   =   − 150 , Q ( s ,   上 ; w )   =   300. Q\big(s,\textit{左};\boldsymbol{w}\big)\:=\:180,\quad Q\big(s,\textit{右};\boldsymbol{w}\big)\:=\:-150,\quad Q\big(s,\:\text{上};\boldsymbol{w}\big)\:=\:300. Q(s,;w)=180,Q(s,;w)=150,Q(s,;w)=300.

这样就得到了对决网络的最终输出。

解决不唯一性

读者可能会有下面的疑问。对决网络是由定理 6.1 推导出的,而定理中最右的一项恒等于零:
max ⁡ a ∈ A   D ⋆ ( s , a )   =   0 , ∀   s ∈ S . \max_{a\in\mathcal{A}}\:D_{\star}\big(s,a\big)\:=\:0,\quad\forall\:s\in\mathcal{S}. aAmaxD(s,a)=0,sS.
也就是说,可以把最优动作价值写成两种等价形式:

Q ⋆ ( s , a ) = V ⋆ ( s ) + D ⋆ ( s , a ) (第一种形式) = V ⋆ ( s ) + D ⋆ ( s , a ) − max ⁡ a ∈ A D ⋆ ( s , a ) . (第二种形式) \begin{matrix}Q_\star(s,a)&=&V_\star(s)+D_\star(s,a)&\text{(第一种形式)}\\&=&V_\star(s)+D_\star(s,a)-\max_{a\in\mathcal{A}}D_\star(s,a).&\text{(第二种形式)}\end{matrix} Q(s,a)==V(s)+D(s,a)V(s)+D(s,a)maxaAD(s,a).(第一种形式)(第二种形式)

之前我们根据第二种形式实现对决网络。我们可否根据第一种形式,把对决网络按照下面的方式实现呢:

Q ( s , a ;   w )   =   V ( s ;   w V ) + D ( s , a ;   w D )   ? Q\big(s,a;\:\boldsymbol{w}\big)\:=\:V\big(s;\:\boldsymbol{w}^{V}\big)+D\big(s,a;\:\boldsymbol{w}^{D}\big)\:? Q(s,a;w)=V(s;wV)+D(s,a;wD)?

答案是不可以这样实现对决网络,因为这样会导致不唯一性。假如这样实现对决网络,那么 V V V D D D 可以随意上下波动,比如一个增大 100, 另一个减小 100:

V ( s ;   w ~ V ) ≜ V ( s ;   w V ) + 100 , D ( s , a ;   w ~ D ) ≜ D ( s , a ;   w D ) − 100. \begin{array}{rcl}V(s;\:\tilde{\boldsymbol{w}}^V)&\triangleq&V(s;\:\boldsymbol{w}^V)+100,\\\\D\big(s,a;\:\tilde{\boldsymbol{w}}^D\big)&\triangleq&D\big(s,a;\:\boldsymbol{w}^D\big)-100.\end{array} V(s;w~V)D(s,a;w~D)V(s;wV)+100,D(s,a;wD)100.

这样的上下波动不影响最终的输出:

V ( s ;   w V ) + D ( s , a ;   w D )   =   V ( s ;   w ~ V ) + D ( s , a ;   w ~ D ) . V\big(s;\:\boldsymbol{w}^{V}\big)+D\big(s,a;\:\boldsymbol{w}^{D}\big)\:=\:V\big(s;\:\tilde{\boldsymbol{w}}^{V}\big)+D\big(s,a;\:\tilde{\boldsymbol{w}}^{D}\big). V(s;wV)+D(s,a;wD)=V(s;w~V)+D(s,a;w~D).

这就意味着 V V V D D D的参数可以很随意地变化,却不会影响输出的 Q。我们不希望这种情况出现,因为这会导致训练的过程中参数不稳定。

因此很有必要在对决网络中加入 max ⁡ a ∈ A D ( s , a ; w D ) \max_{a\in\mathcal{A}}D(s,a;\boldsymbol{w}^D) maxaAD(s,a;wD) 这一项。它使得 V V V D D D 不能随意上下波动。假如让 V V V变大 100,让 D D D 变小 100, 则对决网络的输出会增大 100,而非不变:

V ( s ;   w ~ V )   +   D ( s , a ;   w ~ D )   −   max ⁡ a D ( s , a ;   w ~ D ) V\big(s;\:\tilde{\boldsymbol{w}}^V\big)\:+\:D\big(s,a;\:\tilde{\boldsymbol{w}}^D\big)\:-\:\max_aD\big(s,a;\:\tilde{\boldsymbol{w}}^D\big) V(s;w~V)+D(s,a;w~D)amaxD(s,a;w~D)

= V ( s ;   w V )   +   D ( s , a ;   w D )   −   max ⁡ a D ( s , a ;   w D )   +   100. =V(s;\:\boldsymbol{w}^{V})\:+\:D\big(s,a;\:\boldsymbol{w}^{D}\big)\:-\:\operatorname*{max}_{a}D\big(s,a;\:\boldsymbol{w}^{D}\big)\:+\:100. =V(s;wV)+D(s,a;wD)amaxD(s,a;wD)+100.

以上讨论说明了为什么 max ⁡ a ∈ A D ( s , a ; w D ) \max_{a\in\mathcal{A}}D(s,a;w^D) maxaAD(s,a;wD)这一项不能省略。

对决网络的实际实现

按照定理 6.1, 对决网络应该定义成:
Q ( s , a ;   w )   ≜   V ( s ;   w V )   +   D ( s , a ;   w D )   −   max ⁡ a ∈ A D ( s , a ;   w D ) . Q\big(s,a;\:\boldsymbol{w}\big)\:\triangleq\:V\big(s;\:\boldsymbol{w}^{V}\big)\:+\:D\big(s,a;\:\boldsymbol{w}^{D}\big)\:-\:\operatorname*{max}_{a\in\mathcal{A}}D\big(s,a;\:\boldsymbol{w}^{D}\big). Q(s,a;w)V(s;wV)+D(s,a;wD)aAmaxD(s,a;wD).

最右边的 max 项的目的是解决不唯一性。实际实现的时候,用 mean 代替 max ⁡ \max max 会有更好的效果。所以实际 上会这样定义对决网络:

Q ( s , a ; w ) ≜ V ( s ; w V ) + D ( s , a ; w D ) − m e a n a ∈ A D ( s , a ; w D ) . \color{red}{\boxed{Q(s,a;\boldsymbol{w})\triangleq V(s;\boldsymbol{w}^{V})+D(s,a;\boldsymbol{w}^{D})-mean_{a\in\mathcal{A}}D(s,a;\boldsymbol{w}^{D}).}} Q(s,a;w)V(s;wV)+D(s,a;wD)meanaAD(s,a;wD).
对决网络与 DQN 都是对最优动作价值函数 Q ⋆ Q_{\star} Q 的近似,所以对决网络的训练和决策与 DQN 完全一样。比如可以这样训练对决网络:

  • ϵ \epsilon ϵ-greedy 算法控制智能体,收集经验,把 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1) 这样的四元组存入经验回放数组。
  • 从数组里随机抽取四元组,用双 Q 学习算法更新对决网络参数 w = ( w D , w V ) \boldsymbol{w}=(\boldsymbol{w}^D,\boldsymbol{w}^V) w=(wD,wV)

完成训练之后,基于当前状态 s t s_t st,让对决网络给所有动作打分,然后选择分数最高的动作:
a t   =   a r g m a x a ∈ A   Q ( s t , a ;   w ) . a_{t}\:=\:\mathop{\mathrm{argmax}}_{a\in\mathcal{A}}\:Q\big(s_{t},a;\:\boldsymbol{w}\big). at=argmaxaAQ(st,a;w).

简而言之,怎么样训练 DQN,就怎么样训练对决网络;怎么样用 DQN 做控制,就怎么样用对决网络做控制。如果一个技巧能改进 DQN 的训练,这个技巧也能改进对决网络。同样的道理,因为 Q 学习算法导致 DQN 出现高估,所以 Q 学习算法也会导致对决网络出现高估。

噪声网络

本节介绍噪声网络(noisy net),这是一种非常简单的方法,可以显著提高 DQN 的表现。噪声网络的应用不局限于 DQN, 它可以用于几乎所有的深度强化学习方法。

噪声网络的原理

把神经网络中的参数 w w w 替换成 μ + σ ∘ ξ \mu+\sigma\circ\xi μ+σξ。此处的 μ 、 σ 、 ξ \mu、\sigma、\xi μσξ 的形状与 w w w 完全相同。 μ \mu μ σ \sigma σ 分别表示均值和标准差,它们是神经网络的参数,需要从经验中学习。 ξ \xi ξ 是随机噪声,它的每个元素独立从标准正态分布 N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1) 中随机抽取。符号“ ∘ \circ ”表示逐项乘积。

在这里插入图片描述

如果 w w w 是向量,那么有
w i   =   μ i   +   σ i ⋅ ξ i . w_{i}\:=\:\mu_{i}\:+\:\sigma_{i}\cdot\xi_{i}. wi=μi+σiξi.

如果 w w w 是矩阵,那么有

w i j   =   μ i j   +   σ i j ⋅ ξ i j . w_{ij}\:=\:\mu_{ij}\:+\:\sigma_{ij}\cdot\xi_{ij}. wij=μij+σijξij.

噪声网络的意思是参数 w w w 的每个元素 w i w_i wi 从均值为 μ i \mu_i μi、标准差为 σ i \sigma_i σi 的正态分布中抽取。

举个例子,某一个全连接层记作:

z   =   R e L U   ( W x + b )   . z\:=\:\mathrm{ReLU}\:(\boldsymbol{Wx}+\boldsymbol{b})\:. z=ReLU(Wx+b).

公式中的向量 x x x 是输入,矩阵 W W W 和向量 b b b 是参数,ReLU 是激活函数, z z z 是这一层的输出。噪声网络把这个全连接层替换成:

z   =   R e L U ( ( W μ + W σ ∘ W ξ ) x   +   ( b μ + b σ ∘ b ξ ) ) . z\:=\:\mathrm{ReLU}\left(\left(W^{\mu}+W^{\sigma}\circ W^{\xi}\right)x\:+\:\left(b^{\mu}+b^{\sigma}\circ b^{\xi}\right)\right). z=ReLU((Wμ+WσWξ)x+(bμ+bσbξ)).

公式中的 W μ W^\mathrm{\mu} Wμ W σ W^\mathrm{\sigma} Wσ b μ b^\mathrm{\mu} bμ b σ b^\mathrm{\sigma} bσ是参数,需要从经验中学习。矩阵 W ξ W^\mathrm{\xi} Wξ 和向量 b ξ b^\mathrm{\xi} bξ 的每个元素都是独立从 N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1) 中随机抽取的,表示噪声。

训练噪声网络的方法与训练标准的神经网络完全相同,都是做反向传播计算梯度,然后用梯度更新神经参数。把损失函数记作 L L L。已知梯度 ∂ L ∂ z \frac{\partial L}{\partial z} zL,可以用链式法则算出损失关于参数的梯度:

∂ L ∂ W μ = ∂ z ∂ W μ ⋅ ∂ L ∂ z , ∂ L ∂ b μ = ∂ z ∂ b μ ⋅ ∂ L ∂ z , ∂ L ∂ W σ = ∂ z ∂ W σ ⋅ ∂ L ∂ z , ∂ L ∂ b σ = ∂ z ∂ b σ ⋅ ∂ L ∂ z . \begin{array}{rcl}\displaystyle\frac{\partial L}{\partial W^{\mu}}=\frac{\partial z}{\partial W^{\mu}}\cdot\frac{\partial L}{\partial z},&\displaystyle\frac{\partial L}{\partial b^{\mu}}=\frac{\partial z}{\partial b^{\mu}}\cdot\frac{\partial L}{\partial z},\\\displaystyle\frac{\partial L}{\partial W^{\sigma}}=\frac{\partial z}{\partial W^{\sigma}}\cdot\frac{\partial L}{\partial z},&\displaystyle\frac{\partial L}{\partial b^{\sigma}}=\frac{\partial z}{\partial b^{\sigma}}\cdot\frac{\partial L}{\partial z}.\end{array} WμL=WμzzL,WσL=WσzzL,bμL=bμzzL,bσL=bσzzL.

然后可以做梯度下降更新参数 W μ W^\mu Wμ W σ W^\sigma Wσ b μ b^\mu bμ b σ b^\sigma bσ

噪声 DQN

噪声网络可以用于 DQN。标准的 DQN 记作 Q ( s , a ; w ) Q(s,a;\boldsymbol{w}) Q(s,a;w), 其中的 w w w 表示参数。把 w w w 替换成 μ + σ ∘ ξ \mu+\sigma\circ\xi μ+σξ, 得到噪声 DQN, 记作:
Q ~ ( s , a , ξ ; μ , σ )   ≜   Q ( s , a ; μ + σ ∘ ξ ) . \tilde{Q}(s,a,\boldsymbol{\xi};\boldsymbol{\mu},\boldsymbol{\sigma})\:\triangleq\:Q(s,\boldsymbol{a};\boldsymbol{\mu}+\boldsymbol{\sigma}\circ\boldsymbol{\xi}). Q~(s,a,ξ;μ,σ)Q(s,a;μ+σξ).

其中的 μ \mu μ σ \sigma σ是参数,一开始随机初始化,然后从经验中学习;而 ξ \xi ξ则是随机生成,每个元素都从 N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1) 中抽取。噪声 DQN 的参数数量比标准 DQN 多一倍。

收集经验

DQN 属于异策略 (off-policy)。我们用任意的行为策略 (behavior policy) 控制智能体,收集经验,事后做经验回放更新参数。在之前章节中,我们用 ϵ \epsilon ϵ-greedy 作为行为策略:
a t   =   { argmax ⁡ a ∈ A Q ( s t , a ; w ) , 以概率   ( 1 − ϵ ) ; 均匀抽取   A   中的一个动作 , 以概率   ϵ . \left.a_t\:=\:\left\{\begin{array}{ll}\operatorname{argmax}_{a\in\mathcal{A}}Q(s_t,a;\boldsymbol{w}),&\text{以概率}\:(1-\epsilon);\\\text{均匀抽取}\:\mathcal{A}\:\text{中的一个动作},&\text{以概率}\:\epsilon.\end{array}\right.\right. at={argmaxaAQ(st,a;w),均匀抽取A中的一个动作,以概率(1ϵ);以概率ϵ.

ϵ \epsilon ϵ-greedy 策略带有一定的随机性,可以让智能体尝试更多动作,探索更多状态。
噪声 DQN 本身就带有随机性,可以鼓励探索,起到与 ϵ \epsilon ϵ-greedy 策略相同的作用。我们直接用

a t   =   a r g m a x a ∈ A   Q ~ ( s , a , ξ ;   μ , σ ) a_t\:=\:\underset{a\in\mathcal{A}}{\mathrm{argmax}}\:\tilde{Q}(s,a,\xi;\:\mu,\sigma) at=aAargmaxQ~(s,a,ξ;μ,σ)

作为行为策略,效果比 ϵ \epsilon ϵ-greedy 更好。每做一个决策,要重新随机生成一个 ξ \xi ξ

Q \mathbb{Q} Q学习算法:

训练的时候,每一轮从经验回放数组中随机抽样出一个四元组,记作 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1)。从标准正态分布中做抽样,得到 ξ ′ \xi^{\prime} ξ的每一个元素。计算 TD 目标:
y ^ j   =   r j   +   γ   ⋅   max ⁡ a ∈ A Q ~ ( s j + 1 , a , ξ ′ ;   μ , σ ) . \widehat y_j\:=\:r_j\:+\:\gamma\:\cdot\:\max_{a\in\mathcal{A}}\widetilde Q(s_{j+1},a,\xi^{\prime};\:\mu,\sigma). y j=rj+γaAmaxQ (sj+1,a,ξ;μ,σ).

把损失函数记作:

L ( μ , σ )   =   1 2 [ Q ~ ( s j , a j , ξ ; μ , σ )   −   y ^ j ] 2 , L(\boldsymbol{\mu},\boldsymbol{\sigma})\:=\:\frac{1}{2}\Big[\tilde{Q}(s_{j},a_{j},\boldsymbol{\xi};\boldsymbol{\mu},\boldsymbol{\sigma})\:-\:\widehat{y}_{j}\Big]^{2}, L(μ,σ)=21[Q~(sj,aj,ξ;μ,σ)y j]2,

其中的 ξ \xi ξ也是随机生成的噪声,但是它与 ξ ′ \xi^{\prime} ξ不同。然后做梯度下降更新参数:

μ   ←   μ − α μ ⋅ ∇ μ L ( μ , σ ) , σ   ←   σ − α σ ⋅ ∇ σ L ( μ , σ ) . \mu\:\leftarrow\:\mu-\alpha_{\mu}\cdot\nabla_{\mu}L(\mu,\sigma),\quad\sigma\:\leftarrow\:\sigma-\alpha_{\sigma}\cdot\nabla_{\sigma}L(\mu,\sigma). μμαμμL(μ,σ),σσασσL(μ,σ).
公式中的 α μ \alpha_\mathrm{\mu} αμ α σ \alpha_\mathrm{\sigma} ασ 是学习率。这样做梯度下降更新参数,可以让损失函数减小,让噪声DQN 的预测更接近 TD 目标。

做决策 :

做完训练之后,可以用噪声 DQN 做决策。做决策的时候不再需要噪声,因此可以把参数 σ \sigma σ设置成全零,只保留参数 μ \mu μ。这样一来,噪声 DQN 就变成标准的 DQN:

Q ~ ( s , a , ξ ′ ; μ , 0 ) ⏟ 噪声 DQN = Q ( s , a ; μ ) ⏟ 标准 DQN . \underbrace{\widetilde{Q}(s,a,\boldsymbol{\xi'};\boldsymbol{\mu},\boldsymbol{0})}_{\text{噪声 DQN}}=\underbrace{Q(s,a;\boldsymbol{\mu})}_{\text{标准 DQN}}. 噪声 DQN Q (s,a,ξ;μ,0)=标准 DQN Q(s,a;μ).

在训练的时候往 DQN 的参数中加入噪声,不仅有利于探索,还能增强鲁棒性。鲁棒性的意思是即使参数被扰动,DQN 也能对动作价值 Q ⋆ Q_{\star} Q 做出可靠的估计。为什么噪声可以让DQN 有更强的鲁棒性呢?

假设在训练的过程中不加入噪声。把学出的参数记作 μ \mu μ。当参数严格等于 μ \mu μ 的时候DQN 可以对最优动作价值做出较为准确的估计。但是对 μ \mu μ 做较小的扰动,就可能会让DQN 的输出偏离很远。所谓“失之毫厘,谬以千里”。

噪声 DQN 训练的过程中,参数带有噪声: w = μ + σ ∘ ξ w=\mu+\sigma\circ\xi w=μ+σξ。训练迫使 DQN 在参数带噪声的情况下最小化 TD 误差,也就是迫使 DQN 容忍对参数的扰动。训练出的 DQN 具有鲁棒性:参数不严格等于 μ \mu μ 也没关系,只要参数在 μ \mu μ 的邻域内,DQN 做出的预测都应该比较合理。用噪声 DQN, 不会出现“失之毫厘,谬以千里”。

训练流程

实际编程实现 DQN 的时候,应该将本章的四种技巧——优先经验回放、双 Q \mathbb{Q} Q学习、 对决网络、噪声 DQN——全部用到。应该用对决网络的神经网络结构,而不是简单的DQN 结构。往对决网络中的参数 w w w 中加入噪声,得到噪声 DQN, 记作 Q ~ ( s , a , ξ ; μ , σ ) \tilde{Q}(s,a,\xi;\mu,\sigma) Q~(s,a,ξ;μ,σ)。训练要用双 Q \mathbb{Q} Q 学习、优先经验回放,而不是原始的 Q 学习。双 Q 学习需要目标网络 Q ~ ( s , a , ξ ; μ − , σ − ) \tilde{Q}(s,a,\xi;\mu^-,\sigma^-) Q~(s,a,ξ;μ,σ) 计算 TD 目标。它跟噪声 DQN 的结构相同,但是参数不同。

初始化的时候,随机初始化 μ 、 σ \mu、\sigma μσ,并且把它们赋值给目标网络参数: μ − ← μ . σ − ← σ \mu^-\leftarrow\mu.\sigma^-\leftarrow\sigma μμ.σσ

然后重复下面的步骤更新参数。把当前的参数记作 μ n o w \mu_\mathrm{now} μnow σ n o w \sigma_\mathrm{now} σnow μ n o w − \mu_\mathrm{now}^\mathrm{-} μnow σ n o w − \sigma_\mathrm{now}^\mathrm{-} σnow

  1. 用优先经验回放,从数组中抽取一个四元组,记作 ( s j , a j , r j , s j + 1 ) (s_j,a_j,r_j,s_{j+1}) (sj,aj,rj,sj+1)
  2. 用标准正态分布生成 ξ \xi ξ。对噪声 DQN 做正向传播,得到:

q ^ j   =   Q ~ ( s j , a j , ξ ;   μ n o w , σ n o w ) . \widehat q_{j}\:=\:\widetilde Q(s_{j},a_{j},\xi;\:\mu_{\mathrm{now}},\sigma_{\mathrm{now}}). q j=Q (sj,aj,ξ;μnow,σnow).

  1. 用噪声 DQN 选出最优动作:

a ~ j + 1   =   argmax ⁡ a ∈ A   Q ~ ( s j + 1 , a ,   ξ ;   μ n o w , σ n o w ) . \tilde{a}_{j+1}\:=\:\operatorname*{argmax}_{a\in A}\:\tilde{Q}\big(s_{j+1},a,\:\xi;\:\mu_{\mathrm{now}},\sigma_{\mathrm{now}}\big). a~j+1=aAargmaxQ~(sj+1,a,ξ;μnow,σnow).

  1. 用标准正态分布生成 ξ ′ \xi^{\prime} ξ。用目标网络计算价值:

q ^ j + 1 −   =   Q ~ ( s j + 1 , a ~ j + 1 ,   ξ ′ ;   μ n o w − , σ n o w − ) . \widehat q_{j+1}^{-}\:=\:\widetilde Q\big(s_{j+1},\tilde{a}_{j+1},\:\xi^{\prime};\:\mu_{\mathrm{now}}^{-},\sigma_{\mathrm{now}}^{-}\big). q j+1=Q (sj+1,a~j+1,ξ;μnow,σnow).

  1. 计算 TD 目标和 TD 误差:

y ^ j −   =   r j + γ ⋅ q ^ j + 1 − 和 δ j   =   q ^ j − y ^ j − . \widehat{y}_{j}^{-}\:=\:r_{j}+\gamma\cdot\widehat{q}_{j+1}^{-}\quad\text{和}\quad\delta_{j}\:=\:\widehat{q}_{j}-\widehat{y}_{j}^{-}. y j=rj+γq j+1δj=q jy j.

  1. α μ \alpha_\mathrm{\mu} αμ α σ \alpha_\mathrm{\sigma} ασ为学习率。做梯度下降更新噪声 DQN 的参数:

μ n e w ← μ n o w − α μ ⋅ δ j ⋅ ∇ μ Q ~ ( s j , a j , ξ ;   μ n o w , σ n o w ) , σ n e w ← σ n o w − α σ ⋅ δ j ⋅ ∇ σ Q ~ ( s j , a j ,   ξ ;   μ n o w , σ n o w ) . \begin{array}{rcl}\mu_\mathrm{new}&\leftarrow&\mu_\mathrm{now}-\alpha_{\mu}\cdot\delta_j\cdot\nabla_{\mu}\widetilde{Q}\big(s_j,a_j,\xi;\:\mu_\mathrm{now},\sigma_\mathrm{now}\big),\\\\\sigma_\mathrm{new}&\leftarrow&\sigma_\mathrm{now}-\alpha_\sigma\cdot\delta_j\cdot\nabla_{\sigma}\widetilde{Q}\big(s_j,a_j,\:\xi;\:\mu_\mathrm{now},\sigma_\mathrm{now}\big).\end{array} μnewσnewμnowαμδjμQ (sj,aj,ξ;μnow,σnow),σnowασδjσQ (sj,aj,ξ;μnow,σnow).

  1. τ ∈ ( 0 , 1 ) \tau\in(0,1) τ(0,1) 是需要手动调整的超参数。做加权平均更新目标网络的参数:

μ n e w − ← τ ⋅ μ n e w   +   ( 1 − τ ) ⋅ μ n o w − , σ n e w − ← τ ⋅ σ n e w   +   ( 1 − τ ) ⋅ σ n o w − . \begin{array}{rcl}\mu_\mathrm{new}^-&\leftarrow&\tau\cdot\mu_\mathrm{new}\:+\:\left(1-\tau\right)\cdot\mu_\mathrm{now}^-,\\\\\sigma_\mathrm{new}^-&\leftarrow&\tau\cdot\sigma_\mathrm{new}\:+\:\left(1-\tau\right)\cdot\sigma_\mathrm{now}^-.\end{array} μnewσnewτμnew+(1τ)μnow,τσnew+(1τ)σnow.

总结

  • 经验回放可以用于异策略算法。经验回放有两个好处:打破相邻两条经验的相关性、 重复利用收集的经验。

  • 优先经验回放是对经验回放的一种改进。在做经验回放的时候,从经验回放数组中做加权随机抽样,TD 误差的绝对值大的经验被赋予较大的抽样概率、较小的学习率。

  • Q 学习算法会造成 DQN 高估真实的价值。高估的原因有两个:第一,最大化造成TD 目标高估真实价值;第二,自举导致高估传播。高估并不是由 DQN 本身的缺陷造成的,而是由于 Q \mathbb{Q} Q学习算法不够好。双 Q \mathbb{Q} Q学习是对 Q 学习算法的改进,可以有效缓解高估。

  • 对决网络与 DQN 一样,都是对最优动作价值函数 Q ⋆ Q_\mathrm{\star} Q 的近似;两者的唯一区别在于神经网络结构。对决网络由两部分组成 : D ( s , a ; w D ) :D(s,a;w^D) :D(s,a;wD) 是对最优优势函数的近似, V ( s ; w V ) V(s;\boldsymbol{w}^V) V(s;wV) 是对最优状态价值函数的近似。对决网络的训练与 DQN 完全相同。

  • 噪声网络是一种特殊的神经网络结构,神经网络中的参数带有随机噪声。噪声网络可以用于DQN 等多种深度强化学习模型。噪声网络中的噪声可以鼓励探索,让智能体尝试不同的动作,这有利于学到更好的策略。

后记

截至2024年1月29日13点41分,学习完价值学习的高级技巧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读|半监督小苹果检测方法S3AD】

论文题目 : : Semi-supervised Small Apple Detection in Orchard Environments 项目链接:https://www.inf.uni-hamburg.de/en/inst/ab/cv/people/wilms/mad.html 摘要(Abstract) 农作物检测是自动估产或水果采摘等精准农业应用不…

盘点热门的GPTS智能体,生产力远超原生ChatGPT4

OPENAI开放了GPTS智能体商店,类似于appstore的应用商店,在GPTS商店里面你可以发现并创建自定义版本的ChatGPT,这些版本结合了指令、额外知识和任何技能组合! 本周精选 GPTS智能体不仅可以通过API的方式将你的私有化的数据和能力…

双链表的基本知识以及增删查改的实现

满怀热忱,前往梦的彼岸 前言 之前我们对单链表进行了非常细致的剖析,现在我们所面临的则是与之相对应的双链表,我会先告诉诸位它的基本知识,再接着把它的增删查改讲一下,ok,正文开始。 一.链表的种类 我…

机器学习和深度学习中的normalization(归一化)

在机器学习和深度学习中,normalization(归一化)是一种重要的数据预处理步骤,它的目的是改变数值数据的形式,以使其在一个固定的范围内,通常是 0 到 1,或者使其均值为 0,标准差为 1。…

Jenkins+Python自动化测试持续集成详细教程

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

基于Prompt Learning的信息抽取

PTR: Prompt Tuning with Rules for Text Classification 清华;liuzhiyuan;通过规则制定subpromptRelation Extraction as Open-book Examination: Retrieval-enhanced Prompt Tuning Relation Extraction as Open-book Examination: Retrieval-enhance…

JSP在线阅读系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP 小说在线阅读系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库 ,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为SQLServer2008&#…

KubeSphere 核心实战之四【在kubesphere平台上部署Ruoyi-cloud项目】(实操篇 4/4)

**《KubeSphere 核心实战系列》** KubeSphere 核心实战之一(实操篇 1/4) KubeSphere 核心实战之二(实操篇 2/4) KubeSphere 核心实战之三(实操篇 3/4) KubeSphere 核心实战之四(实操篇 4/4&…

学会用Python分割、合并字符串

在很多情况下,我们需要对字符串进行分割或合并,以满足特定的需求,例如将字符串拆分成多个部分、将多个字符串合并成一个等等。Python提供了多种方法来进行字符串的分割和合并,本文将介绍其中几种常用的方法。 一、使用split()函数…

深度解析C++引用究竟是什么

首先看一段代码&#xff1a; #include<iostream> using namespace std; void fun(int*a){} void fun(int&a){} int main(){int a10;fun(&a);fun(a); }我们查看它的汇编结果时会发现引用和指针传参整个过程的汇编是一模一样的 我们再看下面这段代码&#xff1a…

HBase(docker版)简单部署和HBase shell操作实践

文章目录 说明HBase部署访问HBase Shell常见命令数据定义语言(DDL) 数据操作语言(DML)通用操作访问HBase WebUI 说明 本文适合HBase初学者快速搭建HBase环境&#xff0c;练习常见shell使用本文参考资料 《大数据技术原理和应用》&#xff08;林子雨 编著 第三版&#xff09;zh…

C++ 滑动窗口

目录 1、209. 长度最小的子数组 2、3. 无重复字符的最长子串 3、1004. 最大连续1的个数 III 4、1658. 将 x 减到 0 的最小操作数 5、904. 水果成篮 6、438. 找到字符串中所有字母异位词 7、30. 串联所有单词的子串 8、76. 最小覆盖子串 1、209. 长度最小的子数组 思路&…

存储监控工具:监控存储区域网络(SAN)

从托管应用程序到提供大型多媒体服务&#xff0c;组织都依靠其 IT 基础架构来提供无与伦比的最终用户体验。为了提供这种卓越的体验&#xff0c;必须大大提高应用程序的可用性和性能。在许多其他挑战中&#xff0c;存储区域网络 &#xff08;SAN&#xff09; 正好用于应对这些挑…

TPCC-MySQL

简介 TPC-C是专门针对联机交易处理系统&#xff08;OLTP系统&#xff09;的规范&#xff0c;一般情况下我们也把这类系统称为业务处理系统。 Tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品&#xff0c;专用于MySQL基准测试。其源码放在launchpad上&#xff0c…

使用xlsx、xlsx-style导出表格添加背景色;合并单元格部分样式缺失问题解决

这篇说一下使用xlsx-style导出excel时样式的设置。需要安装xlsx、xlsx-style、file-saver插件&#xff08;file-saver可以不装&#xff0c;用a标签代替也可以&#xff09;&#xff0c;安装时可能会碰到一些报错问题&#xff0c;可以去看下我之前一篇博客&#xff1a;纯前端导出…

C语言之刷到的怪题(i与sizeof(i)比较大小)

这个题目一般都是选择输出<。为什么呢&#xff1f;因为i是一个全局变量&#xff0c;并且没有初始化&#xff0c;那么i的值就等于0。i--之后就是-1了。而sizeof(i)求出的就是整形变量对应的大小4个字节。-1<4&#xff0c;因此就选择 输出<。其实不然&#xff0c;这个si…

QEMU - e1000全虚拟化前端与TAP/TUN后端流程简析

目录 1. Host -> Guest 2.Guest ->Host 3. 如何修改以支持TUN设备的后端&#xff1f; 4. 相关 QEMU 源码 5. 实验 1. Host -> Guest 2.Guest ->Host 3. 如何修改以支持TUN设备的后端&#xff1f; 1. 简单通过后端网卡名字来判断是TUN还是TAP。 2. 需要前端全…

秋招面试—CSS篇

2021 CSS面试题 1.CSS可继承属性有哪些&#xff1f; 文字相关&#xff1a;font-famliy 、font-weight 、font-size 、font-style文本相关&#xff1a;text-indent&#xff08;首行缩进&#xff09; 、text-align&#xff08;水平对齐&#xff09; 、line-height 、text-trans…

node.js基础--01

Author nodes&#xff1a;&#xff08;题记&#xff09; node.js is an open-source&#xff0c;cross-platform JAVAScript runtime environment。 node.js是一个开源&#xff0c;跨平台的js运行环境 common commands&#xff08;常用指令&#xff09; 1、C: enter hard …

C# 一个快速读取写入操作execl的方法封装

这里封装了3个实用类ExcelDataReaderExtensions&#xff0c;ExcelDataSetConfiguration&#xff0c;ExcelDataTableConfiguration和一个实用代码参考&#xff1a; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.T…