news 2026/9/8 17:08:48

第307篇 模仿学习——从示范中学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第307篇 模仿学习——从示范中学习

前面六篇把强化学习的核心算法过了一遍。RL的核心问题是:需要大量的试错和奖励信号来学习。但在机器人领域,试错成本很高(可能损坏硬件),奖励信号也很难设计。有没有一种方法,让机器人看看专家怎么做的,直接学会?

这就是模仿学习(Imitation Learning)的思路。不设计奖励函数,让机器人通过观察专家的示范来学习行为策略。人类学开车、学做饭、学打球,很多技能都是这么学会的。

行为克隆:最直接的模仿

行为克隆(Behavior Cloning, BC)是最简单的模仿学习方法。它的思路跟监督学习一模一样:收集专家示范数据(s_t, a_t),训练一个网络从状态s预测动作a。

# 行为克隆的训练流程 # 1. 专家示范数据集: {(s_1, a_1), (s_2, a_2), ..., (s_N, a_N)} # 2. 训练策略网络: loss = ||π_θ(s) - a||^2 (MSE) # 3. 部署时: a = π_θ(s_current)

行为克隆的优点是简单。数据收集、训练、部署,整个流程跟监督学习没区别。你可以用任何监督学习的技术来改进它——数据增强、正则化、更好的网络结构。对于简单的任务(比如车道保持、直线行走),行为克隆的效果就够用了,不需要更复杂的方法。

数据收集是行为克隆中最关键的环节。专家示范要覆盖足够多的场景和边界情况。如果专家只在晴天开过车,策略遇到雨天就抓瞎。实践中一般要求示范数据覆盖任务中可能遇到的大部分状态。对于机器人操作任务,通常收集200到1000次示范,每次示范包含几百到几千步的数据。

网络结构的选择也很重要。对于低维状态输入(关节角度、IMU数据),几层全连接网络就够了。对于视觉输入,CNN或者Transformer做特征提取,后面接MLP输出动作。动作的表示方式也有讲究:直接回归连续值(MSE loss)简单但可能不够精确;离散化后用分类loss(交叉熵)效果更好,因为分类任务比回归任务更容易学。RT-1就是把动作离散化成token,然后用类似语言模型的方式预测。

但行为克隆有个致命的问题:分布偏移(distribution shift)。训练时,状态数据是专家产生的。部署时,策略的微小误差会导致机器人偏离专家的轨迹,进入从未见过的状态。在这些状态上,策略的预测不可靠,误差越来越大,最终完全失控。

想象一下学开车。教练(专家)开的时候一直在道路中间。你(策略)学了一个大致正确的策略,但稍微偏了一点。偏离后你看到的路边景象是教练从没展示过的,你不知道该怎么处理,越偏越远,最后开到了沟里。

DAgger:修正分布偏移

DAgger(Dataset Aggregation)是2011年的工作,专门解决行为克隆的分布偏移问题。它的核心思想是:既然问题是部署时遇到的状态跟训练时不一样,那就在部署时收集新状态的数据,加到训练集里重新训练。

DAgger的迭代流程是这样的。第一轮,用专家策略收集数据,训练初始策略π_1。第二轮,用π_1在环境中执行,同时专家在每一步给出正确的动作(或者纠正π_1的动作)。把新收集的数据加到训练集里,重新训练得到π_2。重复这个过程,策略越来越好,遇到的状态也越来越多,训练集越来越全面。

DAgger的关键假设是:每一步都需要专家在线给出指导。这在某些场景下不现实——比如你让一个机器人学做手术,不可能每步都请个外科医生在旁边纠正。

有些变体可以缓解这个限制。比如用仿真中的最优策略作为"虚拟专家",或者用预训练的策略来自动标注。QB-Dagger(Query Batch DAgger)减少了对专家实时响应的要求——策略先自己跑一段轨迹,然后让专家批量标注关键决策点。还有Self-Dagger,用策略自身的历史最优版本作为"伪专家"来标注,完全不需要人类参与。

DAgger的理论保证比BC强很多。在一定的假设下(专家是Lipschitz连续的),DAgger的遗憾界是O(1/√N),其中N是迭代轮数。而BC的遗憾界是O(H²·N),其中H是轨迹长度——随H指数增长。这个理论差距在实践中非常明显:BC在长horizon任务上几乎不可用,DAgger能处理更长的轨迹。

GAIL:对抗模仿学习

GAIL(Generative Adversarial Imitation Learning)是2016年的工作,把GAN的思路引入了模仿学习。

GAIL不直接预测动作,而是训练一个判别器来区分"专家的行为"和"策略的行为"。判别器输入(s, a)对,输出"这是专家示范的概率"。策略的目标是骗过判别器——让自己的行为看起来像专家。

# GAIL的训练框架 # 判别器D: 输入(s, a),输出"像专家的概率" # 策略π: 输入s,输出动作a # D的目标: 正确区分专家数据和策略数据 # π的目标: 让D判断策略数据为"专家" # 类似GAN的minimax博弈

GAIL的好处是不需要逐步匹配专家的动作,而是从全局上让策略的行为分布接近专家。这在一定程度上缓解了分布偏移的问题。但GAN的训练 notoriously 不稳定,GAIL也有这个问题。判别器和策略的博弈可能不收敛,或者收敛到一个不好的平衡点。

GAIL的一个有趣副产品是:训练好的判别器本质上就是一个奖励函数——它告诉策略"这个行为有多像专家"。这意味着你可以先用GAIL学到一个奖励函数,再用标准RL来优化策略。这种方式结合了模仿学习和RL的优点:不需要手动设计奖励函数,又能利用RL的强大优化能力。

从GAIL发展出来的一系列工作还包括AIRL(Adversarial Inverse Reinforcement Learning)和FAIRL。AIRL改进了判别器的结构,让学到的奖励函数具有更好的可迁移性——在一个任务上学到的奖励可以迁移到类似的任务上。FAIRL则解决了GAIL中判别器梯度消失的问题,训练更稳定。

模仿学习在机器人中的应用

模仿学习在机器人领域有很多成功应用。自动驾驶中,Waymo早期就探索过用行为克隆来学习驾驶策略——收集人类驾驶员的数据,训练端到端的控制策略。机器人操作中,BC+RL的组合越来越流行——先用行为克隆从少量人类示范中学习一个初始策略,再用RL微调。

Google的RT系列模型(RT-1, RT-2)本质上也是模仿学习——用大量的机器人操作示范数据训练一个大规模的策略模型。这些模型能执行多种操作任务,展示了模仿学习在大规模数据下的潜力。

在机器人抓取任务中,行为克隆仍然是最常用的方法之一。收集几百次成功抓取的示范数据,训练一个从图像到关节角度的映射网络,就能得到一个不错的抓取策略。简单、有效、工程上容易实现。

面试要点

行为克隆的分布偏移问题。这是模仿学习面试必考的内容。你要能解释为什么分布偏移会发生(训练和测试的状态分布不同),以及DAgger和GAIL分别怎么解决这个问题。

模仿学习vs强化学习。面试中经常被问到什么时候用模仿学习,什么时候用RL。如果专家示范容易获得且任务明确,用模仿学习;如果需要自己探索最优行为或者奖励信号容易定义,用RL。很多实际项目是两者结合——先用模仿学习获得初始策略,再用RL优化。

示范数据的质量。专家示范的质量直接影响模仿学习的效果。噪声大的示范(专家也不是每次都成功)会导致策略学到错误的行为。解决办法包括:只选成功的示范、用加权的方式降低失败示范的权重、或者用逆强化学习从次优示范中推断真实的奖励函数。

给你的建议

入门模仿学习,建议从行为克隆开始。在自动驾驶的CARLA仿真器或者机器人的Gym环境中,收集一些专家示范数据,训练一个简单的MLP策略。跑通之后你会对分布偏移有直观的感受。

然后实现DAgger,对比跟纯BC的效果差异。如果你想挑战自己,可以试试GAIL或者它的改进版本AIRL。

在实际项目中,模仿学习通常不是孤立使用的。最常见的组合是:先用行为克隆从人类示范中学一个初始策略,然后用RL(比如PPO)在仿真中进一步优化,最后用Sim2Real迁移到真实机器人。这个pipeline在工业界非常普遍,面试时能讲清楚这个流程,会让人觉得你有实际项目经验。

代码方面,imitation库(github.com/HumanCompatibleAI/imitation)提供了多种模仿学习算法的实现,基于Stable-Baselines3,用起来很方便。


上一篇:第306篇 强化学习在机器人控制中的应用

下一篇预告:第308篇 逆强化学习——从行为中推断目标

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 15:30:14

遍历性游戏:为什么期望值为正却长期必亏?

这次我们来看一个概率论里的经典反直觉模型:The Ergodicity Game(遍历性游戏)。它不依赖 GPU,不需要安装几十 GB 的模型,也不需要什么高端显卡。它只用一个简单的抛硬币游戏,就能演示一个在经济学、量化和风…

作者头像 李华
网站建设 2026/9/8 13:40:55

前端构建工具链拆解:从Webpack到Vite+tsup+Rolldown的迁移实践

Webpack 统治前端工程化的时间太久,久到很多团队已经把“项目复杂就必须上 Webpack”当成默认选项。但项目一旦过了某个规模,Webpack 的配置膨胀、构建变慢、调试链路拖泥带水,就会成为开发效率最直接的阻碍。用 TS tsup Vite Rolldown 这…

作者头像 李华
网站建设 2026/9/4 15:37:10

LVGL手表UI开发实战:内存、刷新、功耗与页面管理的平衡术

做嵌入式 GUI 有一个特别容易踩的坑:以为用 LVGL 做手表 UI,重点是把界面画得好看。真到上手时会发现,在 MCU 上做手表界面,难点从来不在某个控件怎么用,而在内存、刷新、事件和功耗这四件事怎么平衡。特别是当你决定做…

作者头像 李华
网站建设 2026/9/5 14:38:27

信号与系统必考点:单位冲激函数性质与解题套路

信号与系统这门课,网上讨论度最高的两个考点,一个是卷积,另一个就是单位冲激函数。很多新手看到教材里写“δ(t) 在零点等于无穷大”就直接懵掉,觉得这是一个数学家拿来吓人的概念。实际上,在“做题”这个层面&#xf…

作者头像 李华
网站建设 2026/9/5 18:07:19

网约车抽成比例下调:规则引擎如何支撑计费系统灵活调整

最近不少城市都在讨论网约车平台下调抽成比例的事情。作为开发者,我们看到的可能不只是一个“比例数字变化”,而是一整套计费系统、规则配置、结算链路和数据对账逻辑需要跟着调整。业务侧一句话,技术侧往往要动好几个服务。这篇文章想从工程…

作者头像 李华