Update chapter7_questions&keywords.md

This commit is contained in:
Yiyuan Yang
2022-09-21 16:21:43 +08:00
committed by GitHub
parent 90478c9f23
commit 9900c9ad2c

View File

@@ -1,57 +1,63 @@
# Chapter7 Q-learning-Double DQN
# 第七章 DQN (进阶技巧)
## 1 Keywords
## 关键词
- **Double DQN** 在Double DQN中存在两个 Q-network首先第一个 Q-network决定的是哪一个 action 的 Q value 最大从而决定了你的action。另一方面 Q value 是用 $Q'$ 算出来的,这样就可以避免 over estimate 的问题。具体来说,假设我们有两个 Q-function假设第一个Q-function 它高估了它现在选出来的action a没关系只要第二个Q-function $Q'$ 没有高估这个action a 的值,那你算出来的,就还是正常的值。
- **Dueling DQN** 将原来的DQN的计算过程分为**两个path**。对于第一个path会计算一个于input state有关的一个标量 $V(s)$对于第二个path会计算出一个vector $A(s,a)$ 其对应每一个action。最后的网络是将两个path的结果相加得到我们最终需要的Q value。用一个公式表示也就是 $Q(s,a)=V(s)+A(s,a)$ 。
- **Prioritized Experience Replay (优先经验回放):** 这个方法是为了解决我们在chapter6中提出的**Experience Replay经验回放**方法不足进一步优化提出的。我们在使用Experience Replay时是uniformly取出的experience buffer中的sample data这里并没有考虑数据间的权重大小。例如我们应该将那些train的效果不好的data对应的权重加大即其应该有更大的概率被sample到。综上 prioritized experience replay 不仅改变了 sample data 的 distribution还改变了 training process。
- **Noisy Net** 其在每一个episode 开始的时候即要和环境互动的时候将原来的Q-function 的每一个参数上面加上一个Gaussian noise。那你就把原来的Q-function 变成$\tilde{Q}$ ,即**Noisy Q-function**。同样的我们把每一个network的权重等参数都加上一个Gaussian noise就得到一个新的network $\tilde{Q}$。我们会使用这个新的network从与环境互动开始到互动结束。
- **Distributional Q-function** 对于DQN进行model distribution。将最终的网络的output的每一类别的action再进行distribution。
- **Rainbow** 也就是将我们这两节内容所有的七个tips综合起来的方法7个方法分别包括DQN、DDQN、Prioritized DDQN、Dueling DDQN、A3C、Distributional DQN、Noisy DQN进而考察每一个方法的贡献度或者是否对于与环境的交互式正反馈的。
- **双深度Q网络double DQN**在双深度Q网络中存在两个Q网络第一个Q网络决定哪一个动作的Q值最大从而决定对应的动作。另一方面Q值是用 $Q'$ 计算得到的,这样就可以避免过度估计的问题。具体,假设我们有两个Q函数并且第一个Q函数高估了它现在执行的动作 $a$ 的值,这没关系只要第二个Q函数 $Q'$ 没有高估动作 $a$ 的值,那么计算得到的就还是正常的值。
## 2 Questions
- **竞争深度Q网络dueling DQN**将原来的深度Q网络的计算过程分为两步。第一步计算一个与输入有关的标量 $\mathrm{V(s)}$;第二步计算一个向量 $\mathrm{A(s,a)}$ 对应每一个动作。最后的网络将两步的结果相加得到我们最终需要的Q值。用一个公式表示就是 $\mathrm{Q(s,a)=V(s)+A(s,a)}$ 。另外竞争深度Q网络使用状态价值函数与动作价值函数来评估Q值。
- 为什么传统的DQN的效果不好?参考公式 $Q(s_t ,a_t)=r_t+\max_{a}Q(s_{t+1},a)$
- **优先级经验回放prioritized experience replayPER**这个方法是为了解决我们在第6章中提出的经验回放方法的不足而提出的。我们在使用经验回放时均匀地取出回放缓冲区reply buffer中的采样数据这里并没有考虑数据间的权重大小。但是我们应该将那些训练效果不好的数据对应的权重加大,即其应该有更大的概率被采样到。综上,优先级经验回放不仅改变了被采样数据的分布,还改变了训练过程。
答:因为实际上在做的时候,是要让左边这个式子跟右边这个 target 越接近越好。比较容易可以发现target 的值很容易一不小心就被设得太高。因为在算这个 target 的时候我们实际上在做的事情是看哪一个a 可以得到最大的Q value就把它加上去就变成我们的target
- **噪声网络noisy net**其在每一个回合开始的时候即智能体要和环境交互的时候在原来的Q函数的每一个参数上加上一个高斯噪声Gaussian noise把原来的Q函数变成 $\tilde{Q}$ 即噪声Q函数。同样我们把每一个网络的权重等参数都加上一个高斯噪声就得到一个新的网络 $\tilde{Q}$ 。我们会使用这个新的网络与环境交互直到结束
举例来说,现在有 4 个 actions本来其实它们得到的值都是差不多的它们得到的reward 都是差不多的。但是在estimate 的时候那毕竟是个network。所以estimate 的时候是有误差的。所以假设今天是第一个action它被高估了假设绿色的东西代表是被高估的量它被高估了那这个target 就会选这个action。然后就会选这个高估的Q value来加上$r_t$来当作你的target。如果第4 个action 被高估了那就会选第4 个action 来加上$r_t$ 来当作你的target value。所以你总是会选那个Q value 被高估的你总是会选那个reward 被高估的action 当作这个max 的结果去加上$r_t$ 当作你的target。所以你的target 总是太大
- **分布式Q函数distributional Q-function**对深度Q网络进行模型分布将最终网络的输出的每一类别的动作再进行分布操作
- 接着上个思考题我们应该怎么解决target 总是太大的问题呢?
答: 我们可以使用Double DQN解决这个问题。首先在 Double DQN 里面,选 action 的 Q-function 跟算 value 的 Q-function不同。在原来的DQN 里面,你穷举所有的 a把每一个a 都带进去, 看哪一个 a 可以给你的 Q value 最高,那你就把那个 Q value 加上$r_t$。但是在 Double DQN 里面,你**有两个 Q-network**,第一个 Q-network决定哪一个 action 的 Q value 最大,你用第一个 Q-network 去带入所有的 a去看看哪一个Q value 最大。然后你决定你的action 以后,你的 Q value 是用 $Q'$ 算出来的,这样子有什么好处呢?为什么这样就可以避免 over estimate 的问题呢?因为今天假设我们有两个 Q-function假设第一个Q-function 它高估了它现在选出来的action a那没关系只要第二个Q-function $Q'$ 没有高估这个action a 的值,那你算出来的,就还是正常的值。假设反过来是 $Q'$ 高估了某一个action 的值,那也没差, 因为反正只要前面这个Q 不要选那个action 出来就没事了。
- 哪来 Q 跟 $Q'$ 呢?哪来两个 network 呢?
答:在实现上,你有两个 Q-network 一个是 target 的 Q-network一个是真正你会 update 的 Q-network。所以在 Double DQN 里面,你的实现方法会是拿你会 update 参数的那个 Q-network 去选action然后你拿target 的network那个固定住不动的network 去算value。而 Double DQN 相较于原来的 DQN 的更改是最少的它几乎没有增加任何的运算量连新的network 都不用因为你原来就有两个network 了。你唯一要做的事情只有本来你在找最大的a 的时候你在决定这个a 要放哪一个的时候,你是用$Q'$ 来算你是用target network 来算,现在改成用另外一个会 update 的 Q-network 来算。
- 如何理解Dueling DQN的模型变化带来的好处
答:对于我们的 $Q(s,a)$ 其对应的state由于为table的形式所以是离散的而实际中的state不是离散的。对于 $Q(s,a)$ 的计算公式, $Q(s,a)=V(s)+A(s,a)$ 。其中的 $V(s)$ 是对于不同的state都有值对于 $A(s,a)$ 对于不同的state都有不同的action对应的值。所以本质上来说我们最终的矩阵 $Q(s,a)$ 的结果是将每一个 $V(s)$ 加到矩阵 $A(s,a)$ 中得到的。从模型的角度考虑我们的network直接改变的 $Q(s,a)$ 而是 更改的 $V、A$ 。但是有时我们update时不一定会将 $V(s)$ 和 $Q(s,a)$ 都更新。我们将其分成两个path后我们就不需要将所有的state-action pair都sample一遍我们可以使用更高效的estimate Q value方法将最终的 $Q(s,a)$ 计算出来。
- 使用MC和TD平衡方法的优劣分别有哪些
答:
- 优势:因为我们现在 sample 了比较多的step之前是只sample 了一个step 所以某一个step 得到的data 是真实值接下来都是Q value 估测出来的。现在sample 比较多stepsample N 个step 才估测value所以估测的部分所造成的影响就会比小。
- 劣势:因为我们的 reward 比较多,当我们把 N 步的 reward 加起来,对应的 variance 就会比较大。但是我们可以选择通过调整 N 值去在variance 跟不精确的 Q 之间取得一个平衡。这里介绍的参数 N 就是一个hyper parameter你要调这个N 到底是多少,你是要多 sample 三步,还是多 sample 五步。
- **彩虹rainbow**将7个技巧/算法综合起来的方法7个技巧分别是——深度Q网络、双深度Q网络、优先级经验回放的双深度Q网络、竞争深度Q网络、异步优势演员-评论员算法A3C、分布式Q函数、噪声网络进而考察每一个技巧的贡献度或者与环境的交互是否是正反馈的。
## 习题
## 3 Something About Interview
**7-1** 为什么传统的深度Q网络的效果并不好可以参考其公式 $Q(s_t ,a_t)=r_t+\max_{a}Q(s_{t+1},a)$ 来描述。
- 高冷的面试官DQN都有哪些变种引入状态奖励的是哪种
因为实际应用时,需要让 $Q(s_t ,a_t)$ 与 $r_t+\max_{a}Q(s_{t+1},a)$ 尽可能相等,即与我们的目标越接近越好。可以发现,目标值很容易一不小心就被设置得太高,因为在计算该目标值的时候,我们实际上在做的事情是看哪一个动作 $a$ 可以得到最大的Q值就把它加上去使其成为我们的目标。
例如现在有4个动作本来它们得到的Q值都是差不多的它们得到的奖励也都是差不多的但是在估算的时候是有误差的。如果第1个动作被高估了那目标就会执行该动作然后就会选这个高估的动作的Q值加上 $r_t$ 当作目标值。如果第4个动作被高估了那目标就会选第4个动作的Q值加上 $r_t$ 当作目标值。所以目标总是会选那个Q值被高估的动作我们也总是会选那个奖励被高估的动作的Q值当作Q值的最大值的结果去加上 $r_t$ 当作新目标值,因此目标值总是太大。
DQN三个经典的变种Double DQN、Dueling DQN、Prioritized Replay Buffer。
**7-2** 在传统的深度Q网络中我们应该怎么解决目标值太大的问题呢
- Double-DQN将动作选择和价值估计分开避免价值过高估计
- Dueling-DQN将Q值分解为状态价值和优势函数得到更多有用信息。
- Prioritized Replay Buffer将经验池中的经验按照优先级进行采样。
我们可以使用双深度Q网络解决这个问题。首先在双深度Q网络里面选动作的Q函数与计算价值的Q函数不同。在深度Q网络中需要穷举所有的动作 $a$,把每一个动作 $a$ 都代入Q函数并计算哪一个动作 $a$ 反馈的Q值最大就把这个Q值加上 $r_t$ 。但是对于双深度Q网络的两个Q网络第一个Q网络决定哪一个动作的Q值最大以此来决定选取的动作。我们的Q值是用 $Q'$ 算出来的这样有什么好处呢为什么这样就可以避免过度估计的问题呢假设我们有两个Q函数如果第一个Q函数高估了它现在选出来的动作 $a$ 的值那没关系只要第二个Q函数 $Q'$ 没有高估这个动作 $a$ 的值,计算得到的就还是正常值。假设反过来是 $Q'$ 高估了某一个动作的值,那也不会产生过度估计的问题
- 简述double DQN原理
**7-3** 请问双深度Q网络中所谓的 $Q$ 与 $Q'$ 两个网络的功能是什么
DQN由于总是选择当前值函数最大的动作值函数来更新当前的动作值函数因此存在着过估计问题估计的值函数大于真实的值函数。为了解耦这两个过程double DQN 使用了两个值网络,一个网络用来执行动作选择,然后用另一个值函数对一个的动作值更新当前网络
在双深度Q网络中存在两个Q网络一个是目标的Q网络一个是真正需要更新的Q网络。具体实现方法是使用需要更新的Q网络选动作然后使用目标的Q网络计算价值。双深度Q网络相较于深度Q网络的更改是最少的它几乎没有增加任何的运算量甚至连新的网络都不需要。唯一要改变的就是在找最佳动作 $a$ 的时候,本来使用 $Q'$ 来计算即用目标的Q网络来计算现在改成用需要更新的Q网络来计算
- 高冷的面试官请问Dueling DQN模型有什么优势呢
**7-4** 如何理解竞争深度Q网络的模型变化带来的好处
答:对于我们的 $Q(s,a)$ 其对应的state由于为table的形式,所以是离散的,而实际中的state不是离散的。对于 $Q(s,a)$ 的计算公式 $Q(s,a)=V(s)+A(s,a)$ 。其中的 $V(s)$ 对于不同的state都有值对于 $A(s,a)$ 对于不同的state都有不同的action对应的值。所以本质上来说,我们最终矩阵 $Q(s,a)$ 的结果是将每一个 $V(s)$ 加到矩阵 $A(s,a)$ 中得到的。从模型的角度考虑,我们的network直接改变的 $Q(s,a)$ 而是改的 $V、A$ 。但是有时我们update时不一定会将 $V(s)$ 和 $Q(s,a)$ 都更新。我们将其分成两个path后我们就不需要将所有的state-action pair都sample一遍我们可以使用更高效的estimate Q value方法将最终的 $Q(s,a)$ 计算出来。
对于 $\mathrm{Q}(s,a)$ 其对应的状态由于为表格的形式,因此是离散的,而实际中的状态却不是离散的。对于 $\mathrm{Q}(s,a)$ 的计算公式—— $\mathrm{Q}(s,a)=\mathrm{V}(s)+\mathrm{A}(s,a)$ 。其中的 $\mathrm{V}(s)$ 对于不同的状态都有值, $\mathrm{A}(s,a)$ 对于不同的状态都有不同的动作对应的值。所以本质上来说,我们最终矩阵 $\mathrm{Q}(s,a)$ 的结果是将每一个 $\mathrm{V}(s)$ 加到矩阵 $\mathrm{A}(s,a)$ 中得到的。从模型的角度考虑,我们的网络直接改变的不是 $\mathrm{Q}(s,a)$ 而是改的 $\mathrm{V}$、$\mathrm{A}$ 。但是有时我们更新时不一定会将 $\mathrm{V}(s)$ 和 $\mathrm{Q}(s,a)$ 都更新。将状态和动作对分成两个部分后,我们就不需要将所有的状态-动作对都采样一遍我们可以使用更高效的估计Q值的方法将最终的 $\mathrm{Q}(s,a)$ 计算出来。
**7-5** 使用蒙特卡洛和时序差分平衡方法的优劣分别有哪些?
优势时序差分方法只采样了一步所以某一步得到的数据是真实值接下来的都是Q值估测出来的。使用蒙特卡洛和时序差分平衡方法采样比较多步如采样$N$步才估测价值,所以估测的部分所造成的影响就会比较小。
劣势:因为智能体的奖励比较多,所以当我们把$N$步的奖励加起来时,对应的方差就会比较大。为了缓解方差大的问题,我们可以通过调整$N$值在方差与不精确的Q值之间取得一个平衡。这里介绍的参数$N$是超参数,需要微调参数 $N$例如是要多采样3步、还是多采样5步。
## 面试题
**7-1** 友善的面试官深度Q网络都有哪些变种引入状态奖励的是哪种
深度Q网络有3个经典的变种双深度Q网络、竞争深度Q网络、优先级双深度Q网络。
1双深度Q网络将动作选择和价值估计分开避免Q值被过高估计。
2竞争深度Q网络将Q值分解为状态价值和优势函数得到更多有用信息。
3优先级双深度Q网络将经验池中的经验按照优先级进行采样。
**7-2** 友善的面试官请简述双深度Q网络原理。
深度Q网络由于总是选择当前最优的动作价值函数来更新当前的动作价值函数因此存在过估计问题估计的价值函数值大于真实的价值函数值。为了解耦这两个过程双深度Q网络使用两个价值网络一个网络用来执行动作选择然后用另一个网络的价值函数对应的动作值更新当前网络。
**7-3** 友善的面试官请问竞争深度Q网络模型有什么优势呢
对于 $\boldsymbol{Q}(s,a)$ 其对应的状态由于为表格的形式因此是离散的而实际的状态大多不是离散的。对于Q值 $\boldsymbol{Q}(s,a)=V(s)+\boldsymbol{A}(s,a)$ 。其中的 $V(s)$ 是对于不同的状态都有值, $\boldsymbol{A}(s,a)$ 对于不同的状态都有不同的动作对应的值。所以本质上,我们最终的矩阵 $\boldsymbol{Q}(s,a)$ 是将每一个 $V(s)$ 加到矩阵 $\boldsymbol{A}(s,a)$ 中得到的。但是有时我们更新时不一定会将 $V(s)$ 和 $\boldsymbol{Q}(s,a)$ 都更新。我们将其分成两个部分后,就不需要将所有的状态-动作对都采样一遍我们可以使用更高效的估计Q值的方法将最终的 $\boldsymbol{Q}(s,a)$ 计算出来。