两个原因:
1.计算TD target时,用到了最大化,造成计算的结果比真实值要大。
2.用高估的结果再去更新自己,在网络中一次次循环过程,该最大化会越来越大,导致高估。
DQN的高估是非均匀的,而这种非均匀的高估是有害的,因为不能选出最优的动作。
DQN的高估是非均匀的,原因如下:
DQN一般从队列中选取一个transition四元组去更新w,而TD target已经是对真实价值的高估,TD算法鼓励DQN的预测接近
,但是
已经是高估的,那么DQN这么做就会把DQN对
的估计值给推高,s和a的二元组每次用来更新DQN,都会导致DQN倾向于高估s和a的价值,s和a的频率在队列中是不平均的,就会导致高估越来越严重。
有两种解决办法:
第一种方法是解决Bootstrapping,就是用一个新的神经网络targrt network(目标网络)来更新target。
第二种方法解决最大化,也是用targrt network(目标网络)但是用法稍有不同,也就是double DQN。
Target Network:
用两个DQN来生成网络,两个DQN结构一样,但是参数不一样。
第一个DQN用来控制agent和收集经验,经验就是四元组。
第二个DQN专门用来计算TD target,这里的参数是,这里不用原来的DQN方案,自己计算TD target,而是用新的网络来计算TD target,缓解了高估问题。
TD算法在Target Network的运用:
用一个四元组来更新第一个DQN的参数w,然后用第二个DQN计算TD target,然后计算TD error,最后用梯度下降来更新第一个DQN的参数w,这里面更新的w全是第一个DQN里面的参数,而第二个DQN只用来计算TD target。
第二个DQN的参数会隔一段时间更新一次,主要有两种方法:
第一种是直接将第一个DQN的参数赋值给。
第二种是将两者加权平均,然后赋值给。
但是即使用了target network,仍然无法避免高估,这里可能会避免Bootstrapping,但是不能解决最大化问题。并且target network会用到DQN的参数,使其无法独立于DQN,所以仍然会导致最大化问题。
Double DQN:
三种方式对比:
1.原始的DQN计算方法:
2.用target network计算方法:
3.用double DQN计算方法:
区别就是double DQN在选择动作时用的是原始DQN的方法和参数,但是在计算TD target时则是用了第一步的动作,但是网络是第二个DQN,参数是。
为什么double DQN更好(虽然仍没彻底解决问题):
总结:
三者之double DQN效果最好(但是仍然没有彻底解决高估问题)。