Q π ( s t , a t ) = r t + γ Q π ( s t + 1 , π ( s t + 1 ) ) Q^\pi(s_t,a_t)=r_t+\gamma Q^\pi(s_{t+1},\pi(s_{t+1})) Qπ(st,at)=rt+γQπ(st+1,π(st+1))
在DQN中,有两个网络:Q网络和目标网络,在优化的过程中其实是希望Q网络的输出尽可能接近目标值(做回归),使得上面的式子成立。这个过程可以表示为:
Q π ( s t , a t ) ← r t + γ Q π − ( s t + 1 , π ( s t + 1 ) ) Q^\pi(s_t,a_t)\leftarrow r_t+\gamma Q_{}^{\pi-}(s_{t+1},\pi(s_{t+1})) Qπ(st,at)←rt+γQπ−(st+1,π(st+1))
Q π ( s t , a t ) Q^\pi(s_t,a_t) Qπ(st,at)为Q网络, Q π − ( s t + 1 , π ( s t + 1 ) ) Q_{}^{\pi-}(s_{t+1},\pi(s_{t+1})) Qπ−(st+1,π(st+1))为目标网络。在训练中,一般固定目标网络,更新Q网络的参数,以寻求更加稳定的训练过程。
经验回放就是将探索到的经验 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)放到一个叫作经验回放池Replay Buffer中。
注意存放的不是片段episode,而且一节一节的经验。
Replay buffer中存储不同策略的经验这对训练有问题吗?
显然Replay Buffer中会不可避免存储不同策略下的经验,但这对于训练其实没有问题的,这与Off-policy也没有关系。因为我们存储的是经验 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1),在状态 s t s_t st采取动作 a t a_t at转移到状态 s t + 1 s_{t+1} st+1,其奖励 r t r_t rt是与策略无关的,所以并不会影响训练。
在算法中,不断的减小 Q π ( s t , a t ) Q^\pi(s_t,a_t) Qπ(st,at)与 r t + γ Q π − ( s t + 1 , π ( s t + 1 ) ) r_t+\gamma Q_{}^{\pi-}(s_{t+1},\pi(s_{t+1})) rt+γQπ−(st+1,π(st+1))的误差。
DQN中存在Q值估计过高的问题,是因为它使用了最大化操作来选择目标值函数的更新动作。
Q π ( s t , a t ) ← r t + γ Q π − ( s t + 1 , π ( s t + 1 ) ) Q π − ( s t + 1 , π ( s t + 1 ) ) → m a x Q^\pi(s_t,a_t)\leftarrow r_t+\gamma Q_{}^{\pi-}(s_{t+1},\pi(s_{t+1}))\\ Q_{}^{\pi-}(s_{t+1},\pi(s_{t+1})) \rightarrow max Qπ(st,at)←rt+γQπ−(st+1,π(st+1))Qπ−(st+1,π(st+1))→max
为了解决这个问题,可以使用Double DQN,它将目标值函数的更新动作和当前值函数的选择动作分开,使用两个不同的网络来估计Q值,从而减少最大化偏差。
DoubleDQN其实并没有新增网络,依然是两个网络,只是网络的分工稍有变换:
所以差别只在于计算状态s’下的Q值时如何选取动作: