逆强化学习与学徒学习:从专家示范中学会奖励函数的实践指南 先讲个我自己的经历。前几年做机械臂抓取实验为了让智能体学会把积木码整齐我给奖励函数写了六大项距离惩罚、对齐奖励、碰撞惩罚……前前后后调了两周权重最后它学会的却是先把积木推到桌子边上再弹回来——每个时间步都能吃到一点奖励积木永远摆不齐。那一刻我意识到强化学习真正的瓶颈根本不是算法而是“怎么把我想让它做的事翻译成一个奖励函数”。而逆强化学习Inverse Reinforcement Learning, IRL和它最经典的一支——学徒学习Apprenticeship Learning正是针对这个痛点提出的与其自己费劲写奖励不如直接给一堆专家示范让算法自己琢磨“专家到底在优化什么”。这篇文章从动机、数学定义、算法主循环到手算例子把这套东西完整过一遍。适合已经了解 MDP 和基本强化学习、想踏入模仿学习或逆强化学习门槛的读者。1. 奖励函数设计这个老难题学徒学习为什么要“反过来学”1.1 奖励工程的日常与翻车标准强化学习的工作流大家都熟悉定义状态和动作精心设计奖励函数然后丢给算法去最大化累计回报。问题在于奖励函数本质上是我们对“意图”的代理描述而代理描述永远有漏洞。只要优化器足够强它一定会钻空子。我见过最典型的翻车案例是那种“绕圈刷分”的自动驾驶游戏奖励里写了“向前开得越远得分越高”结果智能体学会了在一个环形赛道上原地转圈因为转圈可以不停吃到“前进”奖励完赛反而得分低。还有著名的 CoastRunners 帆船游戏智能体学会在海上绕着一个浮标打转完全放弃了真正的比赛路线。这些现象在圈内有个专门的名字reward hacking。这件事的根源在于真实任务的目标往往非常复杂很难用几十行奖励函数精确表达。你写“靠近目标给分”它就可能在目标附近抖动你写“速度接近限速给分”它就可能在限速附近来回震荡。调参两星期智能体干的事和你想要的永远差一点。逆强化学习换了一个提问方式不告诉智能体什么是对的只给它看专家是怎么做的让它自己判断专家在追求什么。1.2 逆强化学习的基本姿态从示范里学“立场”逆强化学习的目标是从专家示范轨迹中反推出专家的奖励函数或至少反推出一种能解释专家行为的奖励函数。这个名字里的“逆”指的就是把“给定奖励求最优策略”这个过程倒过来现在策略行为是已知的奖励反而是未知的。这个问题最早由 Ng 和 Russell 在 2000 年系统化地提出他们证明了直接从示范中精确恢复奖励函数在数学上是病态的——同一个专家行为可以被无数个不同的奖励函数解释。举个例子一个始终保持车道居中的自动驾驶专家既可能在“奖励居中”也可能在“惩罚偏离”还可能只是“讨厌大幅转向”这三者行为上几乎不可区分。学徒学习Apprenticeship Learning是 Abbeel 和 Ng 在 2004 年发表的经典工作它对上面这个困局做了一个非常务实的转向既然精确恢复奖励不现实那就不去纠结“专家真实奖励是什么”而是退一步只要学到的策略在长期累计回报上能达到专家水平就行。换句话说学徒跟着师傅干活不需要复刻师傅的每一个念头只需要学会师傅真正在乎的长期结果。1.3 学徒学习与行为克隆的本质区别很多刚接触这个领域的人会问这和直接用监督学习做行为克隆Behavior Cloning, BC有什么区别区别很大。行为克隆把专家示范当作标注好的数据集用状态预测动作本质上是监督学习。它的问题在于“协变量偏移”covariate shift训练时看到的是专家的状态分布部署时一旦第一步动作有偏差就进入一个训练分布之外的状态误差会像滚雪球一样累积。简单说行为克隆记住的是“专家在每个状态下做了什么”但没学会“专家为什么这么做”更没有学会“如果偏离了怎么回到正轨”。学徒学习则是在一个完整 MDP 里做策略搜索的循环每一轮都要在当前猜测的奖励下重新求解最优策略因此它天然具备“从任何状态规划回正轨”的能力。它需要的条件也更苛刻要有可交互的环境或者足够精确的动力学模型并且每一轮都要跑一次完整 RL。这两种方法的关系不是替代而是不同约束条件下的不同选择。用一个表格可以看得很清楚对比维度行为克隆学徒学习核心方式监督学习状态→动作逆强化学习 策略优化是否依赖环境交互不依赖依赖对示范数据量需求通常较大相对可以少一些误差累积问题严重几乎没有产出物策略奖励方向 策略适用场景只能离线采集数据有模拟器或可交互环境2. 学徒学习的问题定义与特征期望这个核心工具2.1 丢掉了奖励的 MDPMDP\R学徒学习的环境定义是一个“去掉了奖励”的马尔可夫决策过程记作 MDP\R即 MDP (S, A, T, γ) 中只有状态集、动作集、转移概率和折扣因子没有奖励函数。我们有专家用未知策略 π_E 与环境交互产生的若干条轨迹每条轨迹形如 (s_0, a_0, s_1, a_1, ...)目标是学到一个策略 π使得 π 在专家真正优化的那个未知奖励函数下长期表现和专家相当。注意这里有一个关键点专家是在某个真实奖励 R* 下做了最优或接近最优决策但这个 R* 对我们不可见。如果环境里能直接拿到 R*这个问题就退化成普通 RL 了。正是因为它拿不到才需要靠“示范”来传递信息。2.2 线性奖励假设为什么敢用 w·φ(s)为了让问题可解Abbeel 和 Ng 做了一个核心假设专家的奖励函数可以写成特征向量的线性形式R(s) w · φ(s)其中 φ(s) 是预定义的状态特征向量w 是未知权重向量并且通常约束 ||w||₂ ≤ 1让奖励尺度有限。你可能会觉得这个假设太强但实际上它远比看起来宽泛φ(s) 可以是任意人工设计的特征比如“是否靠近目标”“当前速度”“离车道中心多远”“是否碰撞”。只要特征足够丰富线性组合就能逼近绝大多数实际奖励设计。更重要的是线性假设带来一个绝妙的数学性质所有策略的特征期望构成一个凸集。这意味着后面所有优化都可以用凸优化工具去处理极大简化了问题。反过来如果奖励是非线性函数特征期望匹配的几何结构就不存在了算法会复杂得多。所以在学徒学习这个框架里“特征工程”才是真正的核心工作后面我会专门讲。2.3 特征期望 μ(π) 与凸几何图像定义策略 π 的特征期望feature expectation为μ(π) E[ Σ_{t0}^∞ γ^t φ(s_t) | π ]也就是策略 π 在环境中运行一整条轨迹后折扣特征和的总期望。它衡量的是“这个策略长期来看在哪些特征上投入了多少‘折扣时间’”。如果专家策略 π_E 在奖励 R* w*·φ 下是最优的那么对任意其他策略 π都有w* · μ(π_E) ≥ w* · μ(π)这意味着在特征期望空间里专家的 μ_E 一定位于所有可达 μ 集合某个支撑超平面上。换句话说如果你把所有可能策略的 μ 画在同一个坐标系里它们会围成一个凸区域专家那一点必然在这个凸区域的某个“外沿顶点”附近并且存在一个方向 w*从该方向看μ_E 是所有点里“最远”的。这个几何图像是整个学徒学习算法的灵魂找奖励方向 w本质上就是找一张能把 μ_E 从凸包里“顶”出去的支撑超平面。而学到一个好策略本质上是让学到的 μ 不断逼近 μ_E。理解了这一点后面的所有算法步骤都顺理成章。3. 算法主循环拆解最大间隔、凸包投影与策略迭代3.1 从分离超平面到奖励方向的几何直觉现在我们手里有什么一开始只有专家示范算出的 μ_E。我们不知道 μ_E 周围的可达集合长什么样只能靠不断探索来“长出”这个集合。算法维护一个已知策略集合 {π_1, ..., π_k}并记录它们各自的特征期望 μ_1, ..., μ_k。然后做这样一件事找一个权重方向 w使得“专家在这个方向上的投影”尽可能远于“当前所有已知策略在这个方向上的投影”。这个差距越大说明 w 越能区分专家和我们已经找到的策略。找到 w 之后把它当作奖励函数的权重用普通 RL 求解这个奖励下的最优策略 π_new然后计算它的 μ_new把它加入已知集合。下一轮继续找新的分离方向。这个过程的几何意义非常直观你手里有一个凸包的碎片已知策略的 μ 组成的凸包你不断找“专家最占优势的方向”然后沿着这个方向把凸包向外扩展一块直到凸包边缘足够接近 μ_E。3.2 最大间隔线性规划与凸包投影的等价关系“找专家最占优势的方向”这一步可以写成一个线性规划maximize tsubject to: w · (μ_E - μ_j) ≥ t, 对 j 1, ..., k‖w‖₂ ≤ 1这里 t 是“间隔”margin表示在方向 w 上专家比当前任意已知策略至少高出多少。如果 t 是正数说明还存在一个能明显区分专家与已知策略的方向如果 t 是负数说明专家已经无法和当前已知策略分开了算法应该停止。这个 LP 有一个非常漂亮的几何等价形式它的最优值 t* 恰好等于 μ_E 到 {μ_1, ..., μ_k} 凸包的最小欧氏距离最优的 w* 则平行于 μ_E 到凸包最近点的方向向量。也就是说你不需要真的解那个 LP只需要把 μ_E 投影到已知策略特征期望的凸包上然后沿着“μ_E 减凸包最近点”的方向走就行。这个投影观点不仅是理解算法的一把钥匙在实际实现时也常用二次规划QP直接算投影。3.3 完整伪代码与收敛性直觉把整个流程串起来核心就是这样一个主循环# 输入专家轨迹 demos特征函数 phi折扣因子 gammaRL 求解器 def apprenticeship_learning(demos, phi, gamma, solver, eps1e-4): # 1. 从专家示范估计特征期望 mu_expert estimate_feature_expectation(demos, phi, gamma) # 2. 初始化随便找一个策略或随机策略算出其特征期望 mu_list [evaluate_policy(random_policy(), phi, gamma)] while True: # 3. 求 μ_expert 到 mu_list 凸包的投影得到方向 w 和距离 t w, closest_point, t project_onto_convex_hull(mu_expert, mu_list) if t eps: break # 4. 用奖励 R(s) w · phi(s) 跑一遍 RL得到新策略 pi_new solver.solve(lambda s: w phi(s)) # 5. 评估新策略的特征期望加入已知集合 mu_new evaluate_policy(pi_new, phi, gamma) mu_list.append(mu_new) # 6. 最终策略从已知策略或它们的混合中挑一个 return select_best_policy_from(mu_list, mu_expert)每一步的执行细节都很关键。第一步估计 μ_E 时如果有大量专家轨迹直接对每条轨迹算折扣特征和再取平均即可。第三步的凸包投影可以用现成的 QP 求解器特征维度不高时自己写一个 Frank-Wolfe 都能跑。第四步是成本大头每轮都要完整解一次 RL 问题这一轮的信息价值就是让凸包向 μ_E 推进一块。收敛性的直觉是这样的每轮迭代新策略的 μ 都在当前最优分离方向 w 上达到最大值因此它必然落在可达凸包的“边界”上并且显著扩展了已知凸包在 μ_E 方向的范围。随着迭代继续μ_E 到已知凸包的距离单调下降。理论保证上Abbeel 和 Ng 证明了迭代次数大致与特征维数 m 正相关、与目标精度 ε 的平方反相关也就是说在特征空间维度不高、精度要求不苛刻时算法能较快收敛。这个样本复杂度界背后用到了凸几何里的 Carathéodory 定理在高维空间里一个凸包中的点总能被至多若干关键顶点张成的“小块”覆盖每次迭代都在逼近这个关键顶点集合。3.4 为什么能保证“和专家一样好”这个算法最反直觉的地方是整个过程没有一步在“恢复真实奖励”但它能保证“在任意与特征线性相关的奖励下最终策略的价值都不比专家差太多”。为什么关键在于特征期望匹配了价值匹配的“充分条件”。如果两个策略的 μ 完全相同那么对任意线性奖励 w·φ它们的期望累计回报都相等。而 μ_E 本身对应专家在真实 w* 下的表现我们的目标是让学到的策略 μ 足够靠近 μ_E这样在 w* 下的价值差距自然就小。算法停止时μ_E 到已知凸包的距离 ≤ ε。这意味着存在一个由已知策略混合而成的点 μ_mix与 μ_E 的距离不超过 ε。又因为 w* 的范数有界‖w*‖≤1两个特征期望之间的最大价值差距就是它们欧氏距离的上界|w* · (μ_E - μ_mix)| ≤ ‖w*‖ · ‖μ_E - μ_mix‖ ≤ ε于是“找到的策略混合体”和专家之间的价值差距被控制住了。这就是为什么学徒学习能在不显式恢复奖励的情况下依然给出策略性能层面的硬保证。也正因如此它比那些“先精确恢复奖励再去优化”的路线在实际中稳健得多。4. 一个手算的 2×2 网格例子从特征到策略的完整推演光讲理论容易飘我拿一个可以完全手算的小网格把每轮迭代算给你看。4.1 环境、特征和专家示范假设一个 2×2 网格世界四个状态分别为 A左上、B右上、C左下、D右下动作是上、下、左、右转移是确定性的撞墙就原地不动折扣因子 γ 0.9初始状态固定在 A。定义两个特征φ₁(s)s 是否在左列A、C 为 1否则 0φ₂(s)s 是否在顶行A、B 为 1否则 0各状态特征向量如下状态φ₁φ₂A左上11B右上01C左下10D右下00专家示范是一条轨迹从 A 出发一路往左走到 C然后一直待在 C 不动。A → C → C → C → …。用 γ0.9 计算特征期望μ_E φ(A) γφ(C) γ²φ(C) ... (1,1) (1,0)·(0.9/(1-0.9)) (1,1) (9,0) (10,1)这个 μ_E 就是算法要逼近的目标点。4.2 第 1 轮随机起点与首次分离方向假设初始随机策略是“一直在 A 待着不动”它的特征期望是μ_0 φ(A) γφ(A) γ²φ(A) ... (1,1)/(1-0.9) (10,10)此时已知集合只有 μ_0 一个点“凸包”就是它本身。μ_E 减 μ_0 得到 (0,-9)归一化后第一个奖励方向是 w₁ (0,-1)也就是说“顶行特征越少越好”。用这个奖励跑 RL四个状态的回报分别是A-1B-1C0D0最优策略是“去 C 或去 D 并待着不动”两者价值都是 0存在平局。这里有个值得注意的细节如果 RL 求解器碰巧选到 C那 μ 直接就等于 μ_E算法立刻收敛。但我们为了展示完整过程假设求解器按 D 的编号顺序优先返回 D于是拿到第二个点 μ_1 (1,1)对应“从 A 去 D 并一直待着”的策略。4.3 第 2 轮凸包投影指向真正目标现在已知集合是 {μ_0(10,10), μ_1(1,1)}它们的凸包是一条线段参数化写成 (10-9s, 10-9s)s∈[0,1]。把 μ_E(10,1) 投影到这条线段上minimize (10-(10-9s))² (1-(10-9s))² (9s)² (9s-9)²求导令其为零得到 s0.5投影点是 (5.5, 5.5)。于是方向向量是 μ_E 减投影点即 (4.5, -4.5)归一化后得 w₂ (1/√2, -1/√2) ≈ (0.707, -0.707)间隔 t 约等于 6.36。用这个方向作为奖励权重各状态回报A0B-0.707C0.707D0。这一次 C 是严格最优价值约 7.07D 的价值是 0A 是 0。RL 会毫不含糊地选出“去 C 并待着”。它的特征期望是μ_2 φ(A) γφ(C) γ²φ(C) ... (1,1) (9,0) (10,1) μ_Eμ_E 到新凸包的距离变成 0循环停止。4.4 这张表里藏着的信息与陷阱把三轮完整信息放一起看轮次已知策略 μ分离方向 w间隔 t新策略新 μ0(10,10)(0,-1)9去 D平局被选(1,1)1(10,10), (1,1)(0.707,-0.707)6.36去 C(10,1)2(10,10), (1,1), (10,1)—0停止—这个例子暴露出几个真实场景里一定会遇到的事。第一最后收敛时得到的 w₂(0.707,-0.707) 并不是“真实奖励”w*(0,-1)。但因为 w₂ 同样让 C 成为严格最优它也是一个能解释专家行为的合法奖励。奖励多解性不是算法 bug而是问题本身固有的性质。第二第 1 轮的平局情况很关键。如果 RL 求解器平局时选了 C算法会在第 1 轮就结束选了 D就得再走一轮。真实代码里平局处理方式会直接影响收敛轨迹最好在实现时固定一个明确的 tie-break 规则否则同样的输入可能跑出不同的中间路径。第三μ_E 在这个例子里是一个“极端点”因为专家策略是确定性的。真实专家往往会有随机性μ_E 会落在凸包内部这时最后一步的间隔 t 不会收敛到 0只会收敛到某个小阈值 ε最终策略通常需要是若干发现策略的混合体而不是单个确定性策略。这一点在工程实现时要格外留意。5. 工程实操特征设计、演示估计和收敛判定的那些坑5.1 特征才是真正的“隐形奖励”学徒学习的理论保证有一个前提专家的真实奖励必须落在你选择的特征空间里。也就是说如果 φ 没有覆盖专家真正在意的因素算法会“安安静静地失败”——它照样收敛、照样给出一个策略但这个策略只是“在给定特征下和专家最接近”而不是真的在优化专家的意图。举一个我做自动驾驶模拟时的例子特征选了“车道中心偏差”和“车速”演示数据里的专家当然也会等红灯但如果特征里没有“红绿灯状态”学出来的策略就会闯红灯。因为从特征期望上看闯红灯和等红灯在这个特征空间里几乎无法区分。所以特征设计时要反复问自己专家在决策时看了什么哪些变量是决定性的把这些变量全部放进特征哪怕你觉得“太简单了”。同时特征的量纲也很重要。w 有范数约束如果不同特征的数值尺度差几个数量级算法会把注意力全放在大数特征上。实操上建议先对每个特征做归一化再进算法。5.2 从有限演示里估计 μ_E样本方差与折扣μ_E 的估计质量直接决定整个算法的上限。它是对专家轨迹求折扣特征和的平均样本量不够时方差会非常大尤其是 γ 接近 1 的长程任务——一条轨迹尾部的折扣贡献累加起来很可观但往往只有少数几条轨迹能覆盖到后期状态。这会导致 μ_E 的估计偏向“前期状态”算法学到的东西也会跟着偏。我的建议是第一记录专家轨迹时尽量跑满有效水平域也就是 1/(1-γ) 这个量级的步数否则尾部特征是纯噪声第二最好把 γ 当作一个需要调的参数而不是环境给的常数数据短就适当减小 γ牺牲一点“远见”换取估计稳定性第三多个专家的演示不要混在一起直接平均先跑一遍聚类看看是否存在明显的多峰行为——如果有说明专家内部本身有多样性这时单个 μ_E 可能不足以刻画需要更强的概率模型。5.3 多解性、随机专家与退化情况前面说过同一个专家行为可以被很多奖励解释。如果你用学徒学习只是为了“学一个能用的策略”这个问题无害但如果你想用学出来的 w 做事后分析比如“原来专家更看重安全而不是速度”那就要非常小心。最大间隔方法选择的那个 w 只是无数可行方向中的一个它取决于初始化、平局处理和凸包扩展路径没有任何统计意义。随机专家也会带来麻烦。当专家策略不是确定性最优而是随机混合时μ_E 不再是凸包的极端点最大间隔找出的方向可能非常“尖”甚至来回跳动。这种情况说明你的模型假设和真实专家行为不匹配就该考虑用最大熵逆强化学习MaxEnt IRL那种把随机性纳入概率框架的方法。还有一类退化问题是特征共线性两个特征高度相关时权重 w 的估计会很不稳定和线性回归里的多重共线性问题一模一样。5.4 收敛判定、超参数与算力平衡每一次主循环都要跑一次完整 RL这个成本一点都不便宜。我见过不少人把阈值 ε 设得极小结果 RL 跑了二十多轮后面几轮其实只是在修正噪声。实操上我建议每轮都记录 t 值画一条“t 随迭代轮次变化”的曲线如果 t 已经降到 0.01 量级而且好几轮没有明显下降直接停。比 t 更直观的监控指标是“当前已知凸包到 μ_E 的欧氏距离”它和 t 本质上是同一个数但单位更接近特征空间的实际尺度。另外内层 RL 求解器每次都是从头开始训练是非常浪费的。上一轮的 w 和这一轮的 w 往往相差不大最优策略也不会差太远可以用上一轮策略做初始化warm start能省下大量样本。还有一个小技巧如果只是想让凸包快速覆盖有效区域前几轮可以用更粗糙的 RL 精度等到 t 接近阈值时再把精度拉满整体算力消耗会平滑很多。6. 从学徒学习到最大熵 IRL技术演进的一条清晰主线6.1 最大间隔的任性之处学徒学习的最大间隔准则有一个隐藏问题当多个方向都能解释专家行为时它选哪一个完全取决于凸包扩展的历史路径而不是任何更本质的原则。在上面的网格例子里w₂ 和真实 w* 都能解释专家算法选了 w₂ 只是因为凸包路径走到了那里。这个“任意性”在只需要策略时无所谓但如果要拿奖励分析专家动机就会误导人。另一个问题是它没有概率解释。专家示范在真实世界里总是带噪声的人类演示动作不一致同一个场景可能有时左转有时右转。最大间隔方法把这种随机性当作纯粹的“干扰”没有办法告诉你“专家这样做的概率有多大”。对于需要不确定性建模的下游任务比如预测行人轨迹、人机协作风险估计这种不足是致命的。6.2 最大熵原理补上了概率解释Ziebart 等人在 2008 年提出的最大熵逆强化学习Maximum Entropy IRL是对学徒学习最直接、也最优雅的改进。它保留了“专家特征期望匹配”这个核心思想但换了一个原则在所有能满足特征期望约束的奖励函数中选择使得专家轨迹概率分布熵最大的那一个。直观地说就是“在不多做假设的前提下选择最不武断、最平均主义的那个解释”。这个改动带来两个实际好处。一是奖励权重有了概率意义每个状态动作的收益可以通过 soft-max 形式表达专家的随机行为被自然地建模为“收益差异越大选择越确定”。二是优化目标变成可微的能用梯度法直接求权重实践中稳定性比每轮跑 LP 加 RL 的交互式流程好很多。这个工作几乎成了后续十年逆强化学习在真实应用里的默认起点尤其在人行道行人轨迹预测、室内导航这类场景中效果非常好。如果把我的网格例子拿过去最大熵 IRL 会把平局时的“去 C”和“去 D”赋予接近 0.5 的概率而不是像学徒学习那样被迫二选一——这就是两种哲学的本质差异。6.3 后续的 Bayesian IRL 与 GAIL以及学徒学习的适用场景学徒学习这条线上还衍生出两个重要分支。一个是 Ramachandran 和 Amir 在 2007 年提出的贝叶斯逆强化学习把奖励权重当作随机变量用先验分布加示范数据反推后验分布好处是能给出奖励的不确定性界代价是推断成本高。另一个是 Ho 和 Ermon 在 2016 年提出的 GAIL它跳过了“显式恢复奖励”这一环直接用生成对抗的思路训练一个“专家 - 学习者”判别器让学习者策略的占用度量去匹配专家。GAIL 在连续控制任务上表现惊艳但它失去了可解释的奖励也失去了学徒学习那种基于特征的价值保证。所以学徒学习到底什么时候还值得用我的判断是当特征空间小、需要可解释的奖励、演示数据量不大但环境可以大规模交互时它仍然是最稳的选择。比如机器人抓取策略的奖励分析、手术机器人的动作偏好挖掘、模拟器里“教学式”策略初始化这类场景下它的样本效率和可解释性优势能充分发挥。反过来如果只有一堆离线数据、没有可交互环境那就只能走行为克隆或离线模仿学习如果想做高维视觉输入的直接模仿GAIL 一类的对抗方法更合适。最后再分享一点个人体会。学徒学习看起来简单但真正上手时最容易被低估的是几何直觉的价值。我强烈建议你在写任何完整实现之前先在小网格或玩具环境里把“已知策略凸包 μ_E 投影”这两样可视化出来盯着迭代过程看几轮。你会发现什么时刻会平局、什么时刻距离不再缩小、什么时刻 RL 解在跳跃全都清清楚楚。这些观察比任何论文里的定理都更能帮你理解这套算法的脾气。