返回专辑
·Johan·4 分钟阅读

贝尔曼备份:TD 目标从哪来

TD、Q-learning、DP 共用贝尔曼期望方程;backup 目标写错,整个 value 函数会系统性偏。

贝尔曼备份:TD 目标从哪来

1. Critic loss 降了,policy 不动

价值迭代和 Q-learning 看起来公式不同,骨架都是贝尔曼方程。Backup 目标写错——done 混用、next_obs 搞混、terminated/truncated 处理不一致——critic loss 能降但 policy 不动,因为 advantage 和 returns 互相打架。Review 训练代码时我要求 Bellman target 只在一个函数里实现:PPO 的 returns、DQN 的 target_q、自定义 critic 都调它。一处修、另一处忘,表现成 critic loss 降了但 policy 不动。

2. 贝尔曼方程与 TD

状态价值:

动作价值:

TD(0) 用一步采样近似期望,TD error 。Q-learning 的 off-policy 版本用 max 代替期望。表格情况下收敛有保证;换成神经网络后进入函数近似 regime,收敛性不再自动成立。表格 Bellman 迭代能收敛,是因为折扣因子小于一时 Bellman operator 是 contraction;神经网络换掉了收缩保证。

3. 实现契约

done 标志决定是否在 backup 里乘折扣因子。Gymnasium 区分 terminated 和 truncated:真终止处下一状态价值应为零;timeout 是否 bootstrap 要和 PPO/SAC 的 value target 一致。Target network(硬更新或 soft update)让 backup 目标相对稳定。CleanRL PPO 里 value loss 是价值估计与回报之差的平方,回报来自 GAE 或 n-step return。若 backup target 和 value loss 用的 done 掩码不一致,会出现 advantage 和 returns 互相打架。

4. Deadly triad 与补丁

函数近似 + off-policy + bootstrapping 构成 deadly triad,Q 值可能发散或振荡。才有 target network、Double Q 等补丁。Reward scale 太大时,一步 TD target 跳变剧烈,critic 拟合困难。N-step return 可看成 GAE 的离散版兄弟:多步真实 reward 再 bootstrap。统一写 compute_returns,PPO 和自定义 AC 共用,避免 terminated/truncated 一处修、另一处忘。若 next_obs 和 obs 搞混(例如用了未 reset 的 obs),backup 完全错误但代码仍能跑。

5. 案例:terminated 混用

某次 PPO 实验,一处用 done 清零 bootstrap,另一处 SB3 默认对 truncated 仍 bootstrap,critic loss 降了但 policy 不动。统一 bootstrap 逻辑后,policy 才开始更新。固定小 MDP 打印 TD target 与 V(s) 是否单调改善。Q 均值持续上升且无上限时,先查 reward scale 和 done 处理。SB3 的 explained_variance 低说明 critic 没跟上 backup 目标。Code review 时我要求 bootstrap 逻辑只有一份来源。

6. 与 GAE 和 n-step

n-step return 可以看成 GAE 的离散版兄弟:多步真实 reward 再 bootstrap。Q-learning 的 one-step 最省算力但偏差大。Target update 频率与 config 一致。terminated 和 truncated 的 bootstrap 掩码若在两处写法不同,advantage 和 value target 会互相打架。理解 backup 从哪来,才知道该修哪一层。

若 next_obs 和 obs 搞混(例如用了未 reset 的 obs),backup 完全错误但代码仍能跑。SB3 的 explained_variance 低说明 critic 没跟上 backup 目标。Q-learning 的 one-step 最省算力但偏差大。统一写 compute_returns,PPO 和自定义 AC 共用。表格 Bellman 迭代能收敛是因为 gamma 小于一时 Bellman operator 是 contraction;神经网络换掉了收缩保证。

7. 代码审查时的单一来源原则

审查训练代码时我要求贝尔曼目标只在一个函数里实现:近端策略优化的回报、深度 Q 网络的目标 Q、自定义 critic 都调它。终止与截断的 bootstrap 掩码若在两处写法不同,优势与价值目标会互相打架,表现成 critic 损失降了但策略不动。表格贝尔曼迭代能收敛是因为折扣因子小于一时算子收缩;神经网络换掉了收缩保证,才有目标网络、双重 Q 等补丁。奖励尺度过大时一步目标跳变剧烈,critic 拟合困难——先查 reward scale 和 done 处理,再查目标更新频率。

8. 验收

  • 固定小 MDP 打印 TD target 与 V(s) 是否单调改善。
  • Q 均值持续上升且无上限时,先查 reward scale 和 done 处理。
  • Bootstrap 逻辑只有一份来源,terminated/truncated 两处写法一致。
  • Target update 频率与 config 一致。
  • explained_variance 低说明 critic 没跟上 backup 目标。

Backup 是 value 函数的 DNA。写错一处,整个 critic 系统性偏——理解 backup 从哪来,才知道该修哪一层。Code review 时 bootstrap 逻辑只有一份来源,terminated 与 truncated 两处写法必须一致。

相关

也可以看看

← 全部文章

johan's blog