经验回放:打破样本相关
Replay buffer 让 off-policy 算法复用旧数据;容量、采样方式和 n-step 目标影响稳定性。

1. 连续帧训练,Q 学不动
深度 Q 网络每步与环境交互得到状态、动作、奖励、下一状态、终止标志,若不打破时序相关,相邻帧高度相似,小批量梯度有偏。经验回放缓冲区均匀随机采样,同一条转移可多次使用——这是离策略样本效率的根基。缓冲区未满就开始训练,早期样本高度偏,Q 在少数状态上过拟合。简单环境均匀回放足够;Atari 大缓冲加优先回放常见。
2. Bellman 目标与 buffer 契约
Bellman 目标(无 Double DQN 时):
默认容量十万到百万;太小多样性不足,太大则旧策略数据占比过高(离策略滞后)。自己写 buffer 时注意终止标志存布尔,采样时下一观测在真终止时可以是任意占位——目标不 bootstrap。环形缓冲满后覆盖最旧数据。终止为真时目标应只剩即时奖励。
3. 优先经验回放与 n 步回报
优先经验回放:按时序差分误差大小采样,控制优先程度与重要性采样校正。先均匀回放跑通再加优先回放。若损失突然降但评估不变,可能是优先回放过度重复采样高误差样本,把 Q 拉向少数转移的噪声。n 步回报:用未来 n 步真实奖励加 bootstrap,n 等于三常见,减偏差增方差。n 步和优先回放叠加时超参更多,我习惯逐项加。操作任务若示范混合进 buffer,要注意采样比例,否则离策略算法被示范锁死。
4. 工程细节
Atari 还要处理 life loss 和 true game over 的区别。帧堆叠时观测已是堆叠向量,buffer 体积比单帧大 k 倍,容量要按实际字节算。内存估算:容量乘观测动作大小再乘字节数;Atari 大 buffer 占内存,笔记本上先降容量跑通流水线。我习惯 log buffer 占用比例和平均 TD loss。环形缓冲的位置指针、满标志要单测:未满时采样只在有效区间,满了才均匀全 buffer。
5. 案例:PER 过度采样
某 Atari 任务,开优先回放后 TD loss 骤降,eval 不变。查 log 发现少数高 TD transition 被反复采样,Q 被拉向噪声。降优先程度或回 uniform 后 eval 才上来。Frame stack 时 obs 已是 stack 向量,buffer 体积比单帧大 k 倍,capacity 要按实际字节算。Target network 更新太慢 Q 滞后,太快则不稳定。
6. 与 target network 和 done
Target network 更新频率与 config 一致。Atari frame skip 存的 transition 与 raw frame 不混。对比 buffer size 十万 vs 百万的 sample efficiency。Q 均值、TD loss、探索率曲线无异常发散。Buffer 未满时不应开始训练,或 learning_starts 设足够大。Ring buffer 的 pos 指针、full 标志要单测。
7. 与 Atari 和 frame skip 的特殊性
Atari 环境里每条转移对应多帧跳帧后的结果,缓冲区里存的观测已是跳帧后的状态,不要与原始单帧混用。生命损失与真正游戏结束在 Atari 里要区分,否则 bootstrap 目标会在错误边界清零。笔记本内存有限时,先用较小容量跑通整条训练流水线,再按实际字节估算扩容。经验回放不是「越大越好」——太大则旧策略数据占比过高,当前策略已在分布外推。
8. 验收
- Buffer 未满时不应开始训练,或 learning_starts 设足够大。
- done 为 True 时 target 不 bootstrap。
- Q 均值、TD loss、ε 曲线无异常发散。
- PER 开启时 eval 与 loss 背离要查采样偏置。
- Frame stack 与 buffer 容量按实际字节估算。
Replay 是离策略的数据契约。容量、采样方式、n-step 写错,Q 会在旧分布上过拟合或学不动。
相关
也可以看看
- ·4 分钟阅读
Double DQN:减轻 max 过估计
标准 DQN 用 target 网在 \(s'\) 上 argmax 再取值,系统性高估;Double DQN 用 online 网选动作、target 网估值。
- ·4 分钟阅读
探索:ε-greedy 之外还有什么
高维连续空间里纯 ε-greedy 不够;entropy bonus、OU 噪声和 count-based 各适不同场景,探索不足表现为早收敛到次优。
- ·16 分钟阅读
约束 MDP 的代价估计偏差:安全层看起来在工作
区分期望约束、条件风险与硬屏蔽,解释代价 critic 偏差如何让可行集虚胖;用约束违反轨迹占比、拉格朗日乘子轨迹和安全层旁路注入验收。
johan's blog