1 DQN的问题
在DQN 笔记 State-action Value Function(Q-function)_UQI-LIUWJ的博客-CSDN博客 中,我们知道DQN的学习目标是
但是,这个Q的值是被“高估”了的。因为每一次策略Π更新的时候,Π(s)都取的是最大的那个action,也即
然而,实际网络环境中,由于每个状态都有一定的概率取不同的动作(policy-based network),所以实际的【reward小的那些action会“向下”拉低一些Q值】,也就是说,我们回归的目标值是“高估”了的
这是double-DQN paper里的图,可以形象地说明这个“高估”
这边有 4 个不同的小游戏,横轴是训练的时间,红色锯齿状一直在变的线就是 Q-function 对不同的状态估计出来的平均 Q 值。有很多不同的状态,每个状态都 sample 一下,然后算它们的 Q 值,把它们平均起来,得到这条红色锯齿状Q-function。
这条红色锯齿状的线在训练的过程中会改变,但它是不断上升的。因为 Q-function 是取决于你的策略的。学习的过程中你的策略越来越强,你得到的 Q 值会越来越大。在同一个状态, 你得到 reward 的期望会越来越大,所以一般而言,这个值都是上升的,但这是 Q-network 估测出来的值。【所以为啥Alien那里会下降,我就不得而知了】
接下来真的去玩那个游戏,玩很多次。然后真的去算,在某一个状态, 你会得到的 Q 值到底有多少。(红色直线)
你会发现估测出来的值远比实际的值大,在每一个游戏都是这样,都大很多。这就是“高估”的效果
就着这个图我们再看一下double DQN的效果。
蓝色的锯齿状的线是 Double DQN 的 Q-network 所估测出来的 Q 值。
蓝色的无锯齿状的线是真正的 Q 值,你会发现它们是比较接近的。
2 double DQN的原理
2.1 大体思想
在 Double DQN 里面,选动作的 Q-function 跟算值的 Q-function 不是同一个。
在原来的 DQN 里面,你穷举所有的 a,把每一个 a 都带进去, 看哪一个 a 可以给你的 Q 值最高,那你就把那个 Q 值加上 rt。但是在 Double DQN 里面,你有两个 Q-network:
- 第一个 Q-network Q 决定哪一个动作的 Q 值最大(你把所有的 a 带入 Q 中,看看哪一个 Q 值最大)。
- 你决定你的动作以后,你的 Q 值(也就是回归的目标值)是用 Q′ 算出来的。
所以:
- 假设第一个 Q-function 高估了它现在选出来的动作 a,只要第二个 Q-function Q′ 没有高估这个动作 a 的值,那你算出来的就还是正常的值。
- 假设 Q′ 高估了某一个动作的值,那也没差,因为只要前面这个 Q 不要选那个动作出来就没事了,这个就是 Double DQN 神奇的地方。
2.2 Q 和Q'的选取
使用DQN 笔记 State-action Value Function(Q-function)_UQI-LIUWJ的博客-CSDN博客 第三小节说的target network
在实现上,你有两个 Q-network:目标的 Q-network 和你会更新的 Q-network。
所以在 Double DQN 里面,你会拿你会更新参数的那个 Q-network 去选动作,然后你拿目标网络(固定住不动的网络)去算值。
Double DQN 相较于原来的 DQN 的更改是最少的,它几乎没有增加任何的运算量,连新的网络都不用,因为原来就有两个网络了。你唯一要做的事情只有,本来你在找 Q 值最大的 a 的时候,你是用fixed的 Q′ (目标网络) 来算【也就是说,我原来更新和找最大的a都是用Q’来求得的】。现在改成用另外一个会更新的 Q-network 来算最大的a,只用Q'来更新Q-function。