深度理解DQN算法和DDQN算法

最近在回顾之前学过的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之间的区别啦!!!!!!

### DQN DDQN 的伪代码 #### DQN 算法伪代码 DQN(Deep Q-Network)通过引入经验回放机制目标网络来提高学习稳定性。 ```python Initialize replay memory M to capacity N Initialize action-value function Q with random weights θ Initialize target network Q' with weights θ' ← θ for episode = 1, E do Initialize sequence s_1 = {x_1} and preprocessed sequenced φ_1 = φ(s_1) for t = 1, T do With probability ε select a random action a_t otherwise select a_t = argmax_a Q(φ(s_t),a;θ) Execute action a_t in emulator and observe reward r_t and image x_{t+1} Set s_{t+1} = s_t,a_t,x_{t+1} and preprocess φ_{t+1}=φ(s_{t+1}) Store transition (φ_t,a_t,r_t,φ_{t+1}) in M Sample random minibatch of transitions (φ_j,a_j,r_j,φ_{j+1}) from M Set y_j = r_j for terminal j, r_j + γ max_a' Q'(φ_{j+1},a';θ') for non-terminal j. Perform gradient descent step on (y_j - Q(φ_j,a_j;θ))^2 w.r.t parameters θ Every C steps reset Q' = Q end for end for ``` 此版本的 DQN 使用固定频率更新目标网络权重[^1]。 #### DDQN 算法伪代码 DDQN(Double Deep Q-Network)改进了 DQN 中的目标值估计方法,减少了高估问题的影响。 ```python Initialize replay memory M to capacity N Initialize action-value function Q with random weights θ Initialize target network Q' with weights θ' ← θ for episode = 1, E do Initialize sequence s_1 = {x_1} and preprocessed sequenced φ_1 = φ(s_1) for t = 1, T do With probability ε select a random action a_t otherwise select a_t = argmax_a Q(φ(s_t),a;θ) Execute action a_t in emulator and observe reward r_t and image x_{t+1} Set s_{t+1} = s_t,a_t,x_{t+1} and preprocess φ_{t+1}=φ(s_{t+1}) Store transition (φ_t,a_t,r_t,φ_{t+1}) in M Sample random minibatch of transitions (φ_j,a_j,r_j,φ_{j+1}) from M Set y_j = r_j for terminal j, r_j + γ Q'(φ_{j+1}, argmax_a Q(φ_{j+1},a;θ); θ') for non-terminal j. Perform gradient descent step on (y_j - Q(φ_j,a_j;θ))^2 w.r.t parameters θ Every C steps reset Q' = Q end for end for ``` 在上述两种算法中,主要区别在于如何计算目标 Q 值。DDQN 利用行为网络选择动作而由目标网络评估该动作的价值,从而减少价值函数的过度估计倾向。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值