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