https://github.com/a1024053774/RL_Boot/blob/master/Hands-on_Learning_RL/Chapter08/Improved_DQN.ipynb
两个非常著名的算法:Double DQN 和 Dueling DQN
普通的 DQN 算法通常会导致对$Q$值的过高估计(overestimation)。 传统 DQN 优化的 TD 误差目标为 $r + \gamma \max_{a'} Q_{w^-}(s',a')$
$max$操作实际可以被拆解为两部分:
<aside> 💡
当这两部分分开后,就能看出问题所在:
每次得到的都是神经网络当前估算的所有动作价值中的最大值。
考虑到通过神经网络估算的Q值本身在某些时候会产生正向或负向的误差,在 DQN 的更新方式下会倾向选择值过高的动作。
</aside>
<aside> ❓
例如,当有某个$a'$使得$Q(s', a')$有正误差时,而对于所有动作的Q值均为0,
正确的更新目标应该为$r+0=r$
即$Q(s',a') = \epsilon > 0$,此时目标网络输出$Q(s',a')$,而DQN算法却会选择该动作并用该网络的输出值去更新。
但由于神经网络拟合的误差通常会出现某些动作的估算有正误差的情况,存在某个动作$a'$有$Q(s',a') > 0$,此时仍然会选择该动作,但此时$Q(s',a') - Q^*(s',a') = \epsilon$。
此时用 DQN 的更新方式进行更新时,$Q(s, a)$也就会被过高估计了。
对这个$Q(s, a)$来作为更新目标更新时,之前的网络$Q_w$的过高估计又会随着更新逐步累积。对于动作空间较大的任务,DQN 中的过高估计问题会非常严重,造成 DQN 无法有效工作的结果。
</aside>
Double DQN 算法提出利用两个独立的价值网络来估计$max_{a'}Q_*(s',a')$
将原有的$max_{a'}Q_{\omega^-}(s',a')$更改为$Q_{\omega^-}(s',arg \max_{a'}Q_{\omega}(s',a'))$,
🌟利用神经网络$Q_{\omega}$的输出选取价值最大的动作,但在使用该动作的价值时,用另一套神经网络$Q_{\omega^-}$计算该动作的价值。
即使其中一套神经网络的某个动作存在比较严重的过高估计问题,由于另一套神经网络的存在,这个动作最终使用的$Q$值不会存在很大的过高估计问题。
<aside> ❗
在传统的DQN算法中,本来就存在两套$Q$函数的神经网络——目标网络和训练网络,
只不过$max_{a'}Q_{\omega^-}(s',a')$的计算只用到了其中的目标网络,那么恰好可以直接将训练网络作为Double DQN算法中的第一套神经网络来选取动作,将目标网络作为第二套神经网络计算$Q$值,这便是Double DQN的主要思想。
由于在DQN算法中将训练网络的参数记为$\omega$,将目标网络的参数记为$\omega^-$,这与本节中Double DQN的两套神经网络的参数是统一的,因此,我们可以直接写出如下Double DQN的优化目标:
$r+\gamma Q_{\omega^-}\left(s', \underset{a'}{\arg \max} Q_{\omega}\left(s', a'\right)\right)$
</aside>