设想一个场景:一位顶级大厨端出一盘色香味俱全的鱼香肉丝,你尝了一口,觉得惊为天人。但你不知道这道菜的调料配方——盐放了多少?糖和醋的比例是多少?豆瓣酱炒了多久?普通学徒可能只会照着成品模仿“看起来像”,而真正的“美食侦探”会反向推敲:先猜测配料,再按猜测复刻,复刻出来味道不对,就调整配料,反复迭代,直到端出一模一样的味道。逆强化学习(Inverse Reinforcement Learning, IRL),就是这位美食侦探——它不再像传统强化学习那样由人手动设计“奖励配方”,而是从专家的行为演示(菜肴)中,倒推出专家内心真正追求的“奖励函数”(调料配方),然后再据此学习如何行动。 许多AI从业者会在实际项目中遇到一个尴尬困境:想训练一个机器人倒水,却不知道该怎么设置奖励函数。奖励设得太简单,智能体偷懒;设得太复杂,又会钻空子。逆强化学习提供了一条新路:不需要你设计奖励,只需要你提供一段专家演示——AI自己能从演示中“品尝”出隐含的目标,并还原成一条可优化、可量化的奖励函数。这就是我们这篇文章的主角:逆强化学习。

岗位关联

学会逆强化学习,AI从业者就能从“精心设计奖励”的繁琐与脆弱中解放出来,用专家数据直接驱动智能体学会复杂行为——这是模仿学习、自动驾驶、机器人技能获取等场景的核心能力。

目录
  1. 可视化演示
  2. 奖励困局
  3. 推断目标
  4. 前向强化学习
  5. 最大熵原理
  6. 迭代求解
  7. 深度现代变体
  8. 实际应用落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示从演示倒推奖励的逆强化学习的核心机制,通过采集/分析/决策/反馈四种模式展示关键概念与交互流程。

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

从演示倒推奖励的逆强化学习:逆强化学 逆强化学习核心思想与RL的逆向 专家演示数据的角色与采集要求 核心机制可视化 从演示倒推奖励的逆强化学习整体架构与关键组件

奖励困局

假设你要教一个机器人打乒乓球。传统强化学习的做法是像“菜谱教学”一样:把每一步动作的得分(奖励)都明文写清楚——球拍碰到球得 1 分,落点刁钻得 2 分,打出界扣 1 分……你会发现,无论怎么精心设计这套“评分表”,机器人总能找到你意想不到的“作弊”方式,比如原地转圈混时间。这就是奖励设计的困局(Reward Hacking):人手动设计的奖励函数,往往与真实意图之间存在着微妙的偏差。

但我们换一个思路:如果有一位乒乓球大师已经打出了精彩的比赛录像(专家演示),我们能否不看任何评分表,直接从录像里倒推“大师心中到底在优化什么”?这正是逆强化学习(IRL)的根本出发点。IRL 不要求你定义奖励,它把“设计奖励”这个过程本身变成学习目标——从专家的行为轨迹中推断出奖励函数。在美食比喻中,传统 RL 是“照着菜谱做菜”,IRL 则是“品尝成品,反推配方”。

奖励困局之所以是 IRL 的起点,是因为现实中的许多任务(自动驾驶变道、外科手术、对话策略)极其复杂,人类的真实目标往往“只可意会不可言传”。与其费力把“意会”翻译成显式的奖励公式,不如大量收集专家演示,交给 IRL 自动还原出隐藏在行为背后的“配方”。

推断目标

既然要从演示中倒推奖励,我们首先得定义清楚:我们要推断的“奖励配方”到底是什么?在强化学习中,奖励函数是每个状态下给出一个实数值 \(R(s)\)。它像一份“口味评分表”,告诉智能体“这个状态好”还是“那个状态坏”。IRL 的目标就是找到一份评分表,使得这份评分表最能解释专家为什么那样走。

数学上,这通常用一个“特征期望匹配”(Feature Expectation Matching)的方式来表达。我们把一条轨迹的特征期望定义为专家在该轨迹上访问状态的“偏好分布”:

其中 \(\pi_E\) 是专家策略,\(\phi(s_t)\) 是状态的特征向量(比如“距目标的距离”“附近是否有障碍”),\(\gamma\) 是折扣因子。IRL 的目标是找到奖励参数 \(w\),使 \(R(s) = w^\top \phi(s)\) 满足一个关键条件:专家策略的期望价值不低于任何其他策略。

这里的比喻非常直接:\(\phi(s)\)(特征向量)就像一道菜的“风味维度”——咸、甜、酸、辣;而 \(w\)(权重向量)就是这道菜灵魂的“调料配比”。专家的每一段轨迹,都是在告诉你他偏好哪种味道多一点。IRL 要做的,就是尝遍专家的每一道菜后,最终定下这组配比。

EπE[∑t=0∞γtϕ(st)]\displaystyle \mathbb{E}_{\pi_E}\left[\sum_{t=0}^{\infty} \gamma^t \phi(s_t)\right]
这份“评分表” \(R(s) = w^\top \phi(s)\) 是问题的核心配方假设,\(\phi\) 是我们选择的“品尝维度”(咸度、甜度、温度),\(w\) 是每种维度的权重(该放多少盐)。
  1. 专家特征期望专家在轨迹上积累的“偏好分数”
    μE=EπE[∑t=0∞γtϕ(st)]\displaystyle \mu_E = \mathbb{E}_{\pi_E}\left[\sum_{t=0}^{\infty}\gamma^t \phi(s_t)\right]
  2. 候选奖励奖励函数由特征线性组合表达
    R(s)=w⊤ϕ(s)=∑i=1dwiϕi(s)\displaystyle R(s) = w^\top \phi(s) = \sum_{i=1}^{d} w_i \phi_i(s)
  3. 最优性条件专家的长期回报应当高于一切其他策略
    EπE[∑tγtR(st)]≥Eπ[∑tγtR(st)], ∀π\displaystyle \mathbb{E}_{\pi_E}\left[\sum_t \gamma^t R(s_t)\right] \geq \mathbb{E}_{\pi}\left[\sum_t \gamma^t R(s_t)\right],\ \forall \pi

前向强化学习

要倒推奖励,我们得先有一台“正向引擎”:给定一份奖励配方,去求解最优策略——这就是传统强化学习解决的问题。IRL 并没有绕开强化学习,反而把它当作内嵌的“美食复刻流程”:先按当前猜测的配方做一道菜,再品尝这道菜和大师原作的差距。

前向求解过程可以采用标准的策略迭代或价值迭代:

其中 \(P(s' \mid s,a)\) 是状态转移概率,\(V^*(s)\) 是状态 \(s\) 在最优策略下的价值。这个方程叫贝尔曼最优方程(Bellman Optimality Equation),它像一个“疯狂的石头剪刀布”:每个状态都要选择让自己未来总收益最大的动作,同时把未来的收益折现到今天。

IRL 的特殊之处在于:它并不是只做一次前向求解,而是在一个迭代循环中反复调用这个“做法引擎”——猜一版配方,做一道菜,和大师的作品比一比,再调整配方。这个循环,是 IRL 算法的骨架。

V∗(s)=max⁡a[R(s,a)+γ∑s′P(s′∣s,a)V∗(s′)]\displaystyle V^*(s) = \max_{a} \left[ R(s, a) + \gamma \sum_{s'} P(s' \mid s, a) V^*(s') \right]
如果把奖励函数比作“上调料的菜谱”,贝尔曼方程就是“按菜谱做菜的流程”——每一步选择让整道菜最终最美味的下锅方式。
  1. 动作价值在当前状态 s 先执行 a,再用最优策略走到底,所得期望总回报
    Q∗(s,a)=R(s,a)+γ∑s′P(s′∣s,a)max⁡a′Q∗(s′,a′)\displaystyle Q^*(s, a) = R(s, a) + \gamma \sum_{s'} P(s' \mid s, a) \max_{a'} Q^*(s', a')
  2. 最优价值函数状态 s 的最优价值等于所有动作中最大的 Q 值
    V∗(s)=max⁡aQ∗(s,a)\displaystyle V^*(s) = \max_a Q^*(s, a)
  3. 最优策略提取在每个状态选择让 Q 最大的动作即可
    π∗(s)=arg⁡max⁡aQ∗(s,a)\displaystyle \pi^*(s) = \arg\max_a Q^*(s, a)

最大熵原理

当我们倒推奖励函数时,会遇到一个棘手的问题:能解释专家演示的奖励可能不止一个。比如,专家每次去同一家面馆吃面,可能是因为“面条筋道”,也可能是因为“老板热情”,甚至可能是“楼下停车方便”。三个解释都说得通,哪个才是对的?

最大熵原理(Maximum Entropy Principle)给出的回答是:在满足已知约束的所有可能模型中,选择熵最大的那个——也就是“最随机、最不武断、对未知信息保留最多不确定性”的那个解释。在 IRL 中,这意味着我们不武断地选择某一套极端的奖励,而是选择一套能够“温和地”分配概率给所有可能路径的奖励。最大熵 IRL 将策略概率化为一个 Bolt改 分布(也称玻尔兹曼分布/吉布斯分布):

这里的 \(\tau\) 表示一条完整的轨迹,分子是这条轨迹的“美味指数”(累计奖励的指数),分母是“所有可能轨迹的美味指数之和”。这个公式用"softmax"的方式把所有可能的轨迹都纳入考虑,而不是只锁定唯一的最优轨迹。

最大熵原理巧妙地避免了“过强假设”:它不宣称“专家唯一的路径才是好路径”,而是把专家的路径看作一个概率分布中随机抽取的样本——既尊重专家的选择,也允许合理的多样性。这与美食侦探的智慧一致:不因为大师某次放了三克盐就断言盐必须是三克,而是推断出“盐大概是三克左右,且这个推断对少量波动不太敏感”。

P(τ∣w)=exp⁡(∑tRw(st,at))∑τ′exp⁡(∑tRw(st′,at′))\displaystyle P(\tau \mid w) = \frac{\exp\left(\sum_t R_w(s_t, a_t)\right)}{\sum_{\tau'} \exp\left(\sum_t R_w(s'_t, a'_t)\right)}
分母 \(\sum_{\tau'}\exp(\cdots)\) 在数学上称为配分函数,它像一场美食大赛的全部参赛作品的评分解总和——单道菜的“获胜概率”取决于它相对总分有多突出,而不是孤立地看它的得分。
  1. 轨迹奖励一条轨迹的总回报定义为每个时刻奖励的指数加和
    score(τ)=∑tRw(st,at)=∑tw⊤ϕ(st,at)\displaystyle \mathrm{score}(\tau) = \sum_{t} R_w(s_t, a_t) = \sum_t w^\top \phi(s_t, a_t)
  2. 轨迹概率轨迹概率与“得分指数”成正比
    P(τ∣w)∝exp⁡(score(τ))\displaystyle P(\tau \mid w) \propto \exp\left(\mathrm{score}(\tau)\right)
  3. 归一化除以所有轨迹的得分指数之和,保证概率和为 1
    P(τ∣w)=exp⁡(score(τ))∑τ′exp⁡(score(τ′))\displaystyle P(\tau \mid w) = \frac{\exp(\mathrm{score}(\tau))}{\sum_{\tau'} \exp(\mathrm{score}(\tau'))}
  4. 最大化似然找到让专家轨迹出现概率最大的权重 w
    w∗=arg⁡max⁡w∏τE∈DP(τE∣w)\displaystyle w^* = \arg\max_w \prod_{\tau_E \in \mathcal{D}} P(\tau_E \mid w)

迭代求解

有了最大熵原理作指导,我们就有了可以迭代求解的 IRL 算法。整个求解过程与美食侦探反复做实验高度一致:先凭直觉猜一个配方,做出一道菜;然后对比大师的手艺找出差异;接着调整配方,再重复。在数学上,这对应于对最大熵目标的梯度上升(Gradient Ascent)推导。

最大熵 IRL 的核心结论是:对数似然关于奖励权重 \(w\) 的梯度,等于专家特征期望与当前模型特征期望之差:

直观地说,如果当前模型(根据当前奖励权重学出的策略)在某种特征上“偏少”了(比如模型整体的“咸味”不如专家足),梯度就为正,指引我们加大该特征的权重(多加盐);反之则减少。这个朴素的加减法,构成了 IRL 迭代求解的核心引擎。

整个 IRL 算法流程可以概括为四步走:第一步,随机初始化奖励权重 \(w\);第二步,用当前 \(w\) 做前向强化学习,解得当前最优策略 \(\pi(w)\);第三步,用 \(\pi(w)\) 产出的轨迹计算特征期望,与专家特征期望对比得到梯度;第四步,按梯度更新 \(w\),回到第二步,直到两者之差足够小。

∇wL(w)=EπE[∑tϕ(st)]−Eπ(w)[∑tϕ(st)]\displaystyle \nabla_w \mathcal{L}(w) = \mathbb{E}_{\pi_E}\left[\sum_t \phi(s_t)\right] - \mathbb{E}_{\pi(w)}\left[\sum_t \phi(s_t)\right]
梯度公式的含义非常美丽:专家与我们之间的差异,被浓缩成了“特征期望之差”。每一次迭代,就是一次“照镜子”——模型先摆出自己的姿态,再与专家的姿态对比,最后调整奖励权重让两者逐渐重合。
  1. 对数似然梯度对最大熵目标取对数再对 w 求偏导
    ∇wlog⁡P(τE∣w)=∑tϕ(st)−∑τ′P(τ′∣w)∑tϕ(st′)\displaystyle \nabla_w \log P(\tau_E \mid w) = \sum_t \phi(s_t) - \sum_{\tau'} P(\tau' \mid w)\sum_t \phi(s'_t)
  2. 期望差形式第一项=专家的期望特征;第二项=当前模型的期望特征
    ∇wL(w)=μE−Eπ(w)[μ]\displaystyle \nabla_w \mathcal{L}(w) = \mu_E - \mathbb{E}_{\pi(w)}[\mu]
  3. 更新权重沿着梯度方向调整权重
    w←w+α(μE−Eπ(w)[μ])\displaystyle w \leftarrow w + \alpha \left(\mu_E - \mathbb{E}_{\pi(w)}[\mu]\right)

深度现代变体

早期的 IRL 方法依赖手动设计的特征 \(\phi(s)\),就像侦探只能品尝“咸、甜、酸、辣”四个维度——如果一道菜的精华在于“锅气”(很难显式定义的维度),传统方法就会错过它。深度学习的出现让 IRL 突破了这一限制:用神经网络替代手工特征和线性奖励,自动从原始输入(图像、语音、传感器读数)中学习奖励函数。

在这条技术路线中,最具代表性的工作之一是生成对抗模仿学习(GAIL,Generative Adversarial Imitation Learning)。GAIL 的结构与生成对抗网络(GAN)如出一辙:一个“判别器”(Critic)努力区分专家的轨迹和智能体生成的轨迹,一个“策略”(Actor)努力让自己的轨迹骗过判别器。而那个判别器所隐含的“以假乱真”的信号,恰好可以被理解为一种隐式的奖励函数——判别器分不清谁真谁假时,策略的奖励信号就指向了专家的方向。

其中 \(D\) 是判别器,\(H(\pi)\) 是策略熵正则项,\(\lambda\) 是权重系数。注意这里的 \(\max\) 「推动」判别器 \(D\) 区分“大师的菜”与“学徒的菜”,而 \(\min\) 「驱动」策略 \(\pi\) 让学徒的手艺越来越接近大师,直到判别器无法区分。

深度现代变体的意义在于,IRL 不再局限于“网格世界”这样的小型玩具场景,而能处理真实世界的高维复杂任务——自动驾驶中的道路图像、机器人操作中的关节力矩、游戏中的屏幕像素。美食侦探从只能品出四味,进化到了能品出“千滋百味”的段位,这正是深度 IRL 带来的质变。

min⁡πmax⁡DEπE[log⁡D(s,a)]+Eπ[log⁡(1−D(s,a))]−λH(π)\displaystyle \min_{\pi}\max_{D} \mathbb{E}_{\pi_E}\left[\log D(s, a)\right] + \mathbb{E}_{\pi}\left[\log(1 - D(s, a))\right] - \lambda H(\pi)
GAIL 把 IRL 带入了高维感知时代——不再需要人手工定义“风味维度”,神经网络自己就能发现“锅气”和“层次感”这样的精妙特征。这相当于给美食侦探配上了一台“电子舌”,能品出人尝不出的细微差别。
  1. 判别器目标最大化区分专家与生成数据的能力
    max⁡D  EπE[log⁡D(s,a)]+Eπ[log⁡(1−D(s,a))]\displaystyle \max_D \; \mathbb{E}_{\pi_E}[\log D(s,a)] + \mathbb{E}_{\pi}[\log(1 - D(s,a))]
  2. 策略目标最小化判别器的区分能力,即让生成轨迹更接近专家
    min⁡π  Eπ[log⁡(1−D(s,a))]\displaystyle \min_\pi \; \mathbb{E}_{\pi}[\log(1 - D(s,a))]
  3. 熵正则鼓励策略保持探索,避免模式坍缩
    −λH(π)\displaystyle - \lambda H(\pi)
  4. 完全目标合并后的对抗优化问题
    min⁡πmax⁡D  EπE[log⁡D]+Eπ[log⁡(1−D)]−λH(π)\displaystyle \min_{\pi}\max_{D} \; \mathbb{E}_{\pi_E}[\log D] + \mathbb{E}_{\pi}[\log(1-D)] - \lambda H(\pi)

实际应用落地

深度 IRL 的落地场景非常广泛。在自动驾驶中,我们无法用手写奖励函数精确表达“平稳变道”和“安全超车”的微妙平衡,但可以收集人类司机的大量驾驶演示,用 IRL 学出人类驾驶员的“内在奖励”,再用这个奖励去训练或评估自动驾驶策略。在机器人操作中,机械臂的每一次抓取都是一串动作轨迹,IRL 可以从人类示教中推断出“稳定抓取”背后的真实目标(如抓取后物体的位姿、力的大小),从而让机器人在面对新物体时也能举一反三。在游戏 AI 中,IRL 被用来从人类玩家的操作日志中还原玩家的策略偏好,使 NPC 的行为更贴近真实玩家的风格。

这些应用的共同逻辑,就是我们一直在讲的那句话:行为是看得见的,动机是看不见的——IRL 恰恰是从看得见的行为中推断看不见的动机,再把动机转化为可优化的奖励信号,最终让机器学会“像人一样思考与行动”。

AI 应用场景

自动驾驶轨迹学习

阶段:模仿学习 / 奖励函数获取

解决的问题:自动驾驶中的“平稳变道”“礼让行人”等行为难以用显式奖励公式量化。传统方法要么由工程师手动调参编写奖励函数(容易忽略长尾场景),要么无法解释决策依据。IRL 通过记录人类驾驶员的轨迹数据,自动推断出人类驾驶的内在奖励函数——包括对安全距离、舒适度、通行效率的权衡,从而让自动驾驶策略在复杂交互中表现得像一位老练的司机。

具体案例:某自动驾驶公司采集了 1000 小时的人类驾驶数据,包含高速汇入、城市环岛、无保护左转等场景。利用最大熵 IRL 学习奖励函数后发现:模型自动学到了人类驾驶员“在环岛中偏向保守等待”与“在高速上偏向果断汇入”的差异化偏好,而这些偏好此前从未被工程师显式编码进任何规则中。

机器人模仿学习与技能获取

阶段:示教学习 / 策略优化

解决的问题:让机器人学会“拧瓶盖”“叠衣服”这类精细操作时,手工设计奖励函数几乎不可能——力的控制、物体的形变、任务的中间状态都难以定义。IRL 从人类示教的动作轨迹中倒推出任务的目标函数,再结合强化学习使机器人在新的初始条件下也能完成同一任务。

具体案例:在一项机器人叠衣服的研究中,研究人员录制了 10 次人类叠毛巾的演示。通过深度 IRL 推断出奖励函数后,机器人在从未见过的毛巾初始摆放下,成功复现了“对折—再对折—摆放”的完整动作序列——它学到的不只是动作轨迹,而是“毛巾最终要变得整齐”这一抽象目标。

游戏 AI 行为风格建模

阶段:玩家建模 / 内容生成

解决的问题:在游戏 NPC 设计中,开发者希望 NPC 具有接近真人的行为风格,但很难用奖励函数描述“激进”“谨慎”“团队配合”这些抽象风格。IRL 可以从人类玩家的操作录像中还原玩家的奖励偏好,从而让 NPC 在不同情境下表现出与真人一致的行为倾向。

具体案例:在一款 MOBA 游戏 AI 的研究中,研究者用 IRL 分析了高分段玩家的对战记录,推断出不同位置玩家的“内在奖励权重”(如打野偏好“资源控制”,辅助偏好“视野争夺”)。据此生成的 NPC 在队友协作行为上与真人玩家高度相似,显著提升了游戏体验的真实感。

Python 演示

python144 行
"""最大熵逆强化学习 (MaxEnt IRL) 最小演示 在 4x4 网格世界上,用一个线性奖励函数 R = w * phi(s) 拟合专家轨迹。特征: 到目标距离的负值, 是否处于危险格。"""import numpy as np  class Gridworld:    """4x4 网格: 0-15 编号, 目标=15, 危险格=5"""     def __init__(self, gamma=0.9):        self.H = 4        self.W = 4        self.n = 16        self.gamma = gamma        self.goal = 15        self.danger = 5        self.actions = [-4, 4, -1, 1]  # 上、下、左、右     def step(self, s, a):        if s == self.goal:            return s, True        r = s // self.W        c = s % self.W        nr, nc = r, c        if a == 0:            nr = max(r - 1, 0)        elif a == 1:            nr = min(r + 1, 3)        elif a == 2:            nc = max(c - 1, 0)        elif a == 3:            nc = min(c + 1, 3)        ns = nr * self.W + nc        done = (ns == self.goal)        return ns, done     def features(self, s):        r = s // self.W        c = s % self.W        gr = self.goal // self.W        gc = self.goal % self.W        neg_dist = -(abs(r - gr) + abs(c - gc))        is_danger = 1.0 if s == self.danger else 0.0        return np.array([neg_dist, is_danger])  def softmax_policy(w, env):    """根据奖励权重 w 计算 Softmax 策略, 返回 (n_states, n_actions) 概率矩阵"""    n = env.n    n_act = len(env.actions)    policy = np.zeros((n, n_act))    for s in range(n):        vals = np.zeros(n_act)        for a in range(n_act):            ns, done = env.step(s, a)            if done:                vals[a] = 0.0  # 到达目标状态后无后续奖励            else:                vals[a] = w @ env.features(ns)        e = np.exp(vals - vals.max())        policy[s] = e / e.sum()    return policy  def expected_features(env, policy, n_steps=20):    """从初始状态均匀分布出发, 按策略计算特征期望"""    mu = np.zeros(2)    states = np.arange(env.n) / env.n    states = states * 0 + np.ones(env.n) / env.n    for t in range(n_steps):        # 按当前策略分布转移        feats = np.zeros(2)        for s in range(env.n):            feat_s = env.features(s)            for a in range(len(env.actions)):                ns, done = env.step(s, a)                if not done:                    feats += states[s] * policy[s, a] * feat_s        mu += (env.gamma ** t) * feats        # 更新状态分布        new_states = np.zeros(env.n)        for s in range(env.n):            for a in range(len(env.actions)):                ns, done = env.step(s, a)                if not done:                    new_states[ns] += states[s] * policy[s, a]                else:                    new_states[env.goal] += states[s] * policy[s, a]        states = new_states    return mu  def expert_trajectory(env, w_true):    """用真实权重生成专家轨迹"""    policy = softmax_policy(w_true, env)    traj = []    s = 0    for _ in range(10):        traj.append(s)        if s == env.goal:            break        a = np.random.choice(4, p=policy[s])        ns, done = env.step(s, a)        s = ns        if done:            traj.append(s)            break    return traj  def maxent_irl(env, expert_traj, lr=0.1, iters=50, seed=42):    """最大熵 IRL 主循环"""    rng = np.random.RandomState(seed)    w = rng.randn(2) * 0.1    # 专家特征期望 (从轨迹直接计算)    mu_E = np.zeros(2)    for s in expert_traj:        mu_E += env.features(s)    mu_E /= max(len(expert_traj), 1)     for it in range(iters):        policy = softmax_policy(w, env)        mu = expected_features(env, policy)        grad = mu_E - mu        w += lr * grad        if it % 10 == 0:            print(f"iter {it:3d}  w={w}  grad_norm={np.linalg.norm(grad):.4f}")    return w  if __name__ == "__main__":    env = Gridworld()    w_true = np.array([1.0, -2.0])  # 喜欢靠近目标, 讨厌危险格    demo = expert_trajectory(env, w_true)    print("专家轨迹:", demo)    w_est = maxent_irl(env, demo)    print("真实权重:", w_true)    print("学习权重:", w_est)    assert np.allclose(        env.features(env.goal),        np.array([0.0, 0.0])    )
目的:在 4×4 网格世界上,用最大熵 IRL 从一段专家轨迹中反推出奖励权重——即还原“靠近目标”和“避开危险”这两个特征的相对重要性。
  1. w = rng.randn(2) * 0.1初始化奖励权重,像美食侦探“盲猜”调料配比,从一个小随机值开始,避免一开始就偏激。
  2. policy = softmax_policy(w, env)用当前猜测的奖励权重算出智能体的行为策略,对应“按当前配方做一道菜”。
  3. grad = mu_E - mu计算“大师用量”与“我的用量”之差,构成梯度信号,差多少就调多少。
  4. w += lr * grad沿梯度更新权重,相当于“盐少了就多加一点,糖多了就少放一些”。
  5. expected_features(env, policy)用前向推演计算模型的特征期望,相当于“按菜谱推算出理论上的调料用量”。

常见误区

误区“逆强化学习不就是把专家走过的那条路径背下来,然后照着走一遍吗?那和简单的行为克隆有什么区别?”

正解行为克隆(Behavior Cloning)确实是在“背路径”——它把状态和动作当成一个“输入-输出”映射来学习,相当于学徒只看大师手的动作,不懂大师为什么那样做。IRL 则完全不是逐帧模仿,而是先学会大师的“心法”(奖励函数),再根据心法自己规划路径。同一个奖励函数可以应对不同的初始状态、不同的环境变化,因为智能体学到的是“目标”而不是“路径”。如果环境里突然多了一个障碍,行为克隆的机器人会撞上去(因为只会背旧路径),IRL 训练的智能体会绕开障碍(因为它知道目标是“到达终点”,而不是“经过中间某点”)。

为何常见:人们容易把“从演示中学习”统一理解为“模仿动作序列”,因为这是最直观的观察视角——毕竟看到的都是轨迹数据,很难一眼区分“背轨迹”和“理解意图”的根本差别。

误区“既然有专家演示,IRL 就应该能推算出专家唯一真实的奖励函数——只要数据够多,就一定能得到标准答案。”

正解这是一个数学层面的根本误区。从行为倒推动机,本质上是一个“一对多”的问题——同样的行为可以由完全不同的内在动机产生。美食侦探看到一个人天天吃素,无法仅凭行为确定他是“热爱素食”还是“肠胃不好”。IRL 能保证的是找到“能解释数据的奖励函数之一”,并通过最大熵等原则选择最不偏激的解释,但不可能保证发现“唯一的真实动机”。

为何常见:大家习惯了一个输入对应一个输出的函数直觉,而 IRL 面临的是“多个函数都能解释同一段数据”的反问题(inverse problem),这种不确定性天然容易让初学者产生“数据足够就能唯一确定”的错误预期。

误区“既然 IRL 能从演示中学到奖励,那我们以后完全不需要手写奖励函数,也不需要强化学习了,一切交给专家演示就行。”

正解IRL 并不是强化学习的替代品,而是它的“前置搭档”。IRL 的核心流程——“猜测奖励→求解策略→对比差距→更新奖励”——每一步都内嵌一个强化学习求解器。没有前向强化学习,IRL 就无法评估“当前奖励函数下最优策略长什么样”,自然也无法计算梯度。另外,IRL 需要高质量的专家演示,这在很多场景下本身就很昂贵。传统 RL(精心设计奖励)与 IRL(从演示中学习奖励)是互补的:奖励可设计时用 RL,奖励难设计但演示容易获取时用 IRL。

为何常见:人们往往把新技术理解为“旧技术的终结者”,因为这样听起来更“革命性”。实际上,IRL 让 RL 的价值从“用奖励找策略”延伸到了“从行为找奖励”,是对 RL 工具的复用与增强,而非颠覆。

误区“最大熵原理选了'最随机'的奖励函数,这是不是让推断结果变得模糊、不精确了?难道不该选'最匹配专家数据'的那个奖励吗?”

正解恰恰相反,最大熵是在所有能匹配专家数据的候选奖励中,选择不确定性最大的那个——它的约束仍然是“准确匹配专家特征期望”,但在满足这个约束的所有候选中排除掉那些“过度自信”的极端解。这与正则化的精神一致:与其相信某一组极端权重完全精确地还原了专家动机,不如承认数据只能锁定一个子空间,在子空间内选择最中庸的假设,往往泛化效果更好。

为何常见:直观上“随机”听起来像是“瞎猜”,人们容易忽视最大熵原理中“在约束下最大化熵”这个前提。真正约束解空间的不是熵本身,而是“专家特征期望”这个数据统计量。

面试题

Q1. 逆强化学习(IRL)要解决的核心问题是什么?

单选题 · easy

  • A.从专家演示中反推奖励函数← 正确答案
  • B.从奖励函数中求解最优策略
  • C.直接复制专家的动作轨迹
  • D.用更快的算法完成策略评估

答案:A。IRL 的“逆”就体现在方向相反:传统 RL 从奖励求策略,IRL 从专家演示反推奖励函数。B 描述的是前向强化学习;C 是行为克隆;D 是策略评估技术,均不是 IRL 的核心定义。

Q2. 传统强化学习与逆强化学习最本质的区别在于?

单选题 · easy

  • A.前者需要经验回放,后者不需要
  • B.前者的奖励函数由人设计,后者从演示中推断← 正确答案
  • C.前者只适用离散动作,后者只适用连续动作
  • D.前者不需要环境模型,后者必须知道环境模型

答案:B。传统 RL 预设奖励函数,再求解最优策略;IRL 反过来,从专家行为中推断奖励函数。A 中经验回放只是深度 RL 的工程技巧;C 中两者都支持连续与离散动作;D 中两者都不必然需要环境模型。

Q3. 在最大熵 IRL 中,“最大熵”原则选择的奖励函数是?

单选题 · mid

  • A.使专家轨迹概率最大的唯一解
  • B.在匹配专家特征期望的约束下最不偏激的解← 正确答案
  • C.让所有轨迹出现概率完全相等的解
  • D.让奖励函数本身取值最大的解

答案:B。最大熵 IRL 并非只追求“概率最大”(那会选中极端解),也不是“所有轨迹等概率”(完全无视专家数据),而是在特征期望匹配的约束下选择熵最大的分布对应的奖励,即最不武断的解释。

Q4. 最大熵 IRL 的梯度公式中,更新奖励权重的方向是?

单选题 · mid

  • A.专家特征期望减去当前模型特征期望← 正确答案
  • B.当前模型特征期望减去专家特征期望
  • C.专家轨迹累计奖励的绝对值
  • D.当前策略的熵值乘以学习率

答案:A。梯度为 \(\mu_E - \mathbb{E}_{\pi(w)}[\mu]\),如果当前的模型在某个特征上比专家少(如危险特征出现次数更少),梯度为正,增加该特征的权重。B 方向反了;C、D 与梯度公式无关。

Q5. 关于 GAIL,以下哪种说法正确?

单选题 · hard

  • A.它用判别器直接输出奖励函数实现 IRL← 正确答案
  • B.它用生成器直接输出奖励函数实现 IRL
  • C.它完全不需要专家演示数据
  • D.它用蒙特卡洛树搜索替代了神经网络

答案:A。GAIL 的核心思想是让判别器区分“专家轨迹”与“生成轨迹”,当判别器无法区分时,生成策略就接近了专家行为。判别器本身可作为隐式的奖励信号来源。B 中生成器产出的是策略而非奖励;C 错误,GAIL 必须依赖专家演示;D 错误,GAIL 基于神经网络策略与 GAN 框架。

Q6. IRL 本质上属于哪种数学问题?

单选题 · hard

  • A.欠定反问题(解不唯一)← 正确答案
  • B.凸二次规划(解唯一)
  • C.线性回归(闭式解)
  • D.无约束最优化(无任何可行解)

答案:A。同样的专家演示可能由多种不同的奖励函数解释,因此 IRL 天然是不适定/欠定反问题。最大熵等方法正是为了在多个可行解中做出选择。B 中凸二次规划只是某些 IRL 变体的求解工具,不是问题本质;C 中 IR L 并非一般线性回归;D 错误。

Q7. 下列哪些场景适合使用逆强化学习?

多选题 · easy

  • A.有丰富人类演示但难以设计奖励的任务← 正确答案
  • B.奖励函数容易手写且明确的任务
  • C.自动驾驶轨迹学习与机器人示教← 正确答案
  • D.每一步都有清晰即时反馈的游戏

答案:AC。IRL 适合“演示丰富、奖励难设计”的情形,如自动驾驶和机器人操作。B 和 D 属于奖励函数容易设计的场景,直接使用传统强化学习即可,无需 IRL 的额外复杂度。

Q8. 最大熵 IRL 相比早期线性 IRL 的改进包括?

多选题 · mid

  • A.引入概率化策略而非只取最优策略← 正确答案
  • B.更好地处理“多条轨迹都合理”的不确定性← 正确答案
  • C.完全不需要人工设计任何特征
  • D.能直接处理原始图像输入而不需要 CNN

答案:AB。最大熵 IRL 的核心改进是概率化建模:所有轨迹按奖励指数加权获得概率,而非只认最优轨迹。这自然处理了行为的多模态性。C、D 错误,最大熵 IRL 仍然需要人工特征,处理原始图像要靠深度 IRL(如 GAIL)。

Q9. 关于 IRL 迭代求解流程,正确的步骤包括?

多选题 · hard

  • A.先初始化奖励权重← 正确答案
  • B.用当前奖励求解最优策略← 正确答案
  • C.将策略的动作直接复制给专家使用
  • D.更新权重使模型特征期望靠近专家← 正确答案

答案:ABD。IRL 迭代四步:初始化权重→求解当前奖励下的最优策略→对比专家特征期望→更新权重。C 完全错误——IRL 从不把模型策略“复制给专家”,专家只是不变的行为参照。

Q10. 关于最大熵 IRL 的梯度公式 \(\nabla_w \mathcal{L} = \mu_E - \mathbb{E}_{\pi(w)}[\mu]\),以下说法正确的有?

多选题 · extreme

  • A.当模型策略与专家一致时梯度趋于零← 正确答案
  • B.\(\mu_E\) 表示专家的特征期望← 正确答案
  • C.\(\mathbb{E}_{\pi(w)}[\mu]\) 可通过当前策略采样逼近← 正确答案
  • D.该梯度保证目标函数是凸函数

答案:ABC。梯度为专家特征期望与当前模型特征期望之差,两者相等时收敛;\(\mu_E\) 正是专家的特征期望;模型期望可通过采样逼近。D 错误,最大熵 IRL 的目标函数关于权重 \(w\) 并不保证凸,因此梯度上升可能收敛到局部最优,实践中常用随机重启等方法缓解。