Nature DQN与Double DQN

在前面的文章强化学习DQN算法中,介绍了经典的DQN算法,然而DQN也存在一些问题。Nature DQN与Double DQN的提出就是为了解决这些问题,下面笔者将介绍这个两种改进的算法。

Nature DQN算法

Nature DQN的提出是为了提升原版DQN的收敛速度。在原版DQN中,计算目标Q值的公式

如下:

yj={rjfor terminal ϕj+1rj+γmaxaQ(ϕj+1,a;θ)for non-terminal ϕj+1y_j=\begin{cases}r_j &\text{for terminal }\phi_{j+1} \\r_j+\gamma\max_{a'}Q(\phi_{j+1},a';\theta) &\text{for non-terminal }\phi_{j+1}\end{cases}

由于在计算目标QQyjy_j时,使用的是当前要训练的QQ网络,而QQ网络的更新使用的又是目标QQyjy_j,两者的相关性太强了,不利于收敛。

为了解决这个问题,Nature DQN提出了一个改进,使用两个QQ网络来计算目标QQ值。这两个网络的结构一样,但是参数不一样。其中一个网络被称为当前QQ网络,主要用来选择动作,并更新模型参数。另一个网络被称为目标Q^\hat{Q}网络,仅仅用来计算目标QQ值,它的参数θ\theta^-是直接从当前QQ网络复制而来,且目标Q^\hat{Q}网络的参数会比当前QQ网络延迟。因此,新的计算目标QQ值的公式如下:

yj={rjfor terminal ϕj+1rj+γmaxaQ^(ϕj+1,a;θ)for non-terminal ϕj+1y_j=\begin{cases}r_j &\text{for terminal }\phi_{j+1} \\r_j+\gamma\max_{a'}\hat{Q}(\phi_{j+1},a';\theta^-) &\text{for non-terminal }\phi_{j+1}\end{cases}

除了目标QQ值的计算不一样之外,其他的流程和原版DQN没什么区别。

Nature DQN算法流程

  1. 初始化一个存储容量为NN的记忆池DD,同时随机初始化一个当前QQ网络,参数为θ\theta,一个目标QQ网络,参数为θ\theta^-,并令θ=θ\theta^-=\theta

  2. 按以下流程迭代MM轮。

    1. 初始化状态s1s1为第一个状态x1x1,并进行处理得到特征向量ϕ(s1)\phi(s1)

    2. 按以下流程迭代TT轮。

      1. 通过ϵ\epsilon-greedy算法根据状态sts_t从动作空间中得到动作ata_t,通过QQ网络选择动作的公式如下。

        at=argmaxaQ(ϕ(st),a;θ)a_t=\arg\max_aQ(\phi(s_t),a;\theta)

      2. 执行动作ata_t并观测环境,得到奖励ttt_t以及图片xt+1x_{t+1}

      3. 设置st+1=st,at,xt+1s_{t+1}=s_t,a_t,x_{t+1}并对st+1s_{t+1}提取特征得到ϕ(st+1)\phi(s_{t+1})

      4. 将状态st+1s_{t+1}存储到记忆池DD中。

      5. 随机从记忆池DD中选择一组minibatchminibatch的记忆(ϕj,aj,rj,ϕj+1)(\phi_j,a_j,r_j,\phi_{j+1}),并根据以下公式计算收获:

        yj={rjfor terminal ϕj+1rj+γmaxaQ^(ϕj+1,a;θ)for non-terminal ϕj+1y_j={\begin{cases}r_j &\text{for terminal }\phi_{j+1} \\r_j+\gamma\max_{a'}\hat{Q}(\phi_{j+1,a';\theta^-}) &\text{for non-terminal }\phi_{j+1}\end{cases}}

      6. 通过(yjQ(ϕj,aj;θ))2(y_j-Q(\phi_j,a_j;\theta))^2来计算损失,并通过梯度更新QQ网络的参数。

      7. 每隔CC个迭代,更新Q^=Q\hat{Q}=Q

Double DQN算法

Double DQN算法的提出是为了解决Q-learning,DQN包括Nature DQN的一个通病,即过拟合。过拟合发生的原因,是因为在更新QQ值时,使用的是greedygreedy算法。以Nature DQN为例,目标QQ值的计算公式如下:

yj={rjfor terminal ϕj+1rj+γmaxaQ^(ϕj+1,a;θ)for non-terminal ϕj+1y_j={\begin{cases}r_j &\text{for terminal }\phi_{j+1} \\r_j+\gamma\max_{a'}\hat{Q}(\phi_{j+1,a';\theta^-}) &\text{for non-terminal }\phi_{j+1}\end{cases}}

由于每次估计下一个状态ss'QQ值时都选择最大的QmaxQ_{max},因此会导致高估的情况,QmaxQ_{max}不一定是最接近真实的值,对应的动作aa'不一定是最佳的动作。如此,就会在每一次迭代中产生一些误差,这些误差不断累积,最终产生了过拟合。

为了解决这个问题,Double DQN提出两个QQ网络解耦目标QQ值动作的选择和目标QQ值的计算这两步,并修改了QQ值的计算方式。

Double DQN的两个QQ网络和Nature DQN的一致,目标QQ值的计算方式如下:

yj={rjfor terminal ϕj+1rj+γQ^(ϕj+1,argmaxaQ(ϕj+1,a;θ);θ)for non-terminal ϕj+1y_j={\begin{cases}r_j &\text{for terminal }\phi_{j+1} \\r_j+\gamma\hat{Q}(\phi_{j+1,\arg\max_aQ(\phi_{j+1},a;\theta);\theta^-}) &\text{for non-terminal }\phi_{j+1}\end{cases}}

对于非终结状态的ϕj+1\phi_{j+1}QQ值的计算可以分为一下两个步骤:

  1. 通过当前QQ网络估计在状态ϕj+1\phi_{j+1}下的最大的QQ'值对应的动作aj+1a_{j+1},用公式表示如下。

    aj=argmaxaQ(ϕj+1,a;θ)a_j=\arg\max_aQ(\phi_{j+1},a;\theta)

  2. 带入以下公式计算yjy_j

    yj=rj+γQ^(ϕj+1,aj,θ)y_j=r_j+\gamma\hat{Q}(\phi_{j+1},a_j,\theta^-)

由于动作aja_j是由当前QQ网络估计出的,在一定程度上,更接近最佳的动作,因此对应的QQ值也会更接近真实值,从而避免了过高的估计。Double DQN的其他流程和Nature DQN没有什么太大的区别,就不过多介绍了。

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文作者:bdqfork
  • 本文链接:/articles/49
  • 版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
表情 |预览
快来做第一个评论的人吧~