在前面的文章强化学习DQN算法中,介绍了经典的DQN算法,然而DQN也存在一些问题。Nature DQN与Double DQN的提出就是为了解决这些问题,下面笔者将介绍这个两种改进的算法。
Nature DQN算法
Nature DQN的提出是为了提升原版DQN的收敛速度。在原版DQN中,计算目标Q值的公式
如下:
由于在计算目标 值 时,使用的是当前要训练的 网络,而 网络的更新使用的又是目标 值 ,两者的相关性太强了,不利于收敛。
为了解决这个问题,Nature DQN提出了一个改进,使用两个 网络来计算目标 值。这两个网络的结构一样,但是参数不一样。其中一个网络被称为当前 网络,主要用来选择动作,并更新模型参数。另一个网络被称为目标 网络,仅仅用来计算目标 值,它的参数 是直接从当前 网络复制而来,且目标 网络的参数会比当前 网络延迟。因此,新的计算目标 值的公式如下:
除了目标 值的计算不一样之外,其他的流程和原版DQN没什么区别。
Nature DQN算法流程
![](https://i-blog.csdnimg.cn/blog_migrate/5ab893ba795470f24f1056140b872b78.png)
初始化一个存储容量为 的记忆池 ,同时随机初始化一个当前 网络,参数为 ,一个目标 网络,参数为 ,并令 。
按以下流程迭代 轮。
通过 -greedy算法根据状态 从动作空间中得到动作 ,通过 网络选择动作的公式如下。
执行动作 并观测环境,得到奖励 以及图片 。
设置 并对 提取特征得到 。
将状态 存储到记忆池 中。
随机从记忆池 中选择一组 的记忆 ,并根据以下公式计算收获:
通过 来计算损失,并通过梯度更新 网络的参数。
每隔 个迭代,更新 。
初始化状态 为第一个状态 ,并进行处理得到特征向量 。
按以下流程迭代 轮。
Double DQN算法
Double DQN算法的提出是为了解决Q-learning,DQN包括Nature DQN的一个通病,即过拟合。过拟合发生的原因,是因为在更新 值时,使用的是 算法。以Nature DQN为例,目标 值的计算公式如下:
由于每次估计下一个状态 的 值时都选择最大的 ,因此会导致高估的情况, 不一定是最接近真实的值,对应的动作 不一定是最佳的动作。如此,就会在每一次迭代中产生一些误差,这些误差不断累积,最终产生了过拟合。
为了解决这个问题,Double DQN提出两个 网络解耦目标 值动作的选择和目标 值的计算这两步,并修改了 值的计算方式。
Double DQN的两个 网络和Nature DQN的一致,目标 值的计算方式如下:
对于非终结状态的 , 值的计算可以分为一下两个步骤:
通过当前 网络估计在状态 下的最大的 值对应的动作 ,用公式表示如下。
带入以下公式计算 。
由于动作 是由当前 网络估计出的,在一定程度上,更接近最佳的动作,因此对应的 值也会更接近真实值,从而避免了过高的估计。Double DQN的其他流程和Nature DQN没有什么太大的区别,就不过多介绍了。
关注【Java与Android技术栈】
更多精彩内容请关注: