强化学习------DDQN算法

本文介绍了DQN算法存在的过度估计问题,以及DoubleDQN(DDQN)算法通过分离动作选择和目标Q值计算来改进这一问题。文章详细解释了DDQN的工作原理,并提供了代码示例对比DQN和DDQN的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

DQN算法

DQN算法有一个显著的问题,就是DQN估计的Q值往往会偏大。这是由于我们Q值是以下一个s’的Q值的最大值来估算的,但下一个state的Q值也是一个估算值,也依赖它的下一个state的Q值…,这就导致了Q值往往会有偏大的的情况出现。
所以出现了对DQN算法的改进算法Double DQN(DDQN)算法。

一、DDQN算法原理

DDQN算法和DQN算法一样,也有一样的两个Q网络结构。在DQN算法的基础上,通过解耦目标Q值动作的选择和目标Q值的计算这两步,来消除过度估计的问题。
在DQN算法中, DQN算法对于非终止状态,其目标Q值的计算式子是:

y t = r t + γ ⋅ max ⁡ a Q ( s t + 1 , a ; w ) {y_t = r_t + \gamma \cdot \max_aQ(s_{t+1},a;w)} yt=rt+γmaxaQ(st+1,a;w)

DDQN算法这里,不再是直接在目标Q网络里面找各个动作中最大Q值,而是先在当前Q网络(Q估计网络)中先找出最大Q值对应的动作(返回动作下标),即:
在这里插入图片描述

然后利用这个选择出来的动作 a m a x ( s ‘ , w ) a_{max}(s^‘,w) amax(sw)在目标网络 (Q Target) 里面去计算目 Target Q
在这里插入图片描述

综合起来 在Double DQN 中的 TD Target 计算为:
在这里插入图片描述
这样我们就可以降低过度估计的问题,因为目标网络的具有最大Q值的动作a,不一定就是当前Q网络中具有最大Q值的动作。

二、代码示例

由上面可知,Double DQN 算法和 DQN 算法唯一不同的地方在于计算Q值的方式。
在原始的 DQN 算法中,使用目标网络(target network)来计算下一个状态的 Q 值。
而在 DDQN 算法中,我们使用在线网络(online network)来选择下一个状态的动作,然后使用目标网络来计算该动作对应的 Q 值,其余流程一样。
这里附上代码的不同之处:

DQN算法:

def learn_batch(self,batch_obs, batch_action, batch_reward, batch_next_obs, batch_done):

        # predict_Q
        pred_Vs = self.pred_func(batch_obs)
        action_onehot = torchUtils.one_hot(batch_action, self.n_act)
        predict_Q = (pred_Vs * action_onehot).sum(1)
        # target_Q
        next_pred_Vs = self.target_func(batch_next_obs)
        best_V = next_pred_Vs.max(1)[0]
        target_Q = batch_reward + (1 - batch_done) * self.gamma * best_V

        # 更新参数
        self.optimizer.zero_grad()
        loss = self.criterion(predict_Q, target_Q)
        loss.backward()
        self.optimizer.step()

DDQN算法:

def learn_batch(self, batch_obs, batch_action, batch_reward, batch_next_obs, batch_done):
    # predict_Q
    pred_Vs = self.pred_func(batch_obs)
    action_onehot = torchUtils.one_hot(batch_action, self.n_act)
    predict_Q = (pred_Vs * action_onehot).sum(1)
    
    # target_Q 
    next_pred_Vs_online = self.pred_func(batch_next_obs)
    next_pred_Vs_target = self.target_func(batch_next_obs)
    best_action_online = next_pred_Vs_online.argmax(1)
    best_V_target = next_pred_Vs_target.gather(1, best_action_online.unsqueeze(1)).squeeze(1)
    target_Q = batch_reward + (1 - batch_done) * self.gamma * best_V_target

    # 更新参数
    self.optimizer.zero_grad()
    loss = self.criterion(predict_Q, target_Q)
    loss.backward()
    self.optimizer.step()
### DDQN (Deep Double Q-Network) 算法概述 DDQN 是 DQN 的改进版本,在解决过估计问题方面表现更优。通过采用两个 Q 网络——在线网络和目标网络,以及利用双价值网络机制,使得决策过程更加稳定和高效[^1]。 #### DDQN 算法的主要特点 - **双重网络架构**:引入了第二个Q网络用于评估动作的价值,这有助于减少传统DQN中存在的过高估值偏差。 - **经验回放机制**:继承自DQN的经验回放技术可以打破数据间的关联性,提高训练效率并防止模型陷入局部最优解。 - **固定的目标网络**:定期更新的目标网络保持相对静态,帮助加速收敛速度。 虽然具体的图形化表示未直接提供,可以根据上述特性构建一个典型的DDQN工作流如下: 1. 初始化随机参数θ, θ' 对应于在线网络和目标网络; 2. 填充经验池D至预设容量N; 3. 开始迭代直到满足终止条件: - 从环境中获取当前状态s_t; - 使用ε-greedy策略选取行动a_t; - 执行选定的动作得到奖励r_{t+1} 和下一时刻的状态 s_{t+1}; - 将四元组(s_t,a_t,r_{t+1},s_{t+1})存入经验库D; - 随机抽取一批样本 minibatch 来计算损失函数L; * 计算TD误差δ= r + γ max_a Q'(s', a; θ') − Q(s, a; θ); 这里Q'代表的是目标网络. - 更新在线网络权重θ以最小化该批次上的平均平方TD误差; 4. 定期同步目标网络的参数θ'=θ. ```mermaid graph TD; A[初始化网络参数θ, θ'] --> B{填充经验池} B --> C[开始循环] C -->|获取状态st| D[采取行动at] D --> E[执行获得rt+1,st+1] E --> F[存储到经验池] F --> G[采样minibatch] G --> H[计算TD error δ] H --> I[更新在线网络θ] J{周期性同步?} --> |是| K[复制θ 到 θ'] J <--|否|C ``` 此流程图展示了如何在一个完整的强化学习框架下实现DDQN算法的核心逻辑[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韭菜盖饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值