假设你刚拿到驾照,第二天就要去开出租车,但驾校规定:你只能在不能碰车的情况下接单。你手里只有老司机老王一整年的行车日志,每一条都写着:“某时某刻,路况如何,老王做了什么操作,得到什么结果,车到了哪条路。” 你不可能把车开上街,唯一的老师就是这本日志。离线强化学习(Offline RL)就是在这种“只有日志、不许试驾”的条件下学习驾驶策略的机器学习方法。面对这本厚厚的日志,三位风格迥异的教练给出了三种教学方法:保守派 CQL 说“日志里没出现过的操作,一律先扣分”;务实派 IQL 说“不去想没试过的操作,只提炼成功片段”;剧本派 Decision Transformer 说“把成功行程写成剧本,照着演”。你该选谁?读完这篇文章,你会从原理、代码到应用,彻底搞懂它们各自的门道。

岗位关联

理解这三大算法,你就能在推荐、机器人、医疗等无法在线试错的领域,让 AI 从历史数据中安全地学会决策,这是离线强化学习的核心工程价值。

目录
  1. 可视化演示
  2. 离线学习基础:一本不能试驾的行车日志
  3. 分布偏移风险:日志没写过的郊区小路
  4. CQL保守学习:保守教练的扣分表
  5. IQL隐式学习:务实教练的上分位经验
  6. 决策Transformer:剧本派的目标条件重演
  7. 算法横向对比:选教练的智慧
  8. 工程实现要点:驾校的排课与验收
  9. 产业应用图谱:车队的大数据传承
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示区块链Layer 2扩容方案的工作原理,包括Layer 1主链与Layer 2的交互流程、Rollup批量提交与状态通道机制,直观理解链下扩容的核心优势。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Layer 2扩容方案 Layer 1:主链负责安全与最终确认,吞吐有限 Layer 2:链下执行交易,批量提交至主链 状态通道:双方链下交互,仅最终状态上链 TPS_L2 >> TPS_L1; Cost_L2 << Cost_L1 Layer 2实现高吞吐与低成本的链下扩容

离线学习基础:一本不能试驾的行车日志

假设你刚拿到驾照,第二天就要去开出租车,但驾校规定:你只能在不能碰车的情况下接单。你手里只有老司机老王一整年的行车日志,每一条都写着:“某时某刻,路况如何,老王做了什么操作,得到什么结果,车到了哪条路。”你不可能把车开上街,唯一的老师就是这本日志。离线强化学习(Offline RL)就是在这种“只有日志、不许试驾”的条件下学习驾驶策略的机器学习方法。

在强化学习的世界里,“日志”叫作离线数据集 D;“记录老王驾驶习惯的策略”叫作行为策略,记作 π_β;每条日志是一个转移四元组。与在线强化学习“边开边学、错了重来”不同,离线 RL 的数据是历史遗留的、固定不变的。推荐系统的用户点击日志、机器人的遥操作示教、自动驾驶的路测记录,都是典型的离线数据来源。

把数据集的产生过程写成数学语言,就是这个公式——它说明你手里的每一条日志,都是由“行为策略负责做决定、环境负责给结果”共同完成的:

翻着这本日志,你要记住一件事:它是“单程票”。你学完之后不能像在线强化学习那样重新上车验证、修正,所有的决策依据都来自这些早已发生的记录。这正是离线 RL 与在线 RL 之间最本质的分界线。

D={(st,at,rt,st+1)  ∣  at∼πβ(⋅∣st),  st+1∼P(⋅∣st,at)}\displaystyle \mathcal{D}=\{(s_t,a_t,r_t,s_{t+1})\;|\;a_t\sim\pi_\beta(\cdot\mid s_t),\;s_{t+1}\sim P(\cdot\mid s_t,a_t)\}
这个公式说明:日志中的每个四元组,都由行为策略采样动作、环境动态决定结果,数据一旦采集就固定不变。
  1. 数据集 D整本行车日志,存放着一条条“路况—操作—奖励—新路况”的四元组记录。
    D={(st,at,rt,st+1)}\mathcal{D}=\{(s_t,a_t,r_t,s_{t+1})\}
  2. 行为策略采样日志中的操作 a_t 是老司机老王根据策略 π_β 做出的选择。
    at∼πβ(⋅∣st)a_t\sim\pi_\beta(\cdot\mid s_t)
  3. 环境转移操作之后会发生什么,由环境动态 P 决定,得到新路况 s_{t+1} 和奖励 r_t。
    st+1∼P(⋅∣st,at)s_{t+1}\sim P(\cdot\mid s_t,a_t)
  4. 固定不变数据集采集后不会更新,任何新策略都无法回头给日志补充内容。
    D={(st,at,rt,st+1)}t=1N\mathcal{D}=\{(s_t,a_t,r_t,s_{t+1})\}_{t=1}^{N}

分布偏移风险:日志没写过的郊区小路

日志里 99% 的路况都有记录,唯独城东有一段郊区小路,老王从没开过。你自学时“感觉”那条路能抄近路,结果开过去全是泥坑。为什么?因为你在“猜”一个从没被验证过的操作的价值。离线强化学习里,这种出现在行为策略数据覆盖范围之外的(状态,动作)组合,叫作 OOD 动作。

当策略试图评估 OOD 动作的价值时,价值函数只能靠外推。数据里没有这片区域的支撑,网络的输出就是毫无根据的“瞎猜”,这种误差叫作外推误差。它会造成最危险的后果——价值高估:智能体以为某个从未尝试过的动作价值极高,于是信心满满地执行,实际却一败涂地。

标准 Q-learning 的错误根源写在一个更新式里,它用 max 来选择“下一步最好的动作”:

当数据集覆盖不全时,上述 max 会让 Q 值像滚雪球一样往高处飘。这正是离线 RL 所有复杂设计试图解决的核心矛盾:如何在不与真实环境交互的前提下,阻止对陌生路段的盲目自信。

Q(s,a)←r+γmax⁡a′Q(s′,a′)\displaystyle Q(s,a)\leftarrow r+\gamma\max_{a'}Q(s',a')
这个式子告诉 AI:先假设下一步一定能做出最优选择。可一旦 s' 不在日志覆盖范围内,max 出的那个“最优”就是幻觉。
  1. 当前估计Q(s,a) 表示在路况 s 下执行操作 a 的长期价值估计。
    Q(s,a)←r+γmax⁡a′Q(s′,a′)Q(s,a)\leftarrow r+\gamma\max_{a'}Q(s',a')
  2. 立即奖励执行操作后,环境立刻给出的回报 r。
    rt=r(st,at)r_t=r(s_t,a_t)
  3. max 选择对新路况 s' 比较所有动作的 Q 并选最大——这是“幻觉”的源头。
    max⁡a′Q(s′,a′)\max_{a'}Q(s',a')
  4. 折扣因子γ 让远期回报打折,γ 越接近 1 越看重长远价值。
    γ∈[0,1),γ=0.9\gamma\in[0,1),\quad \gamma=0.9

CQL保守学习:保守教练的扣分表

保守派教练拿到日志后,先做一张“扣分表”:凡是日志里出现过的操作,按实际表现打分;凡是日志里根本没出现过的操作,一律先扣到最低分。“没见过,就当有危险”——简单的原则,却直击价值高估的命门。

这个思想对应 CQL(Conservative Q-Learning,保守 Q 学习)。它在标准 Q 学习的目标之外,额外加一项正则:压低任意“动作分布”(包含大量 OOD 动作)下的 Q 期望,同时抬高“日志内动作”的 Q 期望。两项相减,OOD 动作的价值被明显压低,而数据内动作的价值被保住。

CQL 的训练损失写作:

这张扣分表的效果是:当策略想挑 Q 值最高的动作时,它几乎不会选到日志外的高危操作,Q 值也成了真实价值的一个“保守下界”。保守的代价是可能会绕一点远路,但至少不会翻车。

LCQL=α(Es∼D, a∼μ[Q(s,a)]−E(s,a)∼D[Q(s,a)])+LBellman\displaystyle \mathcal{L}_{\mathrm{CQL}}=\alpha\left(\mathbb{E}_{s\sim\mathcal{D},\,a\sim\mu}\left[Q(s,a)\right]-\mathbb{E}_{(s,a)\sim\mathcal{D}}\left[Q(s,a)\right]\right)+\mathcal{L}_{\mathrm{Bellman}}
读作:对没见过的动作产生的 Q 值“扣分”,对日志里见过的动作“加分”,然后照常做贝尔曼更新。
  1. 第一项期望对状态来自日志、动作来自任意分布 μ(含 OOD 动作)的 Q 期望,α 决定扣分力度。
    α⋅Es∼D, a∼μ[Q(s,a)]\alpha\cdot\mathbb{E}_{s\sim\mathcal{D},\,a\sim\mu}\left[Q(s,a)\right]
  2. 第二项期望对日志内真实出现过的 (s,a) 组合求 Q 期望,作为“加分项”防止所有 Q 被无脑压低。
    E(s,a)∼D[Q(s,a)]\mathbb{E}_{(s,a)\sim\mathcal{D}}\left[Q(s,a)\right]
  3. 两项相减扣分与加分抵消后,净效果是“压低陌生、托起熟悉”。
    α(Es,a∼μ[Q]−Es,a∼D[Q])\alpha\left(\mathbb{E}_{s,a\sim\mu}[Q]-\mathbb{E}_{s,a\sim\mathcal{D}}[Q]\right)
  4. 贝尔曼项标准时序差分损失,确保 Q 估计不偏离真实奖励信号。
    LBellman=Es,a,s′∼D[(r+γmax⁡a′Qθˉ(s′,a′)−Qθ(s,a))2]\mathcal{L}_{\mathrm{Bellman}}=\mathbb{E}_{s,a,s'\sim\mathcal{D}}\left[\left(r+\gamma\max_{a'}Q_{\bar{\theta}}(s',a')-Q_\theta(s,a)\right)^2\right]

IQL隐式学习:务实教练的上分位经验

务实派教练翻开日志,只做一件事:把老王“这样做成功了”的片段圈出来反复研究。至于老王没试过的操作,他看都不看。“研究没发生的事情毫无意义”——这就是 IQL(Implicit Q-Learning,隐式 Q 学习)的哲学:不查询 OOD 动作,只从数据里提取“有利动作”的价值。

如何定义“有利动作”?IQL 用一个叫 expectile 回归的数学工具,训练状态价值函数 V(s),让它趋于“数据内动作 Q 值”的高分位。比如 τ=0.7,V(s) 会逼近数据中动作价值的第 70 分位——比平均高,但不是最高。这样 V 代表了“这个状态下做得还可以的水平”。

对应的损失函数为:

得到 V 之后,Q 的更新不再使用 max,而是用 r+γV(s') 替代,从根源上躲开了对 OOD 动作的查询。务实教练不幻想花式入库,也不研究没试过的动作,只把日志里“做得还可以”的水平学到手。

L(θ)=E(s,a)∼D[∣τ−1(Qθ^(s,a)<Vθ(s))∣⋅(Qθ^(s,a)−Vθ(s))2]\displaystyle \mathcal{L}(\theta)=\mathbb{E}_{(s,a)\sim\mathcal{D}}\left[\left|\tau-\mathbb{1}\left(Q_{\hat{\theta}}(s,a)<V_\theta(s)\right)\right|\cdot\left(Q_{\hat{\theta}}(s,a)-V_\theta(s)\right)^2\right]
这是一个不对称的平方损失:当 Q 大于 V 时多给权重,V 就被“向上拉”,学到有利动作的水平。
  1. 分位参数 τ控制 V 偏向高价值动作的程度,τ 越大 V 越接近数据中最好的动作。
    τ∈(0,1),τ=0.7\tau\in(0,1),\quad \tau=0.7
  2. 指示函数当 Q(s,a) 低于 V(s) 时为 1,否则为 0,决定损失来自上方还是下方。
    1(Qθ^(s,a)<Vθ(s))\mathbb{1}\left(Q_{\hat{\theta}}(s,a)<V_\theta(s)\right)
  3. 平方差距Q 与 V 的差平方,保证损失可导且对大偏差更敏感。
    (Qθ^(s,a)−Vθ(s))2\left(Q_{\hat{\theta}}(s,a)-V_\theta(s)\right)^2
  4. 不对称权重τ>0.5 时,上方样本权重更大,迫使 V 向高分位移动。
    ∣τ−1(Qθ^<Vθ)∣\left|\tau-\mathbb{1}(Q_{\hat{\theta}}<V_\theta)\right|

决策Transformer:剧本派的目标条件重演

第三位教练更另类:他既不评估价值,也不研究“为什么”,而是把老王的成功行程拍成剧本。每一行台词是“我此时想赚多少钱(剩余目标回报)|当前路况|老王怎么操作”。训练时让学员看前面的台词,预测下一句台词(该做的操作)。正式演出时,先设置一个“今天要赚 500 块”的目标,模型就按剧本一路演下去。

这就是 Decision Transformer(决策 Transformer,DT)的核心:把强化学习变成条件序列建模。它把轨迹切成一连串三元组 (R_t, s_t, a_t),其中 R_t 是从 t 时刻起到结束还能拿到的折现回报(return-to-go)。模型用类似 GPT 的 Transformer 结构,自回归地预测当前动作。

预测公式:

剧本派的长处是稳定、可控、适合生成;短处是它本质是“条件模仿”,如果目标回报设得远超日志水平,剧本就会开始“硬编”。想让 AI 开得更好,得给它看更好的戏。

πθ(at∣R≤t, s≤t, a<t),Rt=∑t′=tTγt′−trt′\displaystyle \pi_\theta\left(a_t\mid R_{\le t},\,s_{\le t},\,a_{<t}\right),\qquad R_t=\sum_{t'=t}^{T}\gamma^{t'-t}r_{t'}
DT 不看因果、不做 bootstrapping,它只学习“目标—状态—动作”之间的序列规律。
  1. 目标回报R_t 表示未来还能拿到的折现总回报,一个随时间缩水的“剩余任务目标”。
    Rt=∑t′=tTγt′−trt′R_t=\sum_{t'=t}^{T}\gamma^{t'-t}r_{t'}
  2. 历史条件模型能看到从开始到当前的所有回报、状态和动作,构成完整上下文。
    (R≤t, s≤t, a<t)(R_{\le t},\,s_{\le t},\,a_{<t})
  3. 自回归预测当前动作 a_t 从条件分布中采样得到。
    πθ(at∣R≤t, s≤t, a<t)\pi_\theta\left(a_t\mid R_{\le t},\,s_{\le t},\,a_{<t}\right)
  4. 监督训练用日志中的真实动作做标签,最小化动作预测误差。
    LDT=Eτ∼D[(at−a^t)2]\mathcal{L}_{\mathrm{DT}}=\mathbb{E}_{\tau\sim\mathcal{D}}\left[\left(a_t-\hat{a}_t\right)^2\right]

算法横向对比:选教练的智慧

三位教练,三种风格:保守派谨慎、务实派高效、剧本派可控。选谁,取决于你的日志质量与任务目标。CQL 适合日志覆盖广但有噪声的数据;IQL 适合数据质量尚可但覆盖不均的数据——它天然只关注“有利路段”;DT 适合奖励目标清晰、需要条件式生成完整轨迹的任务。

它们的核心差异在于如何处理分布偏移:CQL 显式惩罚 OOD 动作的 Q 值;IQL 通过分位数回归绕开对 OOD 动作的查询;DT 则根本不建立价值函数,用条件序列建模规避 Q 外推,代价是更重的 Transformer 训练开销与数据连贯性要求。

一个直观的性质总结为不等式:

选教练的智慧在于匹配:数据覆盖面广、噪声大就选保守派;数据好但覆盖窄就选务实派;要生成可控轨迹就选剧本派。没有最好,只有最合适。

Q^CQL(s,a)  ≤  Q∗(s,a)  ≤  Q^standard(s,a)\displaystyle \hat{Q}^{\mathrm{CQL}}(s,a)\;\le\;Q^{\ast}(s,a)\;\le\;\hat{Q}^{\mathrm{standard}}(s,a)
同样的数据下,标准离线 Q 学习容易高估,CQL 给出保守下界,真实值夹在两者之间。
  1. CQL 估计经过惩罚后的 Q 值,是真实价值的保守下界。
    Q^CQL(s,a)\hat{Q}^{\mathrm{CQL}}(s,a)
  2. 真实最优理论上能达到的最优动作价值,是唯一的“标尺”。
    Q∗(s,a)=max⁡πE[∑tγtrt]Q^{\ast}(s,a)=\max_{\pi}\mathbb{E}\left[\sum_{t}\gamma^t r_t\right]
  3. 标准估计直接用 max 备份学出的 Q,因外推误差往往偏高。
    Q^standard(s,a)\hat{Q}^{\mathrm{standard}}(s,a)
  4. 不等式含义CQL 宁可低估也不高估,而低估在离线场景是可接受的错误方向。
    Q^CQL≤Q∗≤Q^standard\hat{Q}^{\mathrm{CQL}}\le Q^{\ast}\le \hat{Q}^{\mathrm{standard}}

工程实现要点:驾校的排课与验收

定好教练后,驾校还得排课表和验收标准。离线 RL 的工程链路与此惊人一致:先清洗日志(数据预处理),再设计训练流程(网络结构与超参),最后模拟考试(离线评估)。任何一环偷懒,学员都会在真实路上出问题。

数据预处理:观测归一化(不同量纲的速度、位置),奖励缩放与截断(不同系统的打分习惯),轨迹过滤(剔除失败或噪声大的 episode)。网络结构:CQL/IQL 用标准 MLP 的 Q 网络/V 网络加 target network;DT 用 GPT 式 Transformer,需要位置编码和固定长度的上下文窗口 K。超参数:CQL 的 α、IQL 的 τ、DT 的 return-to-go 分桶与上下文长度。

评估是离线 RL 最反直觉的一环——你无法直接上线试错,只能用基准分数做相对的横向比较。最常用的 D4RL 归一化分数:

排课表(预处理)、练法(训练)、验收(评估)三位一体,配合 D4RL 等标准化基准,离线强化学习才能从论文走向工程。

Score=100×Ragent−RrandomRexpert−Rrandom\displaystyle \text{Score}=100\times\frac{R_{\mathrm{agent}}-R_{\mathrm{random}}}{R_{\mathrm{expert}}-R_{\mathrm{random}}}
把智能体回报放到“随机策略”与“专家策略”之间的标尺上,换算成百分制。
  1. 智能体回报被评估策略在环境中跑出的平均折扣回报。
    RagentR_{\mathrm{agent}}
  2. 随机基线纯随机策略的回报,作为最差参考线。
    RrandomR_{\mathrm{random}}
  3. 专家上限专家策略的回报,作为最好参考线。
    RexpertR_{\mathrm{expert}}
  4. 百分制归一分子是智能体超越随机的幅度,除以专家与随机的差距,再乘 100。
    Score=100×Ragent−RrandomRexpert−Rrandom\text{Score}=100\times\frac{R_{\mathrm{agent}}-R_{\mathrm{random}}}{R_{\mathrm{expert}}-R_{\mathrm{random}}}

产业应用图谱:车队的大数据传承

离线 RL 之所以火,是因为现实中大量场景“试错极贵”:推荐系统拿用户当小白鼠会流失用户,机器人摔一次就是真金白银,医疗方案出错人命关天。但这些行业最不缺的,就是历史日志。把日志喂给三个算法,就能把一家公司积累的经验,复制成无数个不会翻车的新司机。

适用离线 RL 的判据有三条:有大量历史决策日志、实时试错成本高、策略需要持续优化。推荐系统用用户行为日志学点击与转化策略;机器人用遥操作示教数据学抓取技能;医疗依据历史诊疗记录辅助决策;自动驾驶基于路测数据学习驾驶行为。

这些应用背后有一个共同的数学约束——策略的支持集不能超出行为策略的覆盖范围:

离线强化学习让历史的车轮变成数据,让数据的经验变成决策。无论你是做推荐、机器人还是自动驾驶,这套“读日志学开车”的逻辑,都会是落地 AI 决策能力的关键一环。

max⁡π  Es∼D, a∼π[Qπ(s,a)]s.t.supp ⁣(π(⋅∣s))⊆supp ⁣(πβ(⋅∣s))\displaystyle \max_{\pi}\;\mathbb{E}_{s\sim\mathcal{D},\,a\sim\pi}\left[Q^\pi(s,a)\right]\quad\text{s.t.}\quad \mathrm{supp}\!\left(\pi(\cdot\mid s)\right)\subseteq\mathrm{supp}\!\left(\pi_\beta(\cdot\mid s)\right)
翻译成人话:你可以比老司机开得好,但别开到他没去过的地方——那是三大算法共同的底线。
  1. 优化目标在数据集呈现的状态上,让策略选择的动作价值总和最大。
    max⁡πEs∼D, a∼π[Qπ(s,a)]\max_{\pi}\mathbb{E}_{s\sim\mathcal{D},\,a\sim\pi}\left[Q^\pi(s,a)\right]
  2. 策略支持集策略 π 在某个状态下所有可能选择的动作集合。
    supp(π(⋅∣s))\mathrm{supp}(\pi(\cdot\mid s))
  3. 行为策略覆盖行为策略 π_β 在该状态下实际出现(被记录过)的动作集合。
    supp(πβ(⋅∣s))\mathrm{supp}(\pi_\beta(\cdot\mid s))
  4. 子集约束π 只能选择 π_β 覆盖过的动作,从根上杜绝分布偏移。
    supp(π)⊆supp(πβ)\mathrm{supp}(\pi)\subseteq\mathrm{supp}(\pi_\beta)

AI 应用场景

推荐系统离线策略优化

阶段:策略优化(离线学习)

解决的问题:在线 A/B 实验成本高、试错伤害用户体验。传统方式只能靠人工规则或在线探索调参,无法安全地利用海量历史行为日志。IQL 可从用户点击与转化日志中提取“有利动作”价值,在不上线试错的前提下优化推荐策略。

具体案例:某电商平台积累了数亿条“曝光—点击—成交”日志,用 IQL(τ=0.8)训练推荐策略,把高价值交互(成交)权重拉高,离线评估点击率提升 5%,上线后无风险平稳放量。

机器人操作技能学习

阶段:数据驱动策略学习

解决的问题:真人遥操作示教成本高,机器人试错可能损坏设备与工件。CQL 的“陌生操作扣分”机制正好适合从示教数据中学保守策略,避免 OOD 动作导致夹爪碰撞或奇异位形。

具体案例:某实验室用 2000 条遥操作抓取轨迹训练双臂机器人,CQL 将高危急停动作的 Q 值压低 40%,抓取成功率从行为克隆的 71% 提升到 86%,且测试中从未出现危险位形。

自动驾驶决策模型训练

阶段:离线决策生成

解决的问题:真实路测试错成本与安全风险极高,无法大规模在线学习。DT 把路测日志组织成 (return-to-go, 状态,动作) 序列,以目标车速、目标路线为条件生成驾驶行为,适合离线训练与条件可控生成。

具体案例:自动驾驶公司用 100 万公里路测数据训练 DT 决策模型做直行、变道与跟车决策,测试中能以指定巡航车速生成平滑轨迹,变道决策与人类驾驶员一致性达 92%。

Python 演示

python90 行
import numpy as np N = 10GOAL = N - 1GAMMA = 0.9LR = 0.1EP = 200ACT = [1, 0, -1]  # 动作: 0=右, 1=停, 2=左rng = np.random.default_rng(0) # 行为策略生成离线数据: 一半向右一半向左, 起点偶尔停def gen(n=600):    D = []    for _ in range(n):        s = 0        for _ in range(30):            a = 0 if rng.random() < 0.5 else 2            if s == 0 and rng.random() < 0.2:                a = 1            s2 = min(max(s + ACT[a], 0), N - 1)            r = 1.0 if s2 == GOAL else 0.0            D.append((s, a, r, s2, int(s2 == GOAL)))            if s2 == GOAL:                break            s = s2    return D D = gen() # 标准离线 Q 学习: max 备份是高估根源def td(Q):    for _ in range(EP):        for s, a, r, s2, d in D:            Q[s, a] += LR * (r + GAMMA * Q[s2].max() * (1 - d) - Q[s, a]) # CQL 简化版: 对高于均值的 Q(往往是OOD动作)做惩罚def cql(Q, lam=1.0):    for _ in range(EP):        for s, a, r, s2, d in D:            tar = r + GAMMA * Q[s2].max() * (1 - d)            Q[s, a] += LR * (tar - Q[s, a] + lam * (Q[s].mean() - Q[s, a])) # IQL: 用 expectile 回归学 V, 用 V 替代 max 更新 Qdef iql(Q, V, tau=0.7):    for _ in range(EP):        for s, a, r, s2, d in D:            u = Q[s, a] - V[s]            V[s] += LR * (tau if u > 0 else 1 - tau) * u        for s, a, r, s2, d in D:            Q[s, a] += LR * (r + GAMMA * V[s2] * (1 - d) - Q[s, a]) # 优势加权行为克隆: IQL 的策略提取def awr(Q, V, beta=3.0):    P = np.zeros((N, 3))    for s, a, r, s2, d in D:        P[s, a] += np.exp(beta * (Q[s, a] - V[s]))    P = P / np.maximum(P.sum(axis=1, keepdims=True), 1)    return P # 评估: 从起点 rollout, 返回折扣总回报def run(Q=None, P=None):    s, total = 0, 0.0    for t in range(20):        a = int(np.argmax(Q[s])) if P is None else int(np.argmax(P[s]))        s2 = min(max(s + ACT[a], 0), N - 1)        r = 1.0 if s2 == GOAL else 0.0        total += r * GAMMA ** t        if s2 == GOAL:            return total        s = s2    return total Q1 = np.ones((N, 3)); td(Q1)Q2 = np.ones((N, 3)); cql(Q2)Q3 = np.ones((N, 3)); V = np.zeros(N); iql(Q3, V); P = awr(Q3, V) print('标准离线Q:', round(run(Q1), 3))print('CQL      :', round(run(Q2), 3))print('IQL+AWR  :', round(run(Q3, P), 3)) # DT: 将轨迹转成 return-to-go 序列def to_rtg(traj):    seq, g = [], 0.0    for s, a, r, s2, d in reversed(traj):        g = r + GAMMA * g        seq.append((s, a, round(g, 2)))    return list(reversed(seq)) demo = [(i, 0, 0.0, i + 1, 0) for i in range(8)] + [(8, 0, 1.0, 9, 1)]print('RTG序列示例:', to_rtg(demo)[:4])
目的:用一个 10 格的 1D 网格世界演示离线 RL 的经典困境——乐观初始化下 OOD 动作被高估,并对比标准 Q 学习、CQL、IQL 三种更新规则的效果。
  1. a = 0 if rng.random() < 0.5 else 2行为策略以一半概率向右、一半概率向左,制造“平庸但可学习”的离线数据
  2. if s == 0 and rng.random() < 0.2: a = 1让“停”这个动作只在起点被记录,其余状态成为 OOD 动作
  3. Q[s, a] += LR * (r + GAMMA * Q[s2].max() * (1 - d) - Q[s, a])标准离线 Q 的贝尔曼更新,max 是高估隐患
  4. Q[s, a] += LR * (tar - Q[s, a] + lam * (Q[s].mean() - Q[s, a]))CQL 惩罚项:高于均值的 Q(往往是没见过的动作)被压低
  5. u = Q[s, a] - V[s]IQL 计算动作 Q 与状态价值 V 的差,作为“有利程度”信号
  6. V[s] += LR * (tau if u > 0 else 1 - tau) * uexpectile 不对称更新,τ>0.5 时 V 偏向有利动作
  7. Q[s, a] += LR * (r + GAMMA * V[s2] * (1 - d) - Q[s, a])IQL 用 V 替代 max,绕开 OOD 查询
  8. P[s, a] += np.exp(beta * (Q[s, a] - V[s]))优势加权克隆:只提高数据中有利动作的概率
  9. Q1 = np.ones((N, 3)); td(Q1)乐观初始化模拟网络初始噪声,让 OOD 动作的 Q 保持高位
  10. total += r * GAMMA ** t折扣回报评估,到达目标即返回

常见误区

误区离线强化学习不就是把专家的日志数据拿来训练,模仿专家的操作吗?跟行为克隆(Behavior Cloning)有什么区别?为什么要搞 CQL/IQL 这么复杂?

正解行为克隆只做“输入状态→输出日志里的动作”的监督学习,它永远无法超越行为策略,数据噪声大时会学到平庸甚至有害的策略。离线 RL 从数据中估计价值、优化策略,能做出比行为策略更优的决策。好比照抄老司机的操作是“背台词”,而离线 RL 是理解“为什么这样开能赚钱”。

为何常见:两者都用静态数据集做监督式训练,表面形式高度相似,初学者很容易把“模仿”和“从数据中优化价值”混为一谈。

误区既然 CQL 要压低 Q 值,那学到的 Q 值越低越好,策略越保守越安全。直接把所有动作的 Q 都压到很小不就行了?

正解CQL 压低的是“日志外动作”的 Q 值,对日志内动作反而会抬升,目标是得到真实 Q 的保守下界而非整体打折。公式里第二项 E_{(s,a)~D}[Q(s,a)] 正是为了防止无脑压低。盲目压低会让策略畏手畏脚,连数据里稳妥的路线都不敢走。

为何常见:只记住了“保守”和“压低”两个关键词,忽略了 CQL 正则项中“压低陌生、托起熟悉”的平衡结构。

误区行为策略在线采集数据时顺便用标准 Q-learning 训练 Q 网络,把训练好的网络和数据一起保存下来,不就是离线 RL 了吗?

正解标准 Q-learning 的 max 算子会对 OOD 动作外推产生高估,直接离线用会崩溃。离线 RL 必须加保守机制——要么像 CQL 惩罚 OOD 的 Q,要么像 IQL 用分位数回避 OOD 查询,要么像 DT 不建价值函数。日志里没写过的郊区小路,标准方法只会“想当然”地以为能抄近路。

为何常见:在线 DQN 在数据充足时工作良好,初学者容易忽视“数据覆盖率”这一前提,误以为网络参数可以直接迁移到离线场景。

误区Decision Transformer 把强化学习变成了监督学习,所以它不可能具备超越行为策略的能力,也没有任何“强化”可言。

正解DT 以 return-to-go 为条件做序列建模,推理时给出更高的目标回报就能生成超出数据集平均水平的轨迹,具备一定的外推能力。但它本质仍是条件模仿,外推上限受数据分布限制,需要与保守方法结合理解。剧本派教练演的剧本来自老王的经历,但给个更高目标也能发挥出更好的表现——前提是剧本里有素材。

为何常见:只看“监督学习外壳”,忽视了“以目标回报为条件”这一关键设计,而条件生成恰恰是它可以外推的根源。

面试题

Q1. 离线强化学习与在线强化学习最本质的区别是?

单选题 · easy

  • A.离线不用神经网络,在线使用神经网络
  • B.离线从固定数据集学习,不与环境交互采新数据← 正确答案
  • C.离线只学策略不学价值,在线两者都学
  • D.离线仅支持离散动作,在线支持连续动作

答案:B。离线 RL 的“无交互试错”是最本质区别。网络结构、价值函数、动作空间都不是离线与在线的分界线;离线同样可以用神经网络、学价值函数、处理连续动作。好比学徒不能上路试驾,只能翻日志。

Q2. 离线强化学习中“OOD 动作”一般指?

单选题 · easy

  • A.日志中可被反复验证的高频动作
  • B.与环境在线交互时随机采样的动作
  • C.未被行为策略数据覆盖区域出现的动作← 正确答案
  • D.历史上曾导致严重事故的错误动作

答案:C。OOD 即 out-of-distribution,指没有被行为策略记录过的(状态,动作)组合,比如日志中从没出现过的“郊区小路”。它是价值高估的温床,与动作是否高频、是否随机、是否曾出事故无关。

Q3. Decision Transformer 将强化学习转化为?

单选题 · easy

  • A.一步步迭代求解贝尔曼方程
  • B.以目标回报为条件的序列建模任务← 正确答案
  • C.用策略梯度搜索最优策略
  • D.以蒙特卡洛树搜索遍历状态

答案:B。DT 把轨迹组织成 (R_t, s_t, a_t) 三元组序列,用 Transformer 自回归预测动作,目标是条件序列建模而非值迭代、策略梯度或树搜索。它像剧本派教练,只学“目标—状态—动作”的台词语序。

Q4. 标准 Q 学习直接用于固定数据集,最典型的问题是?

单选题 · mid

  • A.训练数据量不足导致过拟合
  • B.对数据外动作产生价值高估← 正确答案
  • C.神经网络无法拟合价值函数
  • D.奖励信号衰减导致无法收敛

答案:B。标准 Q 学习更新式中的 max 算子会对 OOD 动作外推,产生虚高的价值估计,诱导策略选择日志外的危险操作。这不是过拟合、网络能力或奖励衰减问题,而是“对陌生路段盲目自信”的结构性缺陷。

Q5. CQL 抑制 OOD 动作价值高估的关键手段是?

单选题 · mid

  • A.把折扣因子降低到接近零
  • B.压低陌生动作Q并抬升熟悉动作Q← 正确答案
  • C.用随机策略替代所有 Q 表估计
  • D.只更新状态价值不更新动作价值

答案:B。CQL 的损失包含两项:压低任意分布(含 OOD)动作的 Q,同时抬升数据内动作的 Q。两项相减实现对陌生动作“扣分”、对熟悉动作“加分”。降低折扣因子、随机化策略或只学 V 都不是 CQL 的做法。

Q6. IQL 中参数 τ 设为 0.7 的含义是?

单选题 · mid

  • A.价值函数偏向数据内有利动作的高分位← 正确答案
  • B.学习率按 0.7 的比率逐轮衰减
  • C.折扣因子从默认值改为 0.7
  • D.探索噪声的方差固定为 0.7

答案:A。τ 是 expectile 回归的分位参数。τ>0.5 时,V(s) 被推向数据内动作 Q 值的高分位(第 70 分位),即“只学有利动作的水平”。它不是学习率、折扣因子或探索噪声。

Q7. 关于离线 RL 数据质量与数量,下列说法正确的是?

单选题 · mid

  • A.数据量越大,离线训练效果必然越好
  • B.数据覆盖比数量关键,缺口引发高估← 正确答案
  • C.数据越杂乱,训练出的策略越稳健
  • D.只需保留专家成功轨迹即可

答案:B。离线 RL 的核心风险是覆盖缺口导致的 OOD 高估,因此覆盖面比绝对数量更关键。数据量大但缺失关键区域反而危险;杂乱数据会引入噪声;只留专家轨迹虽然安全但策略平庸,无法超越行为策略。

Q8. 以下哪些场景适合采用离线强化学习?

多选题 · mid

  • A.推荐系统基于用户历史点击日志优化推荐策略← 正确答案
  • B.机器人基于遥操作示教数据学习抓取动作← 正确答案
  • C.游戏 AI 在模拟器中边玩边收集奖励在线调参
  • D.自动驾驶基于百万公里路测日志训练决策模型← 正确答案

答案:ABD。A、B、D 都满足“有历史日志 + 试错代价高”的离线条件。C 是典型的在线交互场景,可以在模拟器中实时试错,不需要离线 RL。“不能试驾只能翻日志”的场景才需要离线方法。

Q9. 关于 CQL 与 IQL 的差异,正确的描述包括?

多选题 · hard

  • A.CQL 显式压低 OOD 动作的 Q 值估计← 正确答案
  • B.IQL 通过分位数回归跳过 OOD 动作查询← 正确答案
  • C.CQL 与 IQL 都完全不做任何动作价值估计
  • D.CQL 学出的 Q 值可看作真实价值的保守下界← 正确答案

答案:ABD。CQL 用正则项显式惩罚 OOD 动作的 Q,并让学出的 Q 成为真实价值的保守下界;IQL 用 expectile 回归训练 V,避开 max 对 OOD 的查询。C 错误,CQL 本身就在做动作价值估计,只是加了惩罚。

Q10. 数据覆盖不全但质量尚可,任务需要条件式生成不同目标回报的轨迹,可选方案是?

多选题 · extreme

  • A.用 IQL 提取有利动作价值再配合优势加权策略← 正确答案
  • B.用 CQL 保守学习以规避 OOD 高估风险← 正确答案
  • C.用 DT 无条件做行为克隆式下一动作预测
  • D.用 DT 以 return-to-go 为条件生成目标轨迹← 正确答案

答案:ABD。覆盖不全时 IQL 的“只学有利动作”与 CQL 的“保守压低”都是合理的防护;DT 的价值正在于以 return-to-go 为条件生成不同目标的轨迹。C 无条件预测退化为行为克隆,无法实现“指定目标回报”的条件式生成。