深度强化学习 | 详解过估计现象与Double DQN算法(附Pytorch实现)

目录

  • 0 专栏介绍
  • 1 过估计现象案例说明
  • 2 双深度Q网络原理
  • 3 Pytorch算法实现

0 专栏介绍

本专栏以贝尔曼最优方程等数学原理为根基,结合PyTorch框架逐层拆解DRL的核心算法(如DQN、PPO、SAC)逻辑。针对机器人运动规划场景,深入探讨如何将DRL与路径规划、动态避障等任务结合,包含仿真环境搭建、状态空间设计、奖励函数工程化调优等技术细节,旨在帮助读者掌握深度强化学习技术在机器人运动规划中的实战应用

🚀详情:《运动规划实战精讲:深度强化学习篇》


1 过估计现象案例说明

无论Q-Learning还是DQN都存在**过估计(overestimation)**现象,过估计会导致智能体倾向于选择被高估的动作,可能陷入局部最优策略,降低学习效率和最终性能。例如,在复杂环境中,智能体可能反复选择某个次优动作,而忽略真正的高回报动作。

用一个案例说明,如图所示,其中有两个非终止状态 A A A和 B B B、两个终止状态 T T T。现以 A A A为初始状态,有两个选择

  1. 选择向右,转移到终止态 T T T并获得0奖赏值;
  2. 选择向左,转移到状态 B B B并获得0奖赏值。对于状态 B B B而言存在若干动作,所有动作都会转移到终止状态,而每个动作的奖赏值服从高斯分布 N ( − 0.1 , 1 ) \mathcal{N} \left( -0.1,1 \right) N(−0.1,1)

首先计算 Q ( A , a ) Q\left( A,a \right) Q(A,a)的真实值,根据定义可得

{ Q ( A , l e f t ) = 0 + γ E [ Q ( B , a ) ] = − 0.1 γ < 0 Q ( A , r i g h t ) = 0 \begin{cases} Q\left( A, \mathrm{left} \right) =0+\gamma \mathbb{E} \left[ Q\left( B, a \right) \right] =-0.1\gamma <0\\ Q\left( A, \mathrm{right} \right) =0\\\end{cases} {Q(A,left)=0+γE[Q(B,a)]=−0.1γ<0Q(A,right)=0

所以对智能体而言,在状态 A A A处的最佳决策是选择向右走。但是因为噪声的存在------本例中体现为奖励分布的方差,某次探索时 Q ( B , a ) > 0 Q\left( B, a \right) >0 Q(B,a)>0,根据Q-Learning算法,此时

Q ( A , l e f t ) = 0 + max ⁡ a Q ( B , a ) > 0 Q\left( A, \mathrm{left} \right) =0+\max _aQ\left( B, a \right) >0 Q(A,left)=0+amaxQ(B,a)>0

于是智能体在前期更倾向于选择向左走。

导致这个现象的原因是Q-Learning系列算法取最大值 max ⁡ \max max的操作太激进:在时序差分方法更新 Q Q Q值时,理论上希望计算 s ′ s' s′状态下所有动作 a ′ ∈ A a'\in A a′∈A回报的期望 E [ Q ( s ′ , a ′ ) ] \mathbb{E} \left[ Q\left( s',a' \right) \right] E[Q(s′,a′)],再从中挑选最优值作为当前状态 E [ Q ( s , a ) ] \mathbb{E} \left[ Q\left( s,a \right) \right] E[Q(s,a)]的优化方向;然而Q-Learning中简单地将 max ⁡ a ′ E [ Q ( s ′ , a ′ ) ] \max _{a'}\mathbb{E} \left[ Q\left( s',a' \right) \right] maxa′E[Q(s′,a′)]视为 E [ max ⁡ a ′ Q ( s ′ , a ′ ) ] \mathbb{E} \left[ \max _{a'}Q\left( s',a' \right) \right] E[maxa′Q(s′,a′)],根据

E [ max ⁡ ( X ) ] ⩾ max ⁡ E [ X ] \mathbb{E} \left[ \max \left( X \right) \right] \geqslant \max \mathbb{E} \left[ X \right] E[max(X)]⩾maxE[X]

可知:受非均匀噪声的影响,Q-Learning总是过高地估计回报 Q Q Q,产生正向偏差

Δ = E [ max ⁡ a ′ Q ( s ′ , a ′ ) ] − max ⁡ a ′ E [ Q ( s ′ , a ′ ) ] ⩾ 0 \varDelta =\mathbb{E} \left[ \max _{a'}Q\left( s',a' \right) \right] -\max _{a'}\mathbb{E} \left[ Q\left( s',a' \right) \right] \geqslant 0 Δ=E[a′maxQ(s′,a′)]−a′maxE[Q(s′,a′)]⩾0

称为最大化偏差(maximum bias),从而导致智能体误将次优动作作为最优动作,影响算法收敛,甚至无法得到最优策略

如下图所示,当噪声为零时,Q-Learning算法不存在最大化偏差

如下图所示,当存在噪声时,Q-Learning算法在搜索前期会被 max ⁡ a Q ( B , a ) \max _aQ\left( B, a \right) maxaQ(B,a)误导选择错误的策略。直观地, Q ( A , l e f t ) Q\left( A, \mathrm{left} \right) Q(A,left)与 max ⁡ a Q ( B , a ) \max _aQ\left( B, a \right) maxaQ(B,a)近似同分布,但因为最大化偏差, max ⁡ a Q ( B , a ) \max _aQ\left( B, a \right) maxaQ(B,a)并不能表示真实的 Q ( A , l e f t ) Q\left( A, \mathrm{left} \right) Q(A,left)。

2 双深度Q网络原理

缓解最大化偏差的方法之一是互监督机制,典型算法是双深度Q网络(Double DQN, DDQN),该方法令

y i = { r i    , s ′ 是最后一个状态 r i + γ Q ^ ( s ′ , max ⁡ a ( Q ( s ′ , a ; θ ) ) ; θ ^ ) , s ′ 不是最后一个状态 y_i=\begin{cases} r_i\,\, , s'\text{是最后一个状态}\\ r_i+\gamma \hat{Q}\left( \boldsymbol{s}',\max _{\boldsymbol{a}}\left( Q\left( \boldsymbol{s}',\boldsymbol{a};\boldsymbol{\theta } \right) \right) ;\boldsymbol{\hat{\theta}} \right) , s'\text{不是最后一个状态}\\\end{cases} yi={ri,s′是最后一个状态ri+γQ^(s′,maxa(Q(s′,a;θ));θ^),s′不是最后一个状态

其余步骤与DQN算法相同,此时 Q Q Q称为动作选择网络, Q ^ \hat{Q} Q^称为价值评估网络。直观上

Q ^ ( s ′ , a r g max ⁡ a ′ ( Q ( s ′ , a ′ ; θ ) ) ; θ ^ ) ⩽ max ⁡ a ′ ∈ A Q ^ ( s ′ , a ′ ; θ − ) \hat{Q}\left( \boldsymbol{s}',\mathrm{arg}\max _{\boldsymbol{a}'}\left( Q\left( \boldsymbol{s}',\boldsymbol{a}';\boldsymbol{\theta } \right) \right) ;\boldsymbol{\hat{\theta}} \right) \leqslant \max _{\boldsymbol{a}'\in A}\hat{Q}\left( \boldsymbol{s}',\boldsymbol{a}';\boldsymbol{\theta }^- \right) Q^(s′,arga′max(Q(s′,a′;θ));θ^)⩽a′∈AmaxQ^(s′,a′;θ−)

即使 Q Q Q值最大的动作不一定使 Q ^ \hat{Q} Q^最大,而 Q Q Q与 Q ^ \hat{Q} Q^基于不同训练样本( Q ^ \hat{Q} Q^滞后于 Q Q Q),因此它们同时高估一个动作的概率很小,从而减小最大化偏差。理论上DDQN实现了对 Q Q Q的无偏估计

如下图所示是DDQN和DQN在一些常见强化学习任务上的过估计现象对比,可以看到DDQN算法很好地缓解了过估计现象

3 Pytorch算法实现

我们首先回顾一下DQN算法计算期望 Q ( s , a ) Q(s,a) Q(s,a)的过程

python 复制代码
curr_Q = self.model(states).gather(1, actions.unsqueeze(1)).squeeze(1)
next_Q = self.target_model(next_states)
next_Q = torch.max(next_Q, 1)[0]
expected_Q = rewards.squeeze(1) + self.gamma * next_Q * dones

DDQN核心的改进就在于对next_Q变量的计算

python 复制代码
curr_Q = self.model.forward(states).gather(1, actions.unsqueeze(1)).squeeze(1)
next_a = torch.argmax(self.model.forward(next_states), dim=1)
next_Q = self.target_model.forward(next_states).gather(1, next_a.unsqueeze(1)).squeeze(1)
expected_Q = rewards.squeeze(1) + self.gamma * next_Q * dones

其他流程与DQN相同,因此直接继承自DQN即可

python 复制代码
class DoubleDQNAgent(DQNAgent):
    '''
    * @breif: 双深度Q网络智能体
    '''
    def __init__(self, env, learning_rate=0.0003, reward_decay=0.99, e_greedy=[0.0, 0.99, 5e-4],
                 tau=0.005, buffer_size=10000):
        super().__init__(env, learning_rate, reward_decay, e_greedy, tau, buffer_size)

    '''
    * @breif: 计算一个batch的损失
    '''    
    def computeLoss(self, batch):
        states, actions, rewards, next_states, dones = batch
        states = torch.FloatTensor(states).to(self.device)
        actions = torch.LongTensor(actions).to(self.device)
        rewards = torch.FloatTensor(rewards).to(self.device)
        next_states = torch.FloatTensor(next_states).to(self.device)
        dones = (1 - torch.FloatTensor(dones)).to(self.device)

        curr_Q = self.model.forward(states).gather(1, actions.unsqueeze(1)).squeeze(1)
        next_a = torch.argmax(self.model.forward(next_states), dim=1)
        next_Q = self.target_model.forward(next_states).gather(1, next_a.unsqueeze(1)).squeeze(1)
        expected_Q = rewards.squeeze(1) + self.gamma * next_Q * dones

        loss = self.criterion(curr_Q, expected_Q)
        return loss

将DDQN运用到CartPole-v1任务上,奖励函数曲线如下所示

效果如下所示

完整代码联系下方博主名片获取


🔥 更多精彩专栏

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

相关推荐
秦南北15 分钟前
国内领先的宠物类电商代运营公司品融电商
大数据·人工智能·电商
龚大龙29 分钟前
机器学习(李宏毅)——Domain Adaptation
人工智能·机器学习
源码姑娘36 分钟前
基于DeepSeek的智慧医药系统(源码+部署教程)
java·人工智能·程序人生·毕业设计·springboot·健康医疗·课程设计
AIGC_ZY37 分钟前
扩散模型中三种加入条件的方式:Vanilla Guidance,Classifier Guidance 以及 Classifier-Free Guidance
深度学习·机器学习·计算机视觉
☞黑心萝卜三条杠☜1 小时前
后门攻击仓库 backdoor attack
论文阅读·人工智能
三三木木七2 小时前
BERT、T5、GPTs,Llama
人工智能·深度学习·bert
problc2 小时前
Manus AI 全球首款通用型 Agent,中国制造
大数据·人工智能·制造
xiangzhihong82 小时前
GitHub神秘组织3小时极速复刻Manus
人工智能·深度学习·机器学习
博云技术社区2 小时前
DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元
人工智能·博云·deepseek
ZHOU_WUYI3 小时前
Process-based Self-Rewarding Language Models 论文简介
人工智能·深度学习