当前位置:   article > 正文

强化学习笔记(四)DDQN 附代码

ddqn

源代码:点击直达

下面是DQN算法计算Q现实的方法,可以看到,计算下一状态的Q值时,永远选取得是最大值,这样会导致该模型过估计,即估计值过高(本来预测的Q值就有误差,加上max操作后,就把误差扩大了)。在这里插入图片描述
Double DQN就是解决这个问题的,可以看到,他计算Q值时,不是直接选取最大值,而是将估计神经网计算的下一状态的Q值的最大值行为作为现实神经网的行为,从而计算Q值。
在这里插入图片描述
因此,DDQN和DQN主要的区别只是在计算Q现实时!
首先,DQN只需要2个Q值,DDQN需要3个Q值,分别为Q(St+1 , a ; θt) , Q(St+1 , a ; θt^-) , Q(St , a ; θt),实现代码为:

#计算Q(St+1 , a ; θt) , Q(St+1 , a ; θt^-)
q_next, q_eval4next = self.sess.run(
            [self.q_next, self.q_eval],
            feed_dict={self.s_: batch_memory[:, -self.n_features:],    # next observation
                       self.s: batch_memory[:, -self.n_features:]})    # next observation
#计算Q(St , a ; θt)
q_eval = self.sess.run(self.q_eval, {self.s: batch_memory[:, :self.n_features]})

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

接下来就是计算Q现实:

if self.double_q:
	#计算argmax Q(St+1 , a ; θt),即最大Q值的下标
    max_act4next = np.argmax(q_eval4next, axis=1)        # the action that brings the highest value is evaluated by q_eval
    #计算Q(St+1 , argmax Q(St+1 , a ; θt) ; θt ^ - )
    selected_q_next = q_next[batch_index, max_act4next]  # Double DQN, select q_next depending on above actions
else:
    selected_q_next = np.max(q_next, axis=1)    # the natural DQN
#计算Q现实
q_target[batch_index, eval_act_index] = reward + self.gamma * selected_q_next
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

计算Q现实时:
Q_target = r + gamma * Qmax(s’, a’)
该代码涉及的环境中,当棍子直立时获得的奖励为0,越往下奖励越小,最低为-1,正常情况下,在最好的情况下,r = 0 ,Qmax = 0 ,所以Q现实最大也只能为0,但DQN过估计会使得Q现实大于0,下面是两种算法对比图:
在这里插入图片描述
补充:为什么DQN会过估计?为什么DDQN能解决过估计?(均为自己的理解,如有误,请谅解!)
1.为什么DQN会过估计?

首先,在计算Q现实时,选择Qmax作为下一步的回报,这样通常使得Q值偏大。其次,第二个原因,借鉴一个博主的博文:为什么DQN会过估计

2.为什么DDQN能解决过估计?

在这里插入图片描述
从公式可以看出,Q值跟两个神经网络有关,也就是说:只有当老神经网络和新神经网络的最大Q值对应的行为一样时,计算Q现实时才是Qmax,即选择Qmax的条件增多了,可以打消一些最大误差的影响!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/295962
推荐阅读
相关标签
  

闽ICP备14008679号