一句话,Offline IL 的核心就是在静态数据集上加上约束——无论是保守 Q 值、隐变量还是扩散模型——目的只有一个:防止策略在数据集覆盖不到的状态下乱猜。说白了,它的精髓是“学分布,不学单点”。
核心问题:没法在线,也没人帮你
离线模仿学习的困境在于:不能与环境在线交互,也不能随时请求专家提供标注。手里能用的,只有一份固定的离线演示数据集。传统的行为克隆(BC)会遭遇协变量偏移,越跑越偏;DAgger 方法虽然好,但它需要专家在线指导;GAIL 或 IRL 这类方法又离不开环境交互。这些在离线场景下统统行不通。
所以,Offline IL 的目标非常明确:仅用静态数据集,学出一个足够鲁棒、能泛化的策略。
核心原理:别让策略在未知状态“放飞自我”
离线数据天生的短板是覆盖不足——训练集不可能穷尽所有状态空间。策略一旦访问到数据集里没见过的状态,就容易做出离谱的决策。解决方案自然就是约束策略,让它不要偏离数据集的覆盖范围太远,只在有数据支撑的状态上老老实实学。
主流方法:三种思路,各有侧重
方法1:保守 Q 学习(CQL / IQ-Learn)
思路很直接:在 Q 函数上动手脚。给 Q 值加一个惩罚项,让数据集之外那些动作的 Q 值被强行压低——这样一来,策略就不会被某些“虚高”的 Q 值误导,去尝试那些实际上很糟糕的动作。
算法:IQ-Learn(隐式 Q 学习)
输入:离线数据集 D = {(s,a,r,s")}
1. 初始化 Q 网络 Q_φ,目标网络 Q_target
2. for iter = 1 to N:
# 标准 Bellman 更新
Q_target = r + γ * max_a' Q_target(s', a')
loss_bellman = MSE(Q(s,a), Q_target)
# 保守性惩罚:数据集外的动作 Q 值要低
# 对随机采样的动作 a' ~ π,压低其 Q 值
loss_conservative = E[Q(s,a')]_random_a' # 负号:拉低
loss = loss_bellman + α * loss_conservative
update Q_φ
3. 策略:π(s) = argmax_a Q(s,a)
方法2:条件行为克隆
换个思路:不学单点映射,而是学一个条件分布 p(a∣s, z)。这里的 z 是隐变量或上下文变量,用来表征同一种状态下专家可能存在的不同意图。这样一来,策略就有了多模态的表达能力——同样一个状态,可以根据不同的“意图”选择不同的动作。
算法:Conditional BC
输入:离线数据集 D = {(s,a)}
1. 训练条件 VAE:
Encoder: z ~ q(z|s,a) # 编码 (s,a) 到隐空间
Decoder: a ~ p(a|s,z) # 给定 (s,z) 重建动作
loss = Reconstruction + KL(q(z|s,a) || N(0,1))
2. 推理时:
z ~ N(0,1) 或从先验采样
a = argmax_a p(a|s,z) # 解码动作
方法3:扩散策略
再进一步:直接用扩散模型来建模动作分布 p(a∣s)。扩散模型天生擅长拟合复杂、多模态的分布,用来做策略生成,效果相当自然。
算法:Diffusion Policy
输入:离线数据集 D = {(s,a)}
1. 训练去噪网络 ε_θ(a_noisy, s, t):
for each (s,a) in D:
noise = randn_like(a)
a_noisy = √α_t * a + √(1-α_t) * noise # 前向扩散
pred_noise = ε_θ(a_noisy, s, t)
loss = MSE(pred_noise, noise)
update ε_θ
2. 推理:
a_T = randn(action_dim) # 初始噪声
for t = T → 1: # 反向去噪
pred_noise = ε_θ(a_t, s, t)
a_{t-1} = denoise_step(a_t, pred_noise)
返回 a_0
方法对比
| 方法 | 核心机制 | 优势 | 劣势 |
|---|---|---|---|
| IQ-Learn | 压低数据外 Q 值 | 理论保证强 | 需调超参 α |
| Conditional BC | 隐变量建模多模态 | 表达能力强 | VAE 训练不稳定 |
| Diffusion Policy | 扩散模型拟合动作分布 | 多模态支持好 | 推理慢(多步去噪) |
