本节摘要:换空域不必回炉重造,长年服役也不能刻舟求剑。本节讲迁移学习在"转场"时的复用与微调划分,在线适应在"续航"中的漂移检测与影子验证,并把知识库与参数的分工定型——地图与规则进语义记忆,参数进模型,遗忘只允许发生在该忘的地方。所有更新走版本回归,改装纪律与机库同源。
换一片空域,就得回炉重造吗?这是每个把飞行器开进新仓库、新园区的团队都会撞上的问题:旧空域训练的感知模型认不认新货架、旧空域调的规划参数适不适应新的通道宽度。反过来,长期驻在老空域也未必省心——货架布局会调、人流会变季节、接口会升级,服役初期的最优参数放到当下可能已是刻舟求剑。本节回答这两件事:转场靠迁移(把旧空域学的本事搬到新空域),续航靠适应(在服役中持续跟上世界的变化),两件事共用同一条纪律——任何更新都是一次改装,走第 7 章的全套验证。
迁移的工程实质是划分:什么复用、什么微调、什么回炉。按第 2 章与第 3 章的舱段盘点:感知舱的特征提取层复用(边缘、几何、通用的视觉表征跨空域几乎通用),探测头与分类头微调(新货架外观、新障碍类型);规划舱的搜索与程序库复用(算法不挑空域),代价权重与启发式微调(通道宽度、限速变了);行动舱基本复用(执行器没换)。这个自上而下的"复用多、回炉少"的结构,正是第 1 章舱段化设计的红利——模块化的架构天生可迁移,耦合的巨石系统才需要整体重训。
微调的纪律是小步加冻结:每次只放开少量参数,其余冻结;新空域数据少时尤其如此——全参数放开等于用小数据冲垮旧本事。数据不够就造:旧空域的日志加新空域的少量标注,合成扩充(7.2 节的仿真在这里兼职数据工厂)。
服役中的世界缓慢变形——统计学里叫概念漂移:昨天可信的置信度、今天频率偏了,上周最优的参数、这周次优了。在线适应的工程循环分四拍:检测(监控指示器的分布漂移——2.3 节的估计残差、7.3 节的指标曲线,连续偏离基线即报警)、诊断(漂移来自环境变化还是系统退化——外部世界变了就适应,探头老化了就维修,方向千万别反)、适应(小步更新参数或重新校准模型,影子模式先试跑)、记账(更新入版本库,回归测试护航——与手写代码同一套纪律)。
def adaptation_cycle(monitor, candidate_factory, board): """在线适应循环:检测 -> 影子 -> 回归 -> 上机。""" # 一、漂移检测:指示器连续偏离基线即触发 if not monitor.drift_detected(indicators=["est_residual", "task_success"]): return {"action": "none"} # 二、诊断:环境漂移走适应,设备退化走维修单 verdict = monitor.attribute_drift() if verdict.source == "sensor_aging": return {"action": "maintenance", "target": verdict.component} # 三、候选适应:用近期数据小步重校准(微调非重训) candidate = candidate_factory.recalibrate( recent=monitor.recent_window(), frozen=FREEZE_SET) # 四、影子验证:新参数只算不飞,与现役平行对比 shadow = ShadowCompare(candidate, incumbent=monitor.incumbent, horizon_days=5) if not shadow.better_and_safe(): return {"action": "keep_incumbent", "reason": shadow.report()} # 五、版本化上机:更新入版本库,回归护航,可回滚 release = VersionedUpdate(candidate, rollback_plan=True) release.regress(gate=REGRESSION_BANK) board.write("config_version", release.id, writer="adaptation") return {"action": "promoted", "version": release.id}
循环里"诊断"这一拍最见功力:环境漂移适应它,设备退化维修它——把退化当漂移去"适应",等于教系统将就着一根坏探头,越适应越歪。影子验证与版本化上机则承接 8.1 节的三保险——在线不等于随意,恰恰因为"在线",每一步都要能回滚。
终身学习的著名陷阱是灾难性遗忘——学新空域时把旧空域的本事冲掉。工程上的第一道防线不在算法里,在分工里:能写进知识库的,绝不放进参数。地图布局、通道规则、危险区清单进语义记忆(5.1 节的版本化知识库),换空域只是新增几个版本,旧的原样可查;放进参数的只应是确实学得出的东西——特征表征、代价权重、策略参数。知识库不遗忘,参数才需要小心。第二道防线是回放护旧:微调数据里掺入旧空域的保留样本(7.2 节回归银行的活用),新本事学会了,旧本事留着温。
回放护旧与漂移指示器的最小实现如下:
class DriftMonitor: """漂移检测:指示器连续偏离基线才报警,单点抖动不触发。""" def __init__(self, baseline, window=50, k=3.0): self.baseline = baseline # 校准期的分位基线 self.window = deque(maxlen=window) self.k = k def feed(self, indicator): self.window.append(indicator) def drifted(self): if len(self.window) < self.window.maxlen: return False # 样本不足不下结论 med = median(self.window) lo, hi = self.baseline return med < lo - self.k or med > hi + self.k def mix_replay_data(new_data, bank, ratio=0.3): """回放护旧:微调数据掺入旧空域保留样本。""" old = bank.sample("previous_airspace", n=int(len(new_data) * ratio)) return new_data + old # 新本事学会,旧本事留温
适应循环的联调用人造漂移:在仿真里按计划改变环境(货架搬位、限速调整),验证检测-诊断-适应-记账四拍各自触发正确;再跑回滚演练——适应上机后人为注入坏更新,验证回滚路径的时间与完整性。按症状排查:漂移报个不停是检测阈值过敏或基线过期,按 7.3 节的分位数重定;适应后老任务变差是冻结名单太短或回放护旧缺失——新旧成绩要看同屏;更新后版本混乱查版本化纪律——配置与模型必须四位一体打标(7.1 节铁律)。
⚠️ 常见坑:把"在线学习"理解成"实时改参数"。服役中的参数更新必须走影子、回归、版本三道手续——"在线"的是适应的节奏,不是验证的松紧。
参数与知识都能进化了,若导航计算机本身换成一颗会读任务书的大脑呢?下一节:大语言模型坐进驾驶舱。