赞
踩
源代码:点击直达
下面是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的条件增多了,可以打消一些最大误差的影响!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。