Double DQN

为什么需要DDQN

DQN使用QFunction拟合QTable,既然是拟合,就会出现和真实QValue不一致的情况。

QFunction迭代更新的方程是一个递归方程

$$ Q^{new}(s, a) = reward + λ*max(Q^{old}(s’, *)) $$

可以看到,更新 s 状态下 a 对应动作的qValue需要用到下一个状态 s’ 所有动作中的最大qValue。但 s’ 的最大qValue也是使用QFunction估计出来的,其估计值很可能偏大(因为你取的就是估计值中最大的值)。这就造成 Q(s, a) 计算出比实际情况更大的qValue,由于这是递归方程,其会使得后面的qValue越来越大,偏离实际情况。

DDQN

一个解决方法是将计算 Q(s, a) 的function与其依赖的 max(Q(s’, *)) 的function解耦,让它们使用不同的function计算,减少两者的相关程度。

打个高考填志愿的比方,如果让你自己估分填志愿(eval_net),你可能会由于主观因素高估或低估自己的分数,这会使得志愿填报的学校偏离实际。但你可以让你的老师给你估分(target_net),因为你的老师常年和你呆在一起,他的估分可能更加客观并且接近实际情况,此时再填志愿就靠谱很多。

所以DDQN的方程可以写为:

$$ Q^{new}(s, a) = reward + λ * Q^{eval}(s’, argmax(Q^{target}(s’, *))) $$

可以看到,方程先是需要通过 target_net 找到 s’ 状态下qValue最大的action(此时也是拟合值),然后使用 eval_net 去计算 s’ 状态下,该action对应的qValue。这样做的好处是 找到 s’ 对应最大qValue值和需要更新的eval_net无关了,相当于定点打靶了

Leave a Comment