8.2 跟着老飞行员学:模仿学习与逆强化学习


8.2 跟着老飞行员学:模仿学习与逆强化学习

本节摘要:学徒制是最古老的教学法,也是智能体的。本节讲两条示范学习路线:行为克隆把专家轨迹变成监督学习,及其克星——分布漂移;逆强化学习反着走,从示范反推奖励函数,把"专家在乎什么"变成可优化的目标。数据源头就是第 5 章的日志与 4.4 节的人工接管记录——每一次接管都是一堂免费教学课。

飞行培训行业有个古老而有效的传统:跟班飞行。学员坐在教员旁边,看教员在真实气象里做真实决策,几百个起落后,判断力长在了学员身上。智能体工程里最被浪费的资源恰恰是这门手艺的素材库:4.4 节塔台频道里的人工接管,每一次都是教员示范——接管前机器卡在什么局面、人怎么判断、怎么操纵、结果如何,全部躺在第 5 章的航行日志里。上一节让数据改进参数,本节让人的示范直接变成技能。

行为克隆:把示范变成监督学习

行为克隆(Behavior Cloning)的思路朴素到近乎直白:把专家轨迹整理成"状态到动作"的配对数据集,用监督学习训练一个策略网络,让它学会"在这个局面下,教员会这么做"。工程上它是最便宜的示范学习——不需要环境交互、不需要奖励设计,日志回放就是训练集。

它的克星同样直白:分布漂移。监督学习只会模仿见过的局面,而策略一旦上机,它自己的小失误会把自己带进教员从没示范过的境地——比如稍微偏出航线半步,它没见过"偏半步怎么修正",于是偏出一整步,越偏越远。示范数据全部来自"教员的完美轨迹",而机器需要的恰恰是"从坏局面爬回来"的经验。对策有两条工程主线:扩充坏局面——在示范数据里加入扰动与恢复片段(教员故意演示从偏差中改出),或用交互式修正(DAgger 思路:让机器飞、教员在旁标注"此刻该做什么",专门收集机器自己会掉进去的局面);约束动作域——克隆策略只在狭窄的辅助任务上工作(提示、建议、降级档),大偏差由经典控制兜底。

逆强化学习:反推专家在乎什么

行为克隆复制动作,逆强化学习(IRL)复制动机:示范只是线索,真正要学的是奖励函数——教员的操纵隐含着怎样的价值排序(贴线飞行多重要?舒适度值几个钱?急转弯的代价几何?)。把奖励函数反推出来,就能用 3.4 节或 8.1 节的任何求解器重新优化策略——它解释了示范、泛化到示范没覆盖的局面。工程上的实用形态是从偏好对比学排序:不用精确反推奖励,只要从示范中提炼"两种做法哪种更好"的偏好对,用排序学习校准代价函数的权重——3.2 节搜索里的边代价、3.4 节 MDP 的奖励,从此有了数据来源。

def build_imitation_dataset(tower_log, memory): """从接管记录构建示范数据集:一次接管 = 一段轨迹。""" dataset = [] for takeover in memory.recall(event="manual_takeover"): # 接管前机器的信念快照 = 状态 states = takeover.belief_trajectory # 人在飞期间的动作序列 = 专家动作 actions = takeover.human_action_trajectory # 成败与后续 = 质量标签(差的示范要滤掉) quality = takeover.outcome_quality() if quality >= QUALITY_BAR: for s, a in zip(states, actions): dataset.append({"state": featurize(s), "expert_action": a}) # 成对偏好:同一局面的机器方案与人的方案配对 pairs = [] for t in tower_log.machine_rejected_alternatives(): if t.human_choice != t.machine_choice: pairs.append((t.machine_choice, t.human_choice)) return dataset, pairs def distill_to_policy(dataset, pairs): """克隆 + 偏好校准的双轨蒸馏。""" clone_policy = supervised_train(dataset) # 行为克隆 cost_weights = preference_fit(pairs) # 偏好反推权重 return {"clone": clone_policy, # 辅助档:提示与建议 "cost_model": cost_weights} # 喂给搜索与MDP的代价

这段双轨蒸馏是本节的工程结论:克隆轨产出的策略放辅助档(4.4 节的建议通道——只提示不执行),偏好轨产出的代价模型喂给经典算法(搜索的边代价、MDP 的奖励)——两条轨都不直接接管操纵面,风险被接口预先截住。示范数据的清洗纪律与 5.1 节的写入策略对齐:质量线以下的接管(人也在救火)不进训练集。

分布漂移的压力测法也落成可重复的剧本:

def drift_stress_test(clone_policy, simulator, epsilons): """漂移压力测:偏离多远开始失控,量出来写进说明书。""" report = {} for eps in epsilons: # 逐级加扰动 outcomes = [] for trial in simulator.baseline_runs(): perturbed = trial.offset(eps) # 人为偏离 eps outcome = simulator.rollout( clone_policy, from_state=perturbed) outcomes.append(outcome.recovered) report[eps] = sum(outcomes) / len(outcomes) safe = max(e for e, r in report.items() if r >= 0.95) return {"recovery_rate": report, "safe_envelope": safe} # 克隆策略的能力边界

联调与故障排查

示范学习的联调有明确的科目:覆盖审计——按 7.2 节的场景矩阵统计示范数据覆盖了哪些局面,空白格就是克隆策略的禁区(辅助档也要标明"此处不建议参考");分布漂移压力测——把克隆策略放进带扰动的仿真,量化"偏离多远开始失控";偏好一致性抽查——用留出的示范对检验代价模型,排序对了多少。按症状排查:克隆策略上机后越偏越远是分布漂移晚期症状,立刻退回辅助档并补坏局面数据;偏好模型权重漂忽(两次训练排序不同)查示范对的数量与质量——偏好学习的样本需求常被低估;接管记录质量参差查 4.4 的交接包完整度——状态没记全的接管,只是故事不是数据。

💡 关键直觉:人工接管不是系统失败的注脚,是最贵的教学素材。每次接管都记好信念、动作与结局三部曲,机库里的教员就永远在线。

本节要点回顾

  • 示范即素材:接管记录是免费的教员示范;信念、动作、结局三部曲记全,才配进训练集。
  • 克隆与其克星:行为克隆是最便宜的示范学习,分布漂移是它的天然缺陷——扩充坏局面与约束动作域是两条对策。
  • IRL 学动机:从示范反推奖励或偏好排序,产出喂给经典搜索与 MDP 的代价模型,解释性好、可泛化。
  • 双轨蒸馏:克隆进辅助档、偏好进代价模型,示范学习不直接接管操纵面。
  • 覆盖审计:示范数据的场景空白格,就是克隆策略的能力边界,要标在说明书上。

示范能教"怎么飞得像教员",转场到新空域还差一步。下一节:迁移学习管换地方、在线适应管过日子,遗忘只允许发生在该忘的地方。


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