在前面的文章强化学习DQN算法中,介绍了经典的DQN算法,然而DQN也存在一些问题。Nature DQN与Double DQN的提出就是为了解决这些问题,下面笔者将介绍这个两种改进的算法。
Nature DQN算法
Nature DQN的提出是为了提升原版DQN的收敛速度。在原版DQN中,计算目标Q值的公式
如下:
yj={rjrj+γmaxa′Q(ϕj+1,a′;θ)for terminal ϕj+1for non-terminal ϕj+1
由于在计算目标Q值yj时,使用的是当前要训练的Q网络,而Q网络的更新使用的又是目标Q值yj,两者的相关性太强了,不利于收敛。
为了解决这个问题,Nature DQN提出了一个改进,使用两个Q网络来计算目标Q值。这两个网络的结构一样,但是参数不一样。其中一个网络被称为当前Q网络,主要用来选择动作,并更新模型参数。另一个网络被称为目标Q^网络,仅仅用来计算目标Q值,它的参数θ−是直接从当前Q网络复制而来,且目标Q^网络的参数会比当前Q网络延迟。因此,新的计算目标Q值的公式如下:
yj={rjrj+γmaxa′Q^(ϕj+1,a′;θ−)for terminal ϕj+1for non-terminal ϕj+1
除了目标Q值的计算不一样之外,其他的流程和原版DQN没什么区别。
Nature DQN算法流程
-
初始化一个存储容量为N的记忆池D,同时随机初始化一个当前Q网络,参数为θ,一个目标Q网络,参数为θ−,并令θ−=θ。
-
按以下流程迭代M轮。
-
初始化状态s1为第一个状态x1,并进行处理得到特征向量ϕ(s1)。
-
按以下流程迭代T轮。
-
通过ϵ-greedy算法根据状态st从动作空间中得到动作at,通过Q网络选择动作的公式如下。
at=argamaxQ(ϕ(st),a;θ)
-
执行动作at并观测环境,得到奖励tt以及图片xt+1。
-
设置st+1=st,at,xt+1并对st+1提取特征得到ϕ(st+1)。
-
将状态st+1存储到记忆池D中。
-
随机从记忆池D中选择一组minibatch的记忆(ϕj,aj,rj,ϕj+1),并根据以下公式计算收获:
yj={rjrj+γmaxa′Q^(ϕj+1,a′;θ−)for terminal ϕj+1for non-terminal ϕj+1
-
通过(yj−Q(ϕj,aj;θ))2来计算损失,并通过梯度更新Q网络的参数。
-
每隔C个迭代,更新Q^=Q。
Double DQN算法
Double DQN算法的提出是为了解决Q-learning,DQN包括Nature DQN的一个通病,即过拟合。过拟合发生的原因,是因为在更新Q值时,使用的是greedy算法。以Nature DQN为例,目标Q值的计算公式如下:
yj={rjrj+γmaxa′Q^(ϕj+1,a′;θ−)for terminal ϕj+1for non-terminal ϕj+1
由于每次估计下一个状态s′的Q值时都选择最大的Qmax,因此会导致高估的情况,Qmax不一定是最接近真实的值,对应的动作a′不一定是最佳的动作。如此,就会在每一次迭代中产生一些误差,这些误差不断累积,最终产生了过拟合。
为了解决这个问题,Double DQN提出两个Q网络解耦目标Q值动作的选择和目标Q值的计算这两步,并修改了Q值的计算方式。
Double DQN的两个Q网络和Nature DQN的一致,目标Q值的计算方式如下:
yj={rjrj+γQ^(ϕj+1,argmaxaQ(ϕj+1,a;θ);θ−)for terminal ϕj+1for non-terminal ϕj+1
对于非终结状态的ϕj+1,Q值的计算可以分为一下两个步骤:
-
通过当前Q网络估计在状态ϕj+1下的最大的Q′值对应的动作aj+1,用公式表示如下。
aj=argamaxQ(ϕj+1,a;θ)
-
带入以下公式计算yj。
yj=rj+γQ^(ϕj+1,aj,θ−)
由于动作aj是由当前Q网络估计出的,在一定程度上,更接近最佳的动作,因此对应的Q值也会更接近真实值,从而避免了过高的估计。Double DQN的其他流程和Nature DQN没有什么太大的区别,就不过多介绍了。