You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

深度强化学习DQN训练疑问:单样本TD误差如何实现网络参数更新?

关于DQN训练逻辑的解惑

你提到的困惑核心是没抓住DQN的核心优化目标——我们只需要让智能体实际采取的动作对应的Q值符合贝尔曼方程,而非所有动作的Q值都要调整。下面拆解关键逻辑:

1. 为什么只计算选中动作的TD误差?

DQN的本质是学习“动作-价值”的映射,但只有那些被智能体实际执行的动作,才会产生真实的奖励和状态转移,所以我们只需要优化这些动作对应的Q值:

  • q_t_selected是当前网络对每个样本中智能体实际选的动作输出的Q值(64个样本对应64个值,每个值对应一个动作)
  • q_t_selected_target是这个动作的目标价值(用贝尔曼方程计算的r + gamma*maxQ(s',a'))
  • 两者的差就是这个动作的TD误差——我们只关心这个误差,因为其他动作没有被执行,它们的Q值对错不影响当前轨迹的奖励。

2. 网络怎么知道要调整哪些参数?

反向传播的逻辑不是依赖“所有动作的误差”,而是误差会绑定到对应动作的输出神经元:
当你计算q_t_selected的误差时,这个误差信号会沿着网络反向传递,只会调整那些影响该动作Q值输出的参数。其他动作的输出因为没有误差信号,它们对应的参数不会被针对性调整(或者说调整幅度可以忽略)。
举个例子:如果动作空间是4个动作,某个样本选了动作2,那么误差只会作用在动作2对应的输出神经元上,反向传播时网络会自动找到影响动作2输出的权重和偏置进行调整。

3. 取均值为什么不会丢失信息?

这里的reduce_mean是对64个样本的误差取平均,不是把所有动作的误差合并成一个值:

  • 每个样本的误差都参与了均值计算,网络其实是在学习整个批次里所有选中动作的Q值优化,相当于用64个样本的信号共同指导参数更新。
  • 取均值是为了平滑单个样本的噪声,避免单次更新因为个别异常样本产生剧烈震荡,让梯度下降的方向更稳定,这是批量梯度下降的标准操作,反而能提升训练的稳定性,不是丢失信息。

结合代码再梳理

td_error = q_t_selected - tf.stop_gradient(q_t_selected_target) # 仅计算选中动作的TD误差,stop_gradient避免目标网络被更新
errors = U.huber_loss(td_error) # 对每个样本的TD误差计算鲁棒性更强的Huber损失,得到64个损失值
weighted_error = tf.reduce_mean(importance_weights_ph * errors) # 加权后取批次均值,作为优化目标
optimizer.minimize(weighted_error, var_list=q_func_vars) # 仅更新当前Q网络的参数

内容的提问来源于stack exchange,提问作者Haloha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:11:32