offline RL:IQL
CQL:明确的 pessimism(对 OOD 动作惩罚),理论保障强,适合数据覆盖差时保证安全,但对训练数据内的腐败/噪声敏感并且超参数敏感性高。IQL:把策略问题转为受 value 指导的监督学习,训练稳定、工程实现友好,通常在噪声数据或需要稳定复现实验时表现更好;但对 Q-target 的 heavy-tail(如 dynamics corruption)敏感,需要与鲁棒统计或不确定性方法(
什么是 IQL(一句话)
IQL 是一种基于隐式 Q 的离线 RL,把策略学习变成一个加权监督学习(advantage-weighted imitation) 问题,而把价值函数学习为 expectile 回归的过程,从而既能获得高性能又能避免强制 pessimism 带来的不稳定性。它把“策略学习”与“价值估计”的角色分离,策略通过加权模仿行为数据学习(权重来自 Q−V),价值通过 expectile regression 学习。
1 原理直觉(为什么这样做?)
- 离线 RL 面临distribution shift(学习的策略会选择与数据分布不同的动作)和泛化 / 估计偏差问题。传统 pessimism(例如 CQL)通过对 OOD 动作下调 Q 值来避免分布漂移,但这类方法在复杂函数逼近下往往不稳定或过保守。
- IQL 的核心思想是:先学好价值 / 优势评估(但不直接依赖 Q 来约束策略),再用 Q−V 指示哪些历史动作是“好”的,按好坏对行为数据加权做监督学习。这样策略只在数据支持下进行改进(因为它还是从数据分布中学习),同时又能利用 Q 来偏好高回报动作。
- 关键点:策略学习不需要回归未来返回的 Bellman 目标(避免直接的 bootstrapping 不稳定),而是变成了一个带权的行为克隆(weighted BC)。这给了 IQL 很好的稳定性。
2 数学表示与损失(核心公式)
设数据集 (D={(s,a,r,s’)})、折扣 γ\gammaγ。
Q 网络
IQL 维护一个 Q 函数 Qθ(s,a)Q_\theta(s,a)Qθ(s,a)。其更新是 标准的回归到 r + γ V(s’) 的目标,但 V 在下文用 expectile 得到。
通常 Q 的 loss(原 IQL):
LQ(θ)=E(s,a,r,s′)∼D[(r+γVψ(s′)−Qθ(s,a))2] L_Q(\theta)=\mathbb{E}_{(s,a,r,s')\sim D}\big[(r+\gamma V_\psi(s') - Q_\theta(s,a))^2\big] LQ(θ)=E(s,a,r,s′)∼D[(r+γVψ(s′)−Qθ(s,a))2]
(可用 MSE,也可如 RIQL 用 Huber)
V 网络(Expectile regression)
IQL 的关键:不是把 V 当作 Q 的简单均值,而用 expectile regression 使 V 成为“偏向上界/下界”的估计。定义 expectile loss(二阶 expectile):
LV(ψ)=E(s,a)∼D[Lτ(2)(Qθ(s,a)−Vψ(s))], L_V(\psi) = \mathbb{E}_{(s,a)\sim D}\big[ L_\tau^{(2)}( Q_\theta(s,a) - V_\psi(s) ) \big], LV(ψ)=E(s,a)∼D[Lτ(2)(Qθ(s,a)−Vψ(s))],
其中
Lτ(2)(x)=∣τ−1(x<0)∣x2. L_\tau^{(2)}(x) = |\tau - \mathbf{1}(x<0)| x^2. Lτ(2)(x)=∣τ−1(x<0)∣x2.
解释:当 τ>0.5 时,V 变得偏保守(更接近高端),当 τ<0.5 则偏向低端。常用 τ≈0.7。Expectile 跟 quantile 类似但可通过最小化加权平方得到(便于优化)。
Effectively V is a τ-expectile of Q over actions in dataset.
策略(policy)——加权模仿(Advantage-weighted regression)
IQL 用加权模仿来提取策略:
Lπ(φ)=−E(s,a)∼D[exp(β⋅A(s,a))logπφ(a∣s)] L_\pi(\varphi) = -\mathbb{E}_{(s,a)\sim D}\big[ \exp(\beta \cdot A(s,a)) \log \pi_\varphi(a|s) \big] Lπ(φ)=−E(s,a)∼D[exp(β⋅A(s,a))logπφ(a∣s)]
其中 A(s,a)=Qθ(s,a)−Vψ(s)A(s,a) = Q_\theta(s,a) - V_\psi(s)A(s,a)=Qθ(s,a)−Vψ(s) 是 advantage,β 控制权重“尖锐度”。策略的目标是把在数据中 A 大(看起来优)的动作模仿得更多。
如果用确定性策略(回归 a),等价于带权的均方误差回归 exp(βA)∣∣a−π(s)∣∣2\exp(\beta A)||a-\pi(s)||^2exp(βA)∣∣a−π(s)∣∣2。
3 算法步骤(逐步 & 伪代码)
初始化参数 θ,ψ,φ\theta, \psi, \varphiθ,ψ,φ。repeat:
- 从 D 采样批次 (B)。
- 计算 Q 值:q=Qθ(s,a)q = Q_\theta(s,a)q=Qθ(s,a) 对批次样本。
- 更新 V(expectile regression):
- 计算 LV=1∣B∣∑(s,a)∈BLτ(2)(Qθ(s,a)−Vψ(s))L_V = \frac{1}{|B|}\sum_{(s,a)\in B} L_\tau^{(2)}( Q_\theta(s,a) - V_\psi(s) )LV=∣B∣1∑(s,a)∈BLτ(2)(Qθ(s,a)−Vψ(s))
- 梯度下降更新 ψ。
- 计算目标 y = r + γ Vψ(s’) (这里 Vψ 使用上一步更新后的参数或使用 target net,实践中常把 V 更新放在 Q 之前/之后并用稳定技巧)。
- 更新 Q:
- LQ=1∣B∣∑(y−Qθ(s,a))2L_Q = \frac{1}{|B|}\sum (y - Q_\theta(s,a))^2LQ=∣B∣1∑(y−Qθ(s,a))2
- 梯度下降更新 θ。(若使用 target networks,请按实现细节)
- 计算 advantage A(s,a)=Qθ(s,a)−Vψ(s)A(s,a) = Q_\theta(s,a) - V_\psi(s)A(s,a)=Qθ(s,a)−Vψ(s)。
- 更新 policy:
- Lπ=−1∣B∣∑exp(βA(s,a))logπφ(a∣s)L_\pi = - \frac{1}{|B|}\sum \exp(\beta A(s,a)) \log \pi_\varphi(a|s)Lπ=−∣B∣1∑exp(βA(s,a))logπφ(a∣s)
- 梯度下降更新 φ。
- Repeat until convergence.
简洁伪代码
Initialize Qθ, Vψ, πφ
for steps:
batch = sample(D)
q = Qθ(batch.s, batch.a)
# V expectile update
LV = mean( expectile_loss_tau(q - Vψ(batch.s)) )
ψ ← ψ - lr_v * ∇ LV
# Q update (regress to r + γ V(s'))
target = batch.r + γ * Vψ(batch.s')
LQ = mean( (target - Qθ(batch.s, batch.a))**2 )
θ ← θ - lr_q * ∇ LQ
# Policy update (advantage weighted imitation)
A = Qθ(batch.s, batch.a) - Vψ(batch.s)
Lπ = - mean( exp(β*A) * log πφ(batch.a | batch.s) )
φ ← φ - lr_pi * ∇ Lπ
4 理论 / 直观解释(为啥能 work)
-
Expectile 的作用是把 V 做成“阈值式”的 baseline:当 τ>0.5,V 偏向上方,这样 A=Q−V 对于高质量动作更突出(更正经营利)。因此即使 Q 存在偏差,policy 还是只大幅学习那些 advantage 明显为正的样本。
-
策略学习是监督(IE:行为克隆加权),不会像直接 actor-critic 那样在策略更新中不断 bootstrap Q,减少了训练震荡风险。
-
Q 和 V 的分离使得 Q 的 Bellman 回归仍保留,但 policy 并不直接通过 Q 的 Bellman 回归信号来更新(避免了许多 bootstrapping 带来的问题)。
-
IQL 的设计在经验和理论上显示出了在离线数据(尤其是 data-rich)下的良好稳定性与表现。
5 实践实现细节与工程建议
网络、参数化
-
Q 网络:通常 MLP,输出 scalar。
-
V 网络:MLP,输出 scalar。
-
Policy:可以用确定性回归(直接回归动作)或概率性网络(高斯)。论文与常用实现常用确定性回归 + MSE(或负 log-likelihood)。
-
Target networks:Q 与 V 的 target nets 可选;IQL 原论文在实现上并不过分依赖,但在有噪声和不稳定时可使用 target net/EMA。
hyper-params(经验)
-
τ(expectile):0.6 ~ 0.9,论文常用 0.7。
-
β:2 ~ 10,控制权重尖锐度。太小则退化为 BC,太大数值不稳定且容易过拟合少数样本。
-
lr:3e-4(Adam)常用,Q 与 V 可以不同学习率。
-
batch size:256 常见;大 batch 有利于稳定估计。
-
normalization:对 state 做标准化通常有帮助(尤其实际环境维度尺度差异大时)。
IQL 与CQL对比
- CQL:通过在 Q 函数上施加“悲观/保守”约束,降低对数据中未见(或分布外)动作的估计,防止策略选择 OOD 动作导致性能崩溃。
- IQL:把策略学习变成加权监督学习(advantage-weighted imitation),以更稳定的监督方式利用数据改进策略,避免将策略更新直接绑定在 Q 的 bootstrap 误差上。
1. 核心目标与直觉对比
CQL(保守化 Q)
- 直觉:在离线设置下,过估计 Q 对策略是致命的(会使策略选择未验证的高 Q 动作)。
- 方法:对 Q 的期望值在数据分布上和策略分布上加入一个下压(penalty),使 Q 对于未见动作显得较低(即 pessimist/LCB)。
- 目标是:使得在数据支持下 Q 值较高,而对 OOD 动作 Q 值被主动压低,从而保证学到的策略不会贸然选择没有数据支持的动作。
IQL(隐式 Q)
- 直觉:直接用 Q 来驱动策略(actor-critic)会把 bootstrapping 的 Q 误差放大。相反,把策略改成“受 Q 引导的加权模仿”,能兼得性能和稳定性。
- 方法:先学习 Q(或 V)并用 expectile 回归得到 V,之后用 (A = Q - V) 对行为数据做加权模仿:策略仅在数据支持的范围内“向高 advantage 的动作靠拢”。
- 目标是:把策略学习变成监督任务(带权 BC),减少 bootstrap 带来的不稳定性,同时利用 value 信息实现改进。
2. 关键公式对比(最重要的差别)
CQL 的典型目标(简化形式)
CQL 在 Q-learning loss 上加一项 conservative penalty。一种常见形式(CQL paper):
minθ;Lbellman(θ)+λ(E∗s∼D[log∑∗aexp(Qθ(s,a))]−E∗(s,a)∼D[Q∗θ(s,a)]) \min_\theta ; L_{\text{bellman}}(\theta) + \lambda \left( \mathbb{E}*{s\sim D}\left[ \log\sum*{a} \exp(Q_\theta(s,a)) \right] - \mathbb{E}*{(s,a)\sim D}[Q*\theta(s,a)] \right) θmin;Lbellman(θ)+λ(E∗s∼D[log∑∗aexp(Qθ(s,a))]−E∗(s,a)∼D[Q∗θ(s,a)])
其中第一项为 Bellman 回归(例如 TD/MSE),第二项为 log-sum-exp(对动作空间做上界估计) - 数据内均值,促使 Q 对数据外动作更低。λ 控制悲观强度。
直观:增加项越大,对未见动作的惩罚越强(更保守)。
IQL 的三项损失(核心)
IQL 由三步组成(分别优化):
-
Q regression(Bellman 回归):
LQ(θ)=E∗(s,a,r,s′)∼D[(r+γV∗ψ(s′)−Qθ(s,a))2] L_Q(\theta) = \mathbb{E}*{(s,a,r,s')\sim D} \big[ (r + \gamma V*\psi(s') - Q_\theta(s,a))^2 \big] LQ(θ)=E∗(s,a,r,s′)∼D[(r+γV∗ψ(s′)−Qθ(s,a))2] -
V via expectile regression:
LV(ψ)=E∗(s,a)∼D[L∗τ(2)(Qθ(s,a)−Vψ(s))] L_V(\psi) = \mathbb{E}*{(s,a)\sim D} \big[ L*\tau^{(2)}(Q_\theta(s,a) - V_\psi(s))\big] LV(ψ)=E∗(s,a)∼D[L∗τ(2)(Qθ(s,a)−Vψ(s))]
(expectile loss,τ 控制 V 的偏保守程度) -
Policy as advantage-weighted imitation:
Lπ(φ)=−E∗(s,a)∼D[exp(β(Q∗θ(s,a)−Vψ(s)))logπφ(a∣s)] L_\pi(\varphi) = -\mathbb{E}*{(s,a)\sim D} [\exp(\beta (Q*\theta(s,a)-V_\psi(s))) \log \pi_\varphi(a|s)] Lπ(φ)=−E∗(s,a)∼D[exp(β(Q∗θ(s,a)−Vψ(s)))logπφ(a∣s)]
注意:IQL 没有在 Q 上显式地做 OOD penalty(不像 CQL 用 log-sum-exp);IQL 通过 V 的 expectile + policy 的加权模仿间接实现保守效果。
3. 算法流程对比(伪代码层面)
CQL(简化流程)
Init Qθ, πφ
for steps:
sample batch from D
# 1) Q update: Bellman + CQL penalty
compute bellman_target = r + γ * E_a' [Q_target(s', a')]
L_bellman = mse(Qθ(s,a), bellman_target)
conservative_penalty = logsumexp_a Qθ(s,a) - E_{(s,a)~D}[Qθ(s,a)]
L_Q = L_bellman + λ * conservative_penalty
θ ← θ - lr * ∇ L_Q
# 2) update policy (usually via policy gradient to maximize Q under regularization)
L_π = - E_s [ E_{a~π}[ Qθ(s,a) ] ] + regularizer (e.g., KL to behavior)
φ ← φ - lr * ∇ L_π
CQL 的 policy 优化往往直接最大化 Q(受保守 Q 约束),或结合 KL 行为正则化。
IQL(简化流程)
Init Qθ, Vψ, πφ
for steps:
sample batch from D
# 1) V update: expectile regression toward Q
L_V = expectile_loss(Qθ(s,a) - Vψ(s))
ψ ← ψ - lr * ∇ L_V
# 2) Q update: Bellman regression using V(s')
target = r + γ Vψ(s')
L_Q = mse(Qθ(s,a), target)
θ ← θ - lr * ∇ L_Q
# 3) policy update: advantage-weighted imitation
A = Qθ(s,a) - Vψ(s)
L_π = - E[ exp(β A) log π(a|s) ]
φ ← φ - lr * ∇ L_π
4. 理论与直观差异
保守性来源
- CQL:通过明确惩罚未见动作的 Q(explicit pessimism),理论上能保证在部分覆盖下的安全性(upper/lower bounds等)。适合当你担心策略跑到数据未覆盖的状态/动作时。
- IQL:通过 expectile(偏向上端的 V)+ 加权模仿(只在数据支持下偏好高 advantage 动作),实现一种 “隐式的保守”。其理论分析(及实践)表明对许多常见场景更稳定。
对噪声 / corrupted data 的敏感性
- CQL(以及其他 ensemble-或 pessimism-based):在数据干净的假设下表现优异,但对于训练数据本身被腐败(例如 observation/dynamics/reward 被污染)时,惩罚机制可能会把腐败动作当成高不确定性并产生错误的置信估计,导致严重性能下降(论文实测)。
- IQL:监督化策略学习结构在面对某些类型的数据噪声时往往更鲁棒(论文中 IQL 在 observation/action/reward corruption 下表现优于 CQL),但 IQL 依然依赖 Q 的估计,在 dynamics corruption(s’ 污染导致 Q-target heavy-tailed)时表现脆弱,除非对 Q 的回归做鲁棒化(比如 RIQL 用 Huber + quantile ensemble)。
总结:CQL 更强调对 OOD 的惩罚(在 clean offline 数据下安全);IQL 更强调训练稳定性(在 noisy 数据/大量数据下稳定)。在数据被攻击或heavy-tail时,两者都有各自的弱点(CQL 对腐败极敏感,IQL 对 dynamics corruption 敏感,但可用 RIQL 改进)。
5. 实践实现差异(工程层面)
计算复杂度
- CQL:通常需要计算 log-sum-exp 或对动作空间做采样/近似(连续动作时需用采样或一组候选动作),并可能需要 ensemble,计算开销较大。
- IQL:结构上简单(Q、V、π 三个网络),policy 更新为加权监督(不需要对动作空间做大量采样),实现上更简洁、收敛也更稳。
超参数敏感性
- CQL:λ(保守强度)、样本数量(用于 logsumexp 的样本采样数)、policy regularizer 强度 对结果影响很大。调参不当会过度保守或根本无效。
- IQL:τ(expectile),β(adv-weight sharpness)是关键;但通常比 CQL 更容易调。
稳定性与收敛
- CQL:若网络表达强、估计不准,可能出现过度惩罚或欠惩问题;在复杂函数逼近中需要 careful tuning。
- IQL:通常更稳定、易于训练;但在 Q-target heavy-tailed 场景需要额外鲁棒措施(如 Huber、quantile ensemble)。
6. 哪种场景选哪种算法(建议)
- 数据比较干净,且你担心策略跑到 OOD 动作(覆盖不足):倾向用 CQL(或其他 pessimism-based 方法),因为其理论上更直接保障保守性。
- 数据可能包含噪声、采集误差或你优先考虑训练稳定性与工程易用性:倾向用 IQL(更易复现、超参更稳)。
- 如果数据既脏又覆盖欠佳:可以考虑 IQL + RIQL(Huber + quantile) 或在 CQL 上加入鲁棒回归技巧(例如对 Q 更新使用 Huber / 过滤异常样本),并结合 ensemble 与更稳健的 uncertainty estimation。
- 在高维连续动作、动作空间难以枚举的任务:IQL 的加权监督更方便(CQL 的 log-sum-exp 在连续空间需要采样技巧)。
7. 代码片段对比(PyTorch 风格伪实现)
CQL 风格(核心 penalty)
# bellman target
target = rewards + gamma * Q_target(next_states, next_actions).max(dim=1)[0] # simplified
loss_bellman = F.mse_loss(Q(states, actions), target)
# CQL conservative penalty (continuous actions: sample random actions)
random_actions = sample_uniform_actions(states, N_samples)
logsum = torch.logsumexp(Q(states.unsqueeze(1), random_actions), dim=1).mean()
data_q_mean = Q(states, actions).mean()
cql_penalty = logsum - data_q_mean
loss_q = loss_bellman + lambda_cql * cql_penalty
IQL 风格(expectile + weighted imitation)
# V update (expectile)
diff = Q(states, actions).detach() - V(states)
weight = torch.where(diff < 0, 1 - tau, tau)
loss_v = (weight * (diff**2)).mean()
# Q update
target = rewards + gamma * V(next_states).detach()
loss_q = F.mse_loss(Q(states, actions), target)
# policy update (weighted imitation)
adv = (Q(states, actions).detach() - V(states).detach())
weights = torch.exp(beta * adv)
weights = torch.clamp(weights, max=1e3) # numerical safety
loss_pi = (weights * (policy(states) - actions).pow(2)).mean()
8. 常见误区 / 实验陷阱
- 误区:认为 CQL 总是更“安全”。事实是:CQL 的“安全”依赖于 Q 的正确估计与 penalty 的合适强度;在数据被污染或模型欠拟合时 CQL 可能过度惩罚或反而放大错误。
- 误区:IQL 不需要任何 Q 稳健化。对 dynamics corruption(s’ 错误)等情况,IQL 的 Q 更新仍然脆弱,需用 Huber/smoothing/ensemble。
- 实验陷阱:在比较时测试环境一定要干净环境评估(训练在污染数据上仍要在干净环境中评估真实性能),否则难判断哪种方法真的学到了更好策略。
9. 迁移建议(如果你要从一种改成另一种或做混合)
- 若从 IQL → 更保守:可以在 Q 上加小量的 CQL-style penalty(log-sum-exp),或者在 policy 里加入 KL(π||behavior) 正则化。注意逐步调 λ,观察是否变得过保守。
- 若从 CQL → 更稳健对噪声:对 Q 的 Bellman regression 改用 Huber 或者用 ensemble Q 求 quantile(类似 RIQL 的思路),再观察是否缓解腐败敏感性。
- 做混合:IQL 的加权模仿 + CQL 的 in-sample penalty(对 dataset 内高方差点额外惩罚)——理论与实验上有可能兼得,但实现上需要 careful balancing(避免两种保守互相叠加导致过度保守)。
10. 总结
- CQL:明确的 pessimism(对 OOD 动作惩罚),理论保障强,适合数据覆盖差时保证安全,但对训练数据内的腐败/噪声敏感并且超参数敏感性高。
- IQL:把策略问题转为受 value 指导的监督学习,训练稳定、工程实现友好,通常在噪声数据或需要稳定复现实验时表现更好;但对 Q-target 的 heavy-tail(如 dynamics corruption)敏感,需要与鲁棒统计或不确定性方法(如 Huber、quantile ensemble)配合使用以增强鲁棒性(RIQL)。
两者不是绝对的“孰优孰劣”,而是在不同数据质量 / 覆盖 / 任务风险偏好下的权衡。如果你把目标定得清楚(例如是否容忍探索超出数据分布的风险、数据是否可能被腐败),我可以帮你给出具体的超参网格与实验对照计划,或直接把某个实现(IQL/CQL)改造成你需要的混合版本。你想接下来做哪一步?
更多推荐



所有评论(0)