一条动作序列的每个片段都被贴上世代标签,几条标签不同的片段被分放进不同托盘

一、异步执行打破的四条隐含假设

有一个公开的在线强化学习框架针对的就是这个场景,它的主张是异步执行已经是真实部署的常态,在线强化学习要围绕这件事重新设计动作维度。框架的具体机制本文不复述,我们关心的是另一层:在线强化学习的教科书假设里藏着四条同步性前提,异步一上生产,这四条同时失效,而最先要补的不是算法,是样本的世代标识。

第一条假设是采集与更新在时间上对应。同步执行时,一批样本采完再更新,更新只影响下一批,因果链干净。异步执行下推理、执行、更新三条流水线并行,采集正在进行时更新已经完成了几轮,同一批样本里混着新旧策略的产物。现场表现是指标抖动但找不到原因,因为无法判断哪几条样本是在策略变化之后采的。

第二条是单次轨迹内的策略同一性。一次任务往往包含几十上百个动作,异步部署加上滚动升级,很容易出现轨迹前半段由上一版策略决策、后半段由新版决策。现场表现是失败案例里行为风格突然变化,看整条轨迹像是两个不同策略的拼接。

第三条是动作发出时的世界状态与执行时的状态一致。同步假设下”观测到、决定、执行”三步几乎同时发生;异步下动作发出后环境继续变化,等执行机构接到指令,引起这个决策的那次观测已经过期。机器人和界面自动化里最常见,也是本文第四节要单独处理的问题。

第四条是失败与超时的归属。一个超时的动作到底属于哪一版策略、算不算该版的失败,异步系统里很难自答。现场表现是重试和取消混在轨迹里,失败率统计口径每次都不一样。

四条假设的共同点是它们都是”同一段时间内只有一份策略在起作用”这一个前提的展开。承认前提失效,后面的做法就顺了。

二、六字段留证:先补世代标识,再谈新算法

把世代标识做实,每条样本落盘时需要下面六个字段。这套字段的价值在于它不依赖任何特定算法,换了策略网络、换了更新方式都能用。

字段 内容 缺了会怎样
策略版本与配置哈希 产生这个动作的模型版本,加一份配置哈希而不只是版本号 同版本号不同配置的两版策略样本混在一起
发出时刻与完成时刻 动作被决定的时间与被执行完成的时间,两个都要 无法量化执行延迟,也就无法判断过期观测的严重程度
执行期间的观测摘要 从发出到完成这段时间里环境侧看到了什么 无法判断动作执行时世界是否已经变了
环境侧独立时钟或序号 由环境自己维护的时间线或单调序号 只信训练侧时钟,跨机时会出现顺序错乱
更新是否已影响后续采集 一个标记,说明这次更新之后采样是否已切换 分不清样本来自更新前还是更新后
作废原因与作废者 谁判定这条不能用,依据什么 指标复算时无法解释为什么数据量变化

六项里最容易省的是第四项和第六项。环境侧独立时钟之所以必要,是因为训练侧的时间戳记录的是”我们收到消息的时间”,不是”事情发生的时间”,机器人现场和界面任务里这两者并不等价,而它们的差别恰好落在决策到执行这段关键窗口上。作废字段之所以必要,是因为作废这件事本身会改变指标。

一句话概括这一节:没有世代标识的样本进训练集等于投毒。它不是脏数据,是身份不明的数据,你无法判断该按哪一版策略的期望来使用它,也无法在回滚时把它剔除出去。

三、过期程度的三档处置与各自代价

样本随策略更新而变旧,这件事一般用 staleness 一词来描述。三档处置没有通用最优解,选哪档取决于任务的动作时延和数据稀缺程度。

第一档是严格按策略版本分桶,只用同代样本训练。好处是理论上干净,更新只面对同分布的数据;代价是数据利用率低,策略更新越频繁越明显,而在真实部署里更新频繁恰恰是常态。机器人现场采一条轨迹代价高,这一档在很多场景撑不住。

第二档是允许按样本年龄做衰减加权,越旧的样本权重越低。好处是利用率上来了,数据不至于浪费;代价是引入了一个需要维护的超参,而且它把”旧”和”偏差大”当成同一件事,这两者并不总是相关。有些策略小改动并不改变动作分布,衰减反而白白丢掉了有效样本。这一档必须配一个前提:衰减系数要随版本改动的幅度变化,而不是随代际间隔固定衰减。

第三档是超过年龄直接丢弃。适用于环境变化快、观测过期的场景,代价是丢得多且丢弃规则需要审计,否则训练集规模会随时间莫名缩小。

三档共同的要求是:处置规则本身要进版本管理,和策略版本一起记录。同一条样本在某次训练里被加权使用、在另一次里被丢弃,这件事要能被查出来,否则指标差异无法归因。

四、动作发出后环境继续变化:三类观测错位与处置规则

第三条假设失效的具体形态,我们按现场类型分成三类,每类给一条可判定的处置规则,规则要能写成代码里的判断而不是事后人眼复核。

  • 机器人执行期间有人移动工件。处置规则:动作执行前对关键目标做一次局部再确认,再确认失败时不允许执行原动作,而是把这条轨迹标为”观测过期”并作废,同时记录作废原因。判据是明确的,目标位置与决策时位置的偏差超过阈值即作废。
  • 界面任务里弹窗出现。处置规则:执行前重新取一次界面结构快照,快照里出现未预期的顶层元素时,本次动作不执行并转成一次”等待人工确认”的状态。这里的关键是弹窗不能被当成界面的一部分继续点下去,误点造成的后续状态变化会污染整条轨迹的上下文。
  • 请求重试导致同一动作被记录两次。处置规则:每个动作带一个幂等标识,写入样本时按标识去重,重复记录只保留首次并给第二条打重复标记。这条最像普通工程规范,但它在训练侧的后果是被重复计数的动作看起来频率更高,模型会朝那个方向偏移。

三类的共同处置原则是:观测错位不能”尽力执行”,宁可作废样本也不要让错位状态进入训练集。作废的样本仍然要记录,见下一节。

五、失败隔离、重放边界与作废样本要留存

不是所有异常都能重放。可以安全重放的是没有外部副作用的动作,例如只读的查询和状态获取,它们重试不会改变世界。必须谨慎的是带副作用的动作,如下单、写入、机械臂抓取,这类动作在超时后不能盲目重放,因为超时不代表失败,很可能已经执行成功只是回执丢失。判定规则是:只有当动作接口本身提供幂等语义或可查询的执行结果时,才允许自动重放;否则只能标为状态未知,由上层策略决定。

必须整条轨迹作废的情形有三类:中途发生策略版本切换、关键目标位置或界面状态在观测错位后无法恢复、以及执行过程中出现需要人工介入的中断。这三类的共同点是继续训练会把”不是这个策略造成的结果”归给它。

作废的样本要留存而不是删除,这一条常被做错。删除之后,指标无法复算:同一批数据两次算出来的成功率不同,而没人知道少了什么。正确的做法是作废标记加原因字段保留全部记录,训练时按标记过滤,评测时可以选择带或者不带作废样本两种口径各算一次。两种口径的差值本身是有信息量的,它反映现场异常率,也是向客户解释”为什么这条产线的成功率数字和演示不一样”时唯一能拿出来的东西。

六、评测与运维的连带改造,以及对客户的说法

评测侧要跟着改三件事。第一,同一评测集必须在同代策略上跑,跨代对比得到的差异里混着环境差异和数据新鲜度差异,读数没有意义。第二,指标按代次分列成多条曲线而不是一条总趋势,异步系统里那条平滑上升的曲线通常是聚合出来的假象。第三,把版本切换点显式标在曲线上,没有标记的曲线读不出趋势,出问题也定位不到是哪一版引入的。

运维侧三条纪律。策略更新与采样之间设冷却窗口,避免正在执行的长任务被中途换策略;灰度期间新旧策略的样本物理隔离,落在不同的存储桶而不是靠字段过滤,靠字段过滤迟早出事故;任何策略回滚必须同时回滚训练数据的准入规则,只回滚模型而留着新策略采的样本继续训练,等于用一代的行为教另一代。

对客户要讲实话。在线自进化不是”越用越好”,它先要求系统能把”这次动作用了哪一版策略、这一版从哪些数据学到”讲清楚,讲不清楚的时候,用得越多越危险,因为你在积累身份不明的样本。洹拓在做机器人和界面自动化方向的在线训练项目时,把这条写进交付说明,也把六字段留证和代次分列曲线作为验收项:一个在线学习系统如果给不出带版本标记的样本清单和分代曲线,那么它的自进化承诺只是界面文案,不是可以复核的能力。