CQL / CQL_NB

这一组方法属于更典型的离线强化学习算法:不仅学策略,还学 Q 值,并通过保守约束减少“离线数据外动作”的高估问题。

选择算法对

小白先看

可以把 CQL 理解成“学动作之前,先更谨慎地评价动作值不值”。CQL_NB 则是在这个基础上进一步增强训练稳定性。

CQL:学习 actor 和双 critic,并给 critic 加保守约束。

CQL_NB:在 CQL 上加入更多动作参与 penalty,并引入类似 TD3 的 target smoothing。

比 BC 更复杂,但更接近真正的离线强化学习方法。

方法流程

  1. 读取包含 state、action、reward、next_state、done 的完整 transition 数据。
  2. 划分训练集与验证集。
  3. 计算状态标准化参数和 reward 统计量。
  4. 构建 actor、critic1、critic2 及 target critics。
  5. 更新 critic,并加上 CQL penalty。
  6. 更新 actor,并用 BC 项辅助训练。
  7. 保存最佳模型、日志和曲线图。

核心设计

数据处理

通俗理解:
CQL 不只看“当前应该做什么动作”,还要看“做完这个动作后会到哪里、能拿多少奖励”。所以它需要一整条状态转移记录。

技术对应:
两者都使用完整 transition:observations、actions、rewards、next_observations、terminals,用它们构造 TD target 和 critic 训练样本。

网络结构

通俗理解:
actor 像做动作的学生,critic 像评分老师。两个 critic 相当于两个老师同时打分,最后取更谨慎的那个分数,避免把动作评价得太乐观。

技术对应:
两者都包含一个 actor 和两个 critic;critic 输入 state+action 输出 Q 值,actor 输入 state 输出 action;target critics 用软更新提供更稳定的目标值。

保守约束

通俗理解:
离线数据里没出现过的动作,模型其实没亲自试过。CQL 的核心就是提醒 critic:别随便给没见过的动作打高分。

技术对应:
CQL 用 logsumexp penalty 压低随机动作和当前策略动作的 Q 值,同时保留数据动作的价值;CQL_NB 进一步把 next policy 动作也纳入 penalty 覆盖范围。

稳定性增强

通俗理解:
这一组方法很容易因为 Q 值估计不稳而抖动,所以会对奖励、梯度和目标动作都做处理,让训练过程更像慢慢校准而不是猛跳。

技术对应:
两者都支持 reward scaling、梯度裁剪和 BC 辅助 actor;CQL_NB 额外加入 target smoothing noise,在 next action 上加截断噪声后再计算目标 Q。

参数说明

常用参数

dataset_path数据集路径
batch_size批大小
num_epochs训练轮数
lr_actor / lr_criticactor/critic 学习率
gamma / tau折扣系数与软更新系数
hidden_layers隐藏层结构
output_dir输出目录

进阶参数

lambda_cql保守约束权重
num_random_actions构造 penalty 时采样的随机动作数
alpha_bc / bc_coefactor 中 BC 相关参数
reward_scale是否对 reward 标准化
CQL_NB.policy_noise / noise_cliptarget smoothing 噪声参数

建议先理解常用参数,再看进阶参数。

代码块讲解

AIcodes/CQL.py -> Config

定义 CQL 训练参数并保存配置。

AIcodes/CQL.py -> load_hdf5_dataset

加载完整 transition 数据。

AIcodes/CQL.py -> compute_cql_penalty

构造保守 Q 约束。

AIcodes/CQL.py -> train_cql_improved

执行双 critic + actor 训练。

AIcodes/CQL_NB.py -> compute_cql_penalty

加入 next policy action 和 smoothing noise。

AIcodes/CQL_NB.py -> train_cql_improved

把 target smoothing 和更丰富的 penalty 用到训练中。

输入输出与产物

输入

  • 代码文件:AIcodes/CQL.py、AIcodes/CQL_NB.py
  • 数据文件:halfcheetah_medium-v2.hdf5
  • 完整 transition 输入:state/action/reward/next_state/done

输出与产物

  • checkpoints/CQL/ 或 checkpoints/CQL_NB/
  • best_model.pt
  • train_config.json
  • training_log.csv
  • critic_loss_curve.png
  • actor_loss_curve.png
  • cql_penalty_curve.png

Base / NB 对比

对比项CQLCQL_NB
核心思路标准保守 Q 学习 + BC 辅助 actor在 CQL 基础上增加更强的 penalty 覆盖和 smoothing
Penalty 动作集合随机动作 + 当前策略动作随机动作 + 当前策略动作 + next policy 动作
稳定性设计reward scaling、双 critic、软更新额外加入 TD3 风格 target smoothing
适合理解理解离线 RL 中“保守”的意义理解如何在基线 CQL 上继续增强稳定性

小结

  • 建议先把 CQL 理解成“先给动作打分,再决定怎么学动作”:critic 负责判断动作值不值,actor 再根据这个评价调整策略。
  • CQL 的核心价值是保守:离线数据里没出现过的动作不能随便给高分,否则策略可能学到数据外的危险动作。
  • CQL_NB 在 CQL 基础上扩大 penalty 覆盖范围,并加入 target smoothing,让随机动作、当前策略动作和下一步策略动作都被更谨慎地约束。
  • 这一组适合理解离线强化学习为什么重视 critic:不是只看动作像不像,还要看 Q 值估计是否稳定、是否过度乐观。