CQL:Conservative Q-Learning
在 Bellman 误差之外惩罚数据外高 Q,并相对抬高数据动作,学习保守的价值函数。
学习目标
- 定义CQL:Conservative Q-Learning并复述输入输出。
- 从公式计算一个最小数值例子。
- 说明它与相邻算法的区别、失败模式和适用场景。
为什么重要
CQL:Conservative Q-Learning位于“状态—行动—反馈—更新”学习链中的关键位置。
掌握它能帮助学习者判断算法使用的数据、策略归属和稳定性边界。
学习前需要掌握
背景与问题
强化学习面对序贯决策:动作会改变之后能看到的状态和奖励,因此样本通常并非独立同分布。
同一算法的效果取决于环境、探索策略、函数近似、随机种子和评测协议,单次曲线不足以下结论。
概念定义
CQL 是可叠加到 DQN 或 actor-critic 骨架上的离线 RL 方法族;其核心正则项扩大广泛动作与数据动作的 Q 差异惩罚,使策略不易利用缺少数据证据的乐观价值。
本页使用“问题定义—数学目标—更新过程—代码—失败诊断”的顺序组织,避免只记算法缩写。
直观理解
普通 critic 像容易被陌生选项的夸张评分骗过;CQL 给“没在历史记录里却得分很高”的选项收取怀疑税。
把价值看作“未来累计收益的估计”,把策略看作“在状态下如何选动作的规则”;算法差异主要在估计谁、使用谁生成的数据以及如何更新。
核心原理
离散动作 CQL 可用 logsumexp 聚合所有动作;连续动作常以均匀分布和当前策略采样近似。
保守项与 Bellman 项共同优化,α 过小防不住外推,过大会压低真正有价值的动作。
CQL 的理论结论依赖论文中的采样、函数类和优化假设,不能把经验 Q 一律解释为逐点真实下界。
CQL-DQN 对应离散动作;CQL-SAC 常保留双 critic、actor 与温度结构,再给 critic 加保守正则。
数学表达
离散动作 CQL(H) 目标(教学化写法)
第一项压低广泛动作相对数据动作的价值,第二项保持 Bellman 一致性;连续动作实现需采样近似。
变量含义
α保守正则强度。β数据行为策略。B^π Q̄由 target critic 与目标策略构造的 Bellman target。log∑exp Q对高 Q 动作敏感的平滑最大值。
计算步骤
- 1计算 bootstrap 目标:1+0.9×2=2.8。
- 2目标与当前估计差为 2.8−0.5=2.3。
- 3若学习率 α=0.1,新估计为 0.5+0.1×2.3=0.73。
代码对应位置
示例 1离散动作 CQL 正则项:在 Bellman 误差之外计算 logsumexp(Q)−Q(data action) 的保守惩罚。
变量解释
| 变量 | 含义 |
|---|---|
α | 保守正则强度。 |
β | 数据行为策略。 |
B^π Q̄ | 由 target critic 与目标策略构造的 Bellman target。 |
log∑exp Q | 对高 Q 动作敏感的平滑最大值。 |
完整数值示例
CQL:Conservative Q-Learning的最小计算
已知条件
- 即时奖励为 1
- 下一状态估计为 2
- 折扣因子 γ=0.9
- 当前估计为 0.5
- 1
计算 bootstrap 目标:1+0.9×2=2.8。
- 2
目标与当前估计差为 2.8−0.5=2.3。
- 3
若学习率 α=0.1,新估计为 0.5+0.1×2.3=0.73。
一次更新后估计从 0.5 变为 0.73;是否收敛需要持续采样与满足相应条件。
处理前后对比
- 较大 α 更新快但噪声和震荡更强。
- 较大 γ 更重视远期奖励,但误差传播范围更长。
- 使用真实回报与 bootstrap 目标会带来不同偏差—方差权衡。
计算与实现步骤
- 1
从固定数据采样 transition batch
- 2
计算数据动作 Q 与 TD target
- 3
采样或枚举比较动作
- 4
计算 logsumexp 或重要性修正的保守 gap
- 5
更新 critic
- 6
用保守 critic 更新 actor 或取 greedy
- 7
独立调节 α 并离线评测
代码实现
示例 1
离散动作 CQL 正则项
example_01.py用途:在 Bellman 误差之外计算 logsumexp(Q)−Q(data action) 的保守惩罚。
import torch
import torch.nn.functional as F
q_all = torch.tensor([[1.0, 1.4, 4.0],
[0.8, 1.1, 3.5]], requires_grad=True)
data_actions = torch.tensor([0, 1])
rewards = torch.tensor([1.0, 0.5])
next_v = torch.tensor([0.7, 0.4])
q_data = q_all.gather(1, data_actions[:, None]).squeeze(1)
td_target = rewards + 0.99 * next_v
bellman_loss = F.mse_loss(q_data, td_target)
conservative_gap = torch.logsumexp(q_all, 1).mean() - q_data.mean()
loss = bellman_loss + conservative_gap
loss.backward()
print('Bellman:', round(bellman_loss.item(), 3))
print('CQL gap:', round(conservative_gap.item(), 3))
print('OOD-action gradients:', q_all.grad[:, 2])代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
在 Bellman 误差之外计算 logsumexp(Q)−Q(data action) 的保守惩罚。
mean- 训练特征逐列均值。
loss- 当前预测与目标之间的损失值。
Step 1 · 1–2 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
import torch.nn.functional as FStep 2 · 4–17 行
只从训练数据逐列计算均值与标准差,对应标准化公式中的 μ 和 σ。
q_all = torch.tensor([[1.0, 1.4, 4.0],
[0.8, 1.1, 3.5]], requires_grad=True)
data_actions = torch.tensor([0, 1])
rewards = torch.tensor([1.0, 0.5])
next_v = torch.tensor([0.7, 0.4])
q_data = q_all.gather(1, data_actions[:, None]).squeeze(1)
td_target = rewards + 0.99 * next_v
bellman_loss = F.mse_loss(q_data, td_target)
conservative_gap = torch.logsumexp(q_all, 1).mean() - q_data.mean()
loss = bellman_loss + conservative_gap
loss.backward()
print('Bellman:', round(bellman_loss.item(), 3))
print('CQL gap:', round(conservative_gap.item(), 3))
print('OOD-action gradients:', q_all.grad[:, 2])代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
参数更新由当前梯度与学习率共同决定。
平方误差代码对应均方损失。
预期输出或运行结果
CQL gap 为正;未在 batch 中出现且 Q 很高的动作得到正梯度,梯度下降会压低它。
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 只报告最好的一次随机种子
- 训练回报与评测回报混用
- 终止状态仍错误 bootstrap
实际应用
- 序贯决策
- 控制与资源分配
常见错误
文档来源
Conservative Q-Learning for Offline Reinforcement Learning原始文档
arXiv:2006.04779- CQL 原论文 / §3.1:保守 Q 目标与下界性质
- CQL 原论文 / Eq. 4:CQL(H) 实际目标
- CQL 原论文 / Appendix F:基于 SAC 的实现细节
扩展内容说明
“怀疑税”直觉、PyTorch 两样本示例、DQN/SAC/IQL 对照、工程检查项均为本站扩展解释;目标与算法性质以 CQL 原论文为准。
算法属性与数据边界
- 目标函数
- Bellman error + α × conservative Q regularizer
数据边界
- 需要带奖励、下一状态与终止标记的固定 transition;不是只靠 (s,a) 的行为克隆。
- 连续动作 logsumexp 依赖有限采样近似,proposal 覆盖不足会漏掉高估区域。
- α 是数据质量相关参数;不能用测试环境反复在线试出来后仍声称纯离线选择。
与 DQN、SAC 及相邻方法对照
对照要点
- DQN:同样可用 target network 和 Bellman loss;CQL 额外压低非数据动作的高 Q。
- SAC:同样可用双 Q 和随机 actor;CQL-SAC 的关键差异在 critic 的保守正则。
- IQL:不显式枚举或采样 OOD 动作做价值惩罚,而以 expectile V 和数据动作策略回归完成隐式改进。
失败模式、风险与性能
失败模式
- α 太大导致过度保守,优质稀有动作被压低
- α 太小退化为朴素 DQN/SAC
- 连续动作重要性修正或 log-prob 符号错误
- 超时 transition 被当成真实终止
目标与安全风险
- 保守价值不是安全约束,仍需限制动作集合与成本。
- 数据投毒可通过虚假高奖励 transition 改变数据动作基准。
性能与复现
- CQL-SAC 比普通 SAC 多次采样动作并计算 logsumexp,计算与显存开销更高。
- 报告 α、自动拉格朗日版本、候选动作数、数据版本和多 seed 结果。
常见问题
CQL:Conservative Q-Learning是 on-policy 还是 off-policy?
这是基础或比较概念,具体归属取决于所讨论算法。
网页是否会训练模型?
不会。所有图表使用固定种子或解析公式在浏览器本地计算,不执行页面中的示例代码。
资料来源与核对日期
核对日期:2026-08-30。算法定义与公式依据以下外部教材或原论文;中文直觉、教学代码、对照与部署建议属于本站扩展解释。
推荐学习资料
Conservative Q-Learning for Offline Reinforcement Learning
在 Bellman 误差之外加入保守价值正则,降低固定数据外动作的乐观估计。
Kumar et al. · arXiv / NeurIPS