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

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 两处写法必须一致。
相关
也可以看看
- ·3 分钟阅读
TimeLimit 不是终止:bootstrap 要看 terminated
用 Gymnasium 的 terminated/truncated 分离重置条件与价值边界,并处理 replay、GAE 和自动重置环境里的最后观测。
- ·16 分钟阅读
约束 MDP 的代价估计偏差:安全层看起来在工作
区分期望约束、条件风险与硬屏蔽,解释代价 critic 偏差如何让可行集虚胖;用约束违反轨迹占比、拉格朗日乘子轨迹和安全层旁路注入验收。
- ·17 分钟阅读
离线强化学习的支持集外动作:为什么 Q 值会自我抬高
从 Bellman backup 的分布外 maximization 解释外推误差;比较行为约束、保守价值与策略正则,并用覆盖率切片与 FQE 交叉验证部署边界。
johan's blog