Files
easy-rl/docs/chapter7/chapter7_questions&keywords.md
2020-09-08 09:16:25 +08:00

38 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Chapter7 Q-learning-Double 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进而考察每一个方法的贡献度或者是否对于与环境的交互式正反馈的。
## 2 Questions
- 为什么传统的DQN的效果并不好参考公式 $Q(s_t ,a_t)=r_t+\max_{a}Q(s_{t+1},a)$
答:因为实际上在做的时候,是要让左边这个式子跟右边这个 target 越接近越好。比较容易可以发现target 的值很容易一不小心就被设得太高。因为在算这个 target 的时候我们实际上在做的事情是看哪一个a 可以得到最大的Q value就把它加上去就变成我们的target。
举例来说,现在有 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 总是太大。
- 接着上个思考题我们应该怎么解决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 五步。