8.1 从飞行数据改进操纵:强化学习与闭环


8.1 从飞行数据改进操纵:强化学习与闭环

本节摘要:当环境的转移规律写不出公式时,让数据替模型说话。本节讲强化学习在飞行器架构里的挂接点——它改写的是规划舱的策略参数与反应层的规则权重,不是推倒主回路;给出"离线先行、仿真试炼、边界约束"的安全三保险,并用离线策略改进循环交付最小骨架。算法谱系与训练技巧归 540 册,这里只谈接缝。

跳棋程序的早期实验里,塞缪尔让机器跟自己对弈,从胜败记录里修正评估函数——机器没读过任何棋谱理论,棋艺却随对局次数稳步爬升。这段往事定义了强化学习的位置:当模型(世界怎么变)难以手写时,用试错数据学出价值与策略。上一章结尾留了个伏笔——3.4 节的值迭代需要转移概率,而真实空域的转移概率往往写不出来;本节的强化学习,就是 3.4 节在"模型未知"条件下的续篇。

飞行问题:写不出的模型

三类场景把工程推向学习路线。模型难写:行人怎么绕、门什么时候开、接口什么时候抖——转移规律存在却无法公式化。参数难调:启发式权重、阈值带、代价系数成百上千,手调是玄学,数据驱动的调参是工程。策略难表达:某些反应层行为(怎么跟车、怎么抓易碎品)规则写得再细也不像真人,示范与试错能学出更像样的策略。注意这组场景的共同点——它们全部落在已知的舱段接口之内:学习改变的是策略参数与行为权重,舱段划分、闭环纪律、单一事实源纹丝不动。这是本册对"学习"的基本态度:学习是舱段的升级方式,不是架构的推翻理由

舱段接缝:学习挂在哪

强化学习在飞行器上有明确的挂接点,按侵入度从低到高排:参数级——学启发式权重与阈值带(3.2 的 h 函数、4.2 的阈值带),输出仍是手写结构里的数值,风险最低、最常做;策略级——学反应层的行为映射(1.2 节的规则表换成网络或查找表),行为仲裁接口不变;价值级——学价值函数替代 3.4 的手写模型值迭代,MDP 的骨架保留、参数从数据来。侵入度越高,验证成本越高,升级的次序也应当从低到高——先让数据帮你调参,再考虑让它接管策略。

安全三保险贯穿所有挂接点。离线先行:先用第 5 章的航行日志做离线学习与离线策略评估,不上机就先回答"新策略大概多好";仿真试炼:学得的策略进 7.2 的仿真环境过剧本与蒙特卡洛推演,成绩不优于现役策略就没有上机资格;边界约束:学习期运行在沙箱与限幅内——禁区照旧、限幅照旧、安全态照旧,学习组件无权越过行动舱的校验闸门。

def offline_policy_improvement(log, simulator, incumbent, gates): """离线策略改进:日志学候选,仿真定去留。 incumbent: 现役策略(基准) gates: 验收门槛与边界约束(安全护栏) """ # 一、从航行日志取经历回放:状态、动作、奖励、后继 dataset = replay_transitions(log, sample_ratio=0.3) # 二、离线学候选策略(算法任意,接口不变) candidate = train_policy(dataset, safety_mask=gates.forbidden) # 三、离线评估:用旧数据估新策略的期望回报 est = off_policy_evaluate(candidate, dataset, baseline=incumbent) if est.uplift < MIN_UPLIFT: return {"promoted": False, "reason": f"离线提升不足:{est.uplift:.3f}"} # 四、仿真试炼:剧本 + 蒙特卡洛,成绩须优于现役且护栏零违 sim_score = monte_carlo(candidate, simulator, scenarios=gates.regression_bank) if sim_score.worse_than(incumbent) or sim_score.violations: return {"promoted": False, "reason": "仿真未胜现役或触发护栏"} # 五、影子运行:实机上只看不做,对比决策差异 shadow = ShadowRun(candidate, horizon_days=7) return {"promoted": False, "shadow_id": shadow.id, "reason": "影子期通过后由人批准上机"}

流程里每一环都堵着一种风险:离线评估堵"数据偶然",仿真试炼堵"分布外崩坏",影子运行堵"仿真与实机的差距"——三道闸全过才轮到人工批准上机。学得的策略上机后与现役策略的对比成绩,回流进日志,成为下一轮改进的原料——学习自身也运行在主回路上,这与全章主题互为印证。

数据管道的起点是日志回放,接口与质量检查一并给出:

def replay_transitions(log, sample_ratio=1.0, reward_audit=None): """从航行日志取经历:状态、动作、奖励、后继。""" episodes = log.replay(event_filter="task_run") data = [] for ep in episodes: for s, a, r, ns in ep.transitions(): if random() > sample_ratio: continue data.append((featurize(s), a, r, featurize(ns))) if reward_audit: # 奖励口径复核 mismatches = [d for d in data if not reward_audit.matches(d)] if len(mismatches) / len(data) > 0.01: raise ValueError("奖励口径失配,先对账再训练") return data

联调与故障排查

学习管线的联调围绕数据质量:奖励信号是否可靠(奖励在日志里是怎么算出来的,口径要复核)、状态表示是否漏维度(漏了关键状态的策略永远学不好)、数据分布是否偏斜(只见过简单局面的日志学不出应急策略)。按症状排查:学出来的策略仿真很好实机拉胯是仿真-真实差距(7.2 节的老朋友),先校准仿真再怀疑算法;训练时越学越差查奖励设计——奖励里混进了与任务目标相反的捷径;上机后偶发怪动作查状态表示的缺失维度与越界输入——策略对没见过的状态毫无判断力,边界约束必须兜底。

⚠️ 常见坑:把"能学"当"该学"。样本充足、信号可靠、结构已知的问题,手写规则加数据调参往往比端到端学习更稳、更可解释——学习的启动判据是"手写确实写不动",不是"学习看起来更时髦"。

本节要点回顾

  • 学习的位置:模型写不出时用数据学价值与策略;挂接点按侵入度分参数级、策略级、价值级,升级次序从低到高。
  • 架构不变:学习是舱段的升级方式,闭环纪律、单一事实源、校验闸门全部保留。
  • 三保险:离线评估、仿真试炼、边界约束加影子运行——三闸全过才上机,上机后成绩回流日志。
  • 数据质量先行:奖励口径、状态维度、分布偏斜,三查不过学什么都白学。
  • 能学不等于该学:手写写得动的问题留在手写里,启动判据是"确实写不动"。

试飞数据能改进机器的参数,但有一类知识藏在人的操纵里。下一节:老飞行员的示范怎么蒸馏进舱。


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