6.5 模仿学习与逆强化学习:从专家轨迹出发


6.5 模仿学习与逆强化学习:从专家轨迹出发

本节摘要:当专家示范比奖励函数更容易获得时(老司机开车三十年,却说不清"安全驾驶"的奖励公式),从示范里学是捷径。模仿学习回答"怎么照着做":行为克隆把示范当监督数据,快而脆,误差累积是致命伤;DAgger 用"专家纠正"补数据分布。逆强化学习回答"专家在优化什么":从轨迹反推奖励函数,再用它训练——学的是意图而非动作。本节对比两条路线的输入输出、失效模式与组合打法。

一、示范比奖赏更好拿时

先承认一个现实:很多任务里,奖励函数比示范数据难造得多。自动驾驶的"开得好"怎么写成函数?把所有好司机的行为泛化成一条公式,写出来不是过拟合就是漏洞百出;但找十个老司机录一个月行车数据,轻而易举。反过来也有奖励好写、示范稀缺的任务(围棋胜负天然定义)。**选择模仿还是强化,第一判据是:你的领域里,哪个信号更容易收集?**第二判据是:奖励写得清楚吗?写得清就强化,写不清但专家多,走模仿。

模仿学习的两问结构值得钉在墙上:行为克隆(BC)问的是"这个状态下专家做了什么"——学一个从状态到动作的映射;逆强化学习(IRL)问的是"专家的这些选择在最大化什么"——学一个奖励函数。前者学形,后者学神。

二、行为克隆:快而脆

BC 的实现与普通监督学习毫无二致:收集专家轨迹 (s_t, a_t),训练 π(s) 拟合 a_t,均方误差(连续)或交叉熵(离散)收工。几分钟出模型的代价是两个结构性缺陷。其一,分布偏移与误差累积:BC 见过的状态全是"专家状态"——专家几乎不犯错,于是从不示范"犯错之后如何回到正轨";学生一旦偏差半米(采样噪声、传感器误差),驶入专家从未覆盖的状态区,训练分布外只能瞎猜,猜错偏离更远,滚雪球直到失控行驶。自动驾驶术语里这叫 covariate shift 的连锁反应。其二,只学动作不学意图:专家在路口减速 20 公里,BC 记住"路口减速",却不知道减速是为了避让——场景稍变(路口没人),它照减不误。

DAgger 的补法优雅:让学生开车,专家坐在副驾现场标注"此处我会怎么打方向"。新数据 (学生状态, 专家动作) 恰好覆盖学生真正会到达的状态分布,把"犯错后如何挽回"补进训练集。代价是每轮都要专家在线盯梢——不是所有场景(尤其高危操作)都请得起专家随行。工程上另一个常用缓解是给示范加噪声:故意用带扰动的状态配专家动作训练,硬造出"偏了之后"的数据。

三、逆强化学习:反推专家在优化什么

IRL 的推理方向倒转:给定专家轨迹 {(s, a)},找奖励函数 R 使"专家策略恰好是 R 的最优解"。为什么绕这一道?因为奖励函数是比策略紧凑得多的知识表示:一条奖励"到目的地快、不撞人、不违章"泛化到一切城市一切天气;直接模仿的动作映射换个路口就失灵。拿到 R 之后,可以在线(或离线)跑任何强化学习算法训练策略——IRL 通常只是管线的前半段。

核心的模糊性要心里有数:能解释同一批示范的奖励函数有无穷多个(零奖励让任何策略都是"最优"——极端无信息解),因此 IRL 的全部设计都在"从无穷多解里挑一个有泛化能力的"。经典解法是最大熵 IRL:假设专家动作分布满足"越优的动作越可能出现,但保留随机性"(软最优),从示范匹配特征期望(速度、间距、偏离车道量……)反推特征权重。现代做法把它并入深度网络与 GAN 式对抗:判别器分辨"专家轨迹"与"学生轨迹",奖励信号就是判别器的区分度(GAIL),学生被训练到骗过判别器——专家数据无需标注奖励,RL 循环里接上判别器输出即可。

四、组合打法与选型

实战中三者常组合成流水线,而不是单选。经典组合是 BC 预训练 + RL 微调:先用示范把策略拽到"能用"区间(省掉 RL 从零探索的漫长冷启动,等效于一种聪明的探索起点),再用 PPO 在真实或仿真环境里继续打磨,奖励此时才开始起作用。RLHF(语言模型对齐)是这套组合的当代变体:人类偏好数据先训奖励模型(IRL 的精神——从人类行为反推什么算好),再用 PPO 优化策略。选型决策树可以这样走:奖励函数能写清楚、且环境可交互 → 纯 RL;专家多、奖励写不清、但只需复现专家水平 → BC(带 DAgger 补丁);要泛化、要超越专家、奖励写不清 → IRL/GAIL 先学奖励再 RL;有海量示范、环境贵 → BC 预训练 + 离线 RL 或 RL 微调。

  • BC 学映射(形),IRL 学奖励(神);选择依据是哪个信号更容易收集。
  • BC 的死穴是分布偏移误差累积——专家从不示范"犯错后怎么办"。
  • DAgger 用学生状态的专家标注补分布;请不起专家时用加噪示范硬造。
  • IRL 解不唯一,最大熵假设与特征匹配是从无穷解中挑选的抓手;GAIL 用对抗实现。
  • 最强组合拳:BC 预训练拽到能用区间,RL 微调超越示范水平;RLHF 是其当代变体。

一个行为克隆的最小实验:亲手看见分布偏移

用一个一维走廊把 BC 的快与脆同时演出来。专家策略已知:永远向右走到出口;学生是单参数打分器,只在专家轨迹覆盖的状态上学。训练集拟合准确率轻松到接近满分——因为专家经过的状态上答案唯一。关键在评估:让学生从"专家从不经过的偏离状态"出发(模拟它自己犯了一次错之后的世界),学生对该状态的动作完全是训练分布外的瞎猜,猜错就退回,退回后的状态同样没学过,误差滚雪球。DAgger 的补法在这个玩具里对应:第二轮让学生自己开车,专家在每个经过的格子现场标注正确动作,把"偏离态的正确走法"补进数据,再训一轮,偏离态表现立刻收敛。三个可以动手核对的数字:示范覆盖四个格子时,偏离一个格子的失败率大约翻倍;补五十条 DAgger 标注后失败率降回与示范内同量级;示范密度加十倍却完全不补偏离态,失败率几乎不变——样本量治不了分布偏移,覆盖才能。这个实验十行代码就能复现,做完之后"训练集指标好看"这类证据在你眼里的分量会永久性地降一档。

从示范到奖励:一条 IRL 管线的完整参数账

把 IRL 的工程形态拆成可执行的参数清单。输入侧:专家轨迹 N 条(任务越复杂越多,玩具级百条、真实任务上万条),特征选择是第一处设计决策——特征必须"够用来区分好坏行为,又不细到把任务背下来",驾驶任务的典型特征集是速度方差、跟车间距、偏离车道量、急加减速次数,共八到十二维。模型侧:奖励写成特征的线性组合是经典做法(权重即可解释性,每个权重直接回答"专家多在乎这个特征");深度版把奖励换成网络,表达力换掉可解释性。训练侧:最大熵 IRL 的迭代是"当前奖励下解最优策略 → 对比策略与专家的特征期望 → 按差更新奖励权重",循环到特征期望差收敛到阈值内(通常取特征量级的百分之五)。输出侧的验收有三条:奖励权重符号要符合常识(负权重的"急减速"若学成正权重,说明数据里混入了赛车手);策略在新场景的泛化抽查;以及最重要的一条——拿奖励去训练一个全新策略,它的行为分布与专家的相似度,这个数字才是 IRL 管线的最终成绩单。整条管线最贵的不是算力而是特征设计:特征选错的 IRL,训练再久也只是精确地学错了意图。

一个行为克隆的最小实现

把 BC 的训练循环写出来只需要十几行,核心与普通分类器毫无二致——差别全在数据从哪来:

import torch, numpy as np # demos: [(obs, expert_action), ...] 从专家轨迹切出 obs = torch.as_tensor(np.array([d[0] for d in demos]), dtype=torch.float32) act = torch.as_tensor([d[1] for d in demos]) net = torch.nn.Sequential(torch.nn.Linear(4, 64), torch.nn.ReLU(), torch.nn.Linear(64, 2)) # 输出两个动作的打分 opt = torch.optim.Adam(net.parameters(), lr=1e-3) for epoch in range(2000): idx = torch.randint(0, len(obs), (128,)) # 随机小批 loss = torch.nn.functional.cross_entropy(net(obs[idx]), act[idx]) opt.zero_grad(); loss.backward(); opt.step() def student(obs_now): # 部署接口:纯前向 with torch.no_grad(): return int(net(torch.as_tensor(obs_now, dtype=torch.float32)).argmax())

这段代码在示范覆盖的状态上表现无懈可击——训练损失轻松降到接近零。它的问题一个字都不写在代码里:demos 的分布由专家行为决定,学生部署后自己走进的每一个"专家没去过的状态"都不在这份数据里,交叉熵对那些状态保持沉默。前面文字实验里看到的误差累积,就是这段代码上线十分钟后会发生的事。DAgger 的补法对应到代码上也简单:把第二轮训练的 obs 换成学生自己跑出来的状态分布,标签换成专家在这些状态上的现场标注,其余一行不改——改的是数据,不是模型。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U