强化学习笔记(四)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]})

接下来就是计算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

计算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的条件增多了,可以打消一些最大误差的影响!

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值