深度强化学习(王树森)笔记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分,学习完价值学习的高级技巧。

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

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

相关文章

校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!

随着移动互联网的快速发展,校园社交成为了大学生们日常生活中重要的一部分。为了方便校园内学生的交流和互动,校园社交小程序逐渐走入人们的视野。本文将探讨校园社交小程序的开发以及其带来的益处。 校园社交小程序的开发涉及许多技术和设计方面。首先&…

安装elasticsearch、kibana、IK分词器

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大&#xff0…

提升工作效率,畅享便捷PDF编辑体验——Adobe Acrobat Pro DC 2023

作为全球领先的PDF编辑软件,Adobe Acrobat Pro DC 2023将为您带来前所未有的PDF编辑体验。无论您是个人用户还是企业用户,Adobe Acrobat Pro DC 2023将成为您提高工作效率、简化工作流程的得力助手。 一、全面编辑功能 Adobe Acrobat Pro DC 2023提供了…

代码随想录 Leetcode110.平衡二叉树

题目: 代码(首刷看解析 2024年1月30日): class Solution { public:int depth(TreeNode* root) {if (root nullptr) return 0;int leftHeight depth(root->left);if (leftHeight -1) return -1;int rightHeight depth(root->right)…

打造高效经营:开发连锁餐饮管理系统的技术深度解析

为了适应市场的快速发展和提高经营效率,许多连锁餐饮企业纷纷投入开发连锁餐饮管理系统。 一、数字化转型的动力 传统的餐饮经营面临着诸多挑战,如订单管理、库存控制、人力资源等问题。在这样的背景下,连锁餐饮企业迫切需要一种全面而高效…

Flask 入门2

1. 在上一节中&#xff0c;我们使用到了静态路由&#xff0c;即一个路由规则对应一个 URL。而在实际应用中&#xff0c;更多使用的则是动态路由&#xff0c;它的 URL是可变的。 2. 定义一个很常见的路由地址 app.route(/user/<username>) def user(username):return U…

SQL Server ISO镜像文件安装

参考&#xff1a;Sql Server ISO镜像文件安装指南_sqlserveriso文件怎么安装-CSDN博客 参考文件中的步骤基本相同&#xff0c;注意两点 1、尽量安装在D盘&#xff0c;有些组件默认必须安装在C盘&#xff0c;有些会报没有目录的情况 需要在D盘创建目录。 2、我没有windows本地…

计网Lesson11 - 虚拟机网络环境及socket概述

文章目录 虚拟机的简述socket概述 虚拟机的简述 放张图在这&#xff0c;根本没明白是啥对啥&#xff0c;以后学了Linux再来吧 &#x1f626; socket概述 s o c k e t socket socket 是一种用于应用层的用户态与应用层以下的内核态交互的工具&#xff0c;本意为“插座”。 也就是…

HarmonyOS NEXT 星河版项目案例

参考代码&#xff1a;HeimaHealthy: 鸿蒙项目案例练习 (gitee.com) 1.欢迎页面 Entry Component struct WelcomePage {State message: string Hello Worldbuild() {Column({space: 10}) {Row() {// 1.中央slogonImage($r(app.media.home_slogan)).width(260)}.layoutWeight(…

FL Studio21.2.2中文完整版 适合专业创作者

FL Studio 简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前版本是FL Studio2024&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想…

分布式虚拟文件系统,如何实现多种存储系统的融合

随着大数据技术和人工智能技术的发展&#xff0c;各种框架应运而生&#xff0c;比如大数据领域中的MapReduce和Spark&#xff0c;人工智能领域中的TensorFlow和PyTorch等。为了给不同的计算框架提供存储服务&#xff0c;存储的服务类型也是很多&#xff0c;常见的如AWS的S3存储…

winform工具报错处理

winform工具报错处理 如图&#xff1a; 出现这种错误&#xff0c;工具打不开就是没有这个&#xff08;.NET&#xff09;环境&#xff0c;需要根据工具的使用开发环境安装配置插件 解决方案 需要安装如图的插件&#xff1a; 选择文件导入报错 1.如果之前已安装过AccessDat…

【c++】日期类的实现-Class Date

代码实现 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; class Date { public:// 获取某年某月的天数int GetMonthDay(int year, int month){static int monteDays[13] { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month 2 &&…

[React源码解析] Fiber (二)

在React15及以前, Reconciler采用递归的方式创建虚拟Dom, 但是递归过程不可以中断, 如果组件的层级比较深的话, 递归会占用线程很多时间, 那么会造成卡顿。 为了解决这个问题, React16将递归的无法中断的更新重构为异步的可中断更新, Fiber架构诞生。 文章目录 1.Fiber的结构2…

Android Studio项目——TCP客户端

目录 一、TCP客户端UI 1、UI展示 2、xml代码 二、TCP客户端数据发送 三、TCP客户端数据接收 一、TCP客户端UI 1、UI展示 2、xml代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.…

开始一个vue项目

一、新建项目 用cmd命令创建项目 1.1创建文件 以管理员身份打开命令行界面&#xff0c;进入任意一个想要创建项目的文件夹 输入&#xff1a;vue create vue01 1.2创建成功 Successfully created project vue01出现这个说明创建成功1.3项目目录 二、 vue-router 安装和配置的…

C语言-动态内存申请

一、动态分配内存的概述 在数组一章中&#xff0c;介绍过数组的长度是预先定义好的&#xff0c;在整个程序中固定不变&#xff0c;但是在实际的编程中&#xff0c;往往会发生这种情况&#xff0c;即所需的内存空间取决于实际输入的数据&#xff0c;而无法预先确定 。为了解决…

ChatGPT PLUS升级步骤--支付宝、微信

AI伴随着我们已经有一年多了&#xff0c;这一年多里我使用ChatGPT做ppt、生成绘画、写文案、做旅游攻略&#xff0c;还有一些医学知识&#xff0c;医学知识我感觉没有回答的很好&#xff0c;对比于医生给的建议我个人觉得还是医生的比较好&#xff0c;Chat GPT回答的比较官方 …

AWS免费套餐——云存储S3详解

文章目录 前言一、为什么选择S3二、费用估算三、创建S3云存储注册账户登录账户创建存储桶关于官网相关文档 总结 前言 不论个人还是企业&#xff0c;日常开发中经常碰到需要将文档、安装包、日志等文件数据存储到服务器的需求。往常最常用的是云服务器&#xff0c;但是仅仅承担…

leetcode hot100跳跃游戏Ⅱ

本题和上一题还是有不一样的地方&#xff0c;这个题中&#xff0c;我们需要记录我们跳跃的步数并尽可能的满足最小的跳跃步数到达终点。 那么我们还是采用覆盖范围的概念&#xff0c;但是我们需要两个&#xff0c;一个是在当前位置的覆盖范围&#xff0c;另一个是下一步的覆盖…