CQL:Conservative Q-Learning
在 Bellman 误差之外惩罚数据外高 Q,并相对抬高数据动作,学习保守的价值函数。
学习目标
- 通过保守价值正则抑制数据外乐观 Q,而不是直接证明所有动作安全。
- 独立复核“CQL 正则为何会压低未见的高 Q 动作”的输入、计算和解释。
- 保守正则作用于价值,并非直接限制策略 KL。
为什么重要
通过保守价值正则抑制数据外乐观 Q,而不是直接证明所有动作安全。
学习前需要掌握
背景与问题
普通离线 critic 只在记录动作上拟合 Bellman 目标,actor 却会搜索整个动作空间。训练损失再小,也可能存在未见动作的夸大分数。CQL 给这类高估增加惩罚,使策略不易靠无数据证据的高 Q 获益。
概念定义
CQL 是可叠加到离散价值学习或连续 actor-critic 骨架的离线方法族。典型目标由 Bellman 误差和保守正则组成;正则压低广泛候选动作相对数据动作的 Q。它属于利用固定 transition 进行 off-policy 学习的方法,不是仅用状态动作标签的行为克隆。
直观理解
评分表不仅要解释已经发生的交易,还要对从未验证却极高的报价保持怀疑。怀疑力度过强会连真正优质但稀少的机会一起压低,所以保守不等于越多越好。
核心原理
离散版本用 logsumexp 聚合动作。其对某动作 Q 的导数是 softmax 概率,再减数据动作频率;未见高 Q 动作会得到正导数,梯度下降因此压低它。数据动作则还受到 Bellman 拟合项牵引。
连续版本不能枚举所有动作,通常从策略和其他 proposal 采样并做重要性修正。候选覆盖不足会漏掉高估区域,log probability 的符号和密度修正也会显著影响目标。
正则强度 α 与数据质量、奖励尺度和实现版本相关。论文中的价值下界结论有采样、函数类与优化假设,不能解释成神经网络输出对每个状态动作都严格小于真实值,更不能推出行动安全。
数学表达
离散动作 CQL(H) 目标(教学化写法)
第一项压低广泛动作相对数据动作的价值,第二项保持 Bellman 一致性;连续动作实现需采样近似。
变量含义
α保守正则强度。β数据行为策略。B^π Q̄由 target critic 与目标策略构造的 Bellman target。log∑exp Q对高 Q 动作敏感的平滑最大值。
计算步骤
- 1指数质量为 [1,1,2],总和为 4,正则值为 ln4。
- 2三个动作 softmax 为 [0.25,0.25,0.5]。
- 3减去数据动作指示后,梯度为 [−0.75,0.25,0.5],梯度下降会压低动作 2。
代码对应位置
示例 1离散动作 CQL 正则项:在 Bellman 误差之外计算 logsumexp(Q)−Q(data action) 的保守惩罚。
变量解释
| 变量 | 含义 |
|---|---|
α | 保守正则强度。 |
β | 数据行为策略。 |
B^π Q̄ | 由 target critic 与目标策略构造的 Bellman target。 |
log∑exp Q | 对高 Q 动作敏感的平滑最大值。 |
完整数值示例
CQL 正则为何会压低未见的高 Q 动作
已知条件
- 为方便手算,一个状态的三个 Q 为 [0,0,ln2],数据只选择动作 0。
- 只观察 logsumexp(Q)−Q(data) 这一项,不包含 Bellman loss。
计算步骤
- 指数质量为 [1,1,2],总和为 4,正则值为 ln4。
- 三个动作 softmax 为 [0.25,0.25,0.5]。
- 减去数据动作指示后,梯度为 [−0.75,0.25,0.5],梯度下降会压低动作 2。
计算结果
未见动作 2 的保守项梯度为 +0.5;下方两样本 PyTorch 代码还组合了 Bellman loss。
处理前后对比
- 保守正则作用于价值,并非直接限制策略 KL。
- 只看正则项可能降低所有非数据动作,最终需与 Bellman 项共同分析。
计算与实现步骤
- 从固定数据采样 transition batch
- 计算数据动作 Q 与 TD target
- 采样或枚举比较动作
- 计算 logsumexp 或重要性修正的保守 gap
- 更新 critic
- 用保守 critic 更新 actor 或取 greedy
- 独立调节 α 并离线评测
代码实现
示例 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 = 0.5 * 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 = 0.5 * 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。
参数更新由当前梯度与学习率共同决定。
平方误差代码对应均方损失。
预期输出或运行结果
Bellman: 0.13 CQL gap: 2.832 OOD-action gradients: tensor([0.4448, 0.4318])
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 把经验 critic 输出称为无条件逐点真实下界。
- α 过大压低数据中稀少的优质行为。
- 连续候选采样或重要性修正错误,漏掉乐观动作。
实际应用
- 序贯决策
- 控制与资源分配
常见错误
- 把经验 critic 输出称为无条件逐点真实下界。
- α 过大压低数据中稀少的优质行为。
- 连续候选采样或重要性修正错误,漏掉乐观动作。
扩展内容说明
本页数值均为解释机制的构造案例,不能解读为真实训练或基准性能。定义和适用条件参见 Kumar 等:Conservative Q-Learning for Offline Reinforcement Learning。
算法属性与数据边界
目标函数
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 for Offline Reinforcement Learning
在 Bellman 误差之外加入保守价值正则,降低固定数据外动作的乐观估计。
Kumar et al. · arXiv / NeurIPS