Update chapter7_questions&keywords.md
This commit is contained in:
@@ -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 replay,PER)**:这个方法是为了解决我们在第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 比较多step,sample 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值,就把它加上去,使其成为我们的目标。
|
||||
|
||||
答:DQN三个经典的变种:Double DQN、Dueling DQN、Prioritized Replay Buffer。
|
||||
例如,现在有4个动作,本来它们得到的Q值都是差不多的,它们得到的奖励也都是差不多的,但是在估算的时候是有误差的。如果第1个动作被高估了,那目标就会执行该动作,然后就会选这个高估的动作的Q值加上 $r_t$ 当作目标值。如果第4个动作被高估了,那目标就会选第4个动作的Q值加上 $r_t$ 当作目标值。所以目标总是会选那个Q值被高估的动作,我们也总是会选那个奖励被高估的动作的Q值当作Q值的最大值的结果去加上 $r_t$ 当作新目标值,因此目标值总是太大。
|
||||
|
||||
- Double-DQN:将动作选择和价值估计分开,避免价值过高估计。
|
||||
- Dueling-DQN:将Q值分解为状态价值和优势函数,得到更多有用信息。
|
||||
- Prioritized Replay Buffer:将经验池中的经验按照优先级进行采样。
|
||||
**7-2** 在传统的深度Q网络中,我们应该怎么解决目标值太大的问题呢?
|
||||
|
||||
- 简述double DQN原理?
|
||||
我们可以使用双深度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'$ 高估了某一个动作的值,那也不会产生过度估计的问题。
|
||||
|
||||
答:DQN由于总是选择当前值函数最大的动作值函数来更新当前的动作值函数,因此存在着过估计问题(估计的值函数大于真实的值函数)。为了解耦这两个过程,double DQN 使用了两个值网络,一个网络用来执行动作选择,然后用另一个值函数对一个的动作值更新当前网络。
|
||||
**7-3** 请问双深度Q网络中所谓的 $Q$ 与 $Q'$ 两个网络的功能是什么?
|
||||
|
||||
- 高冷的面试官:请问Dueling DQN模型有什么优势呢?
|
||||
在双深度Q网络中存在两个Q网络,一个是目标的Q网络,一个是真正需要更新的Q网络。具体实现方法是使用需要更新的Q网络选动作,然后使用目标的Q网络计算价值。双深度Q网络相较于深度Q网络的更改是最少的,它几乎没有增加任何的运算量,甚至连新的网络都不需要。唯一要改变的就是在找最佳动作 $a$ 的时候,本来使用 $Q'$ 来计算,即用目标的Q网络来计算,现在改成用需要更新的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)$ 计算出来。
|
||||
**7-4** 如何理解竞争深度Q网络的模型变化带来的好处?
|
||||
|
||||
对于 $\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)$ 计算出来。
|
||||
|
||||
Reference in New Issue
Block a user