第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,用起来很方便。
下一篇预告:第308篇 逆强化学习——从行为中推断目标
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)