最近在回顾之前学过的DQN算法,对算法的超参数更新和算法的处理过程还是有些模糊的地方,所以今天花点时间把弄清楚!
首先,详细说一下DQN这个算法:
DQN算法是有两个价值网络组成的,一个是当前价值网络Qw(s,a),另一个是目标价值网络Qw-(s,a),这两个神经网络的超参数一开始的一样,但在运行时会不断的覆盖和更新,下面我们来具体分析算法运行的每一步:
1、首先 将两个价值网络的超参数w和w-初始化成一样的;
2、接下来进入训练过程:
1、根据当前网络Qw(s,a),采用贪恋算法,每次选择Q值最大的动作 at 进行移动;
2、执行动作 at 后,获得了回报 rt ,环境状态变为 st+1;
3、将元组(st , at , rt, st+1),存储在缓冲队列中;(一定要分清楚,我们是在 st 的状态下采取了 at 的动作,变成了一个新状态 st+1,得到的奖励是 rt )
4、当缓存队列中的数据足够多时,我们开始对其中的数据进行采样,取出N个元组来;
5、对每一个数据,使用目标网络计算 yi = ri + maxQw-(si+1,a);(这里算的是当前所处状态下的奖励ri,➕si+1状态下在Qw-这个网络下的最大价值的动作,第一步si到si+1是智能体实际走出来的,但是后面在si+1状态下执行的a动作是智能体试探的,其实他并没有走出这一步,这也是后面我们,不断迭代网络超参数的关键所在,什么时候智能体走一步的价值等于其走一步➕预测一步的价值时,说明网络已经差不多更新好了)
6、用TD算法,建立损失函数:L=1/n 求和(yi - Qw(s,a))平方;
7、每C步更新一下,目标网络的超参数,其实很简单就是简单的复制w就可以了!
综上,我们的目的很简单,希望求得一个价值网络可以指导智能体去在环境中做出最有价值的动作A,当智能体走一步的价值=走一步价值➕下一步预测价值的时候,得到的网络就是我们需要的价值网络Q了;
接下来介绍一下DDQN算法:
问题一:首先,第一个问题是,为什么会有DDQN这个算法呢?是DQN不好吗?
答:肯定是DQN算法有缺点啦,因为普通的DQN算法通常会导致对Q值的高估,原因也很简单,比如说:我们考虑一个特殊的场景:在状态 s' 下所有的动作的Q值都是0,此时价值为 r+0 ,但是由于神经网络拟合的误差通常会出现某些动作的估计有正误差的情况,通俗的来说就是,可能会误认为有一个动作价值他不为0的,实际上他是0,这就导致了我们对这个一个状态的动作价值做出了高估的结果,因为你如果这个状态的Q值高估了,下一个状态的Q值也会高估,他们是连串的 r + Qw-(si+1,a)的嘛!所以会导致一连串的对Q值高估的问题,,,这是非常严重的一个情况,会导致我们DQN算法无法工作的现象发生。
问题二:如何解决?
我们可以把DQN的第五步中的 yi = ri + maxQw-(si+1,a) 中的maxQw-(si+1,a)部分更改为maxQw-(si+1,argmaxQw(si+1,ai+1)), 其实就是将原来的下一步动作由目标网络选取最佳动作换成了由当前网络选取最佳的动作,为什么这样就可以减小高估问题呢?因为你要清楚目标网络的超参数更新是比当前网络要慢的,如果以前高估了,还用以前高估的网络做动作的选择任然会高估,但是如果我们用新网络做出动作的选择可能就会一步一步减小这个高估的影响!
现在终于彻底明白了,DQN 和 DDQN之间的区别啦!!!!!!