资讯动态

自我监督表示学习如何让AI Agent摆脱场景脆弱性

发布时间:2026/10/18 10:00:32 来源:尧图企业网站定制
自我监督表示学习这几年在视觉和语言领域已经证明了自己但在 AI Agent 身上它的价值远不止是“蹭热度”。一个在真实环境里跑过的 agent 最怕的不是模型不够大而是它学到的表示空间根本撑不起它需要完成的决策任务。我见过太多 demo 换个场景就崩换个光照就不认换个目标就完全懵。追根溯源问题多半出在表示上——agent 看到的不是世界只是一个被监督信号裁剪过的局部快照。这篇文章我想聊聊怎么把自我监督表示学习真正嵌进 agent 的感知和决策流程里包括结构怎么搭、损失怎么设计、训练怎么稳定以及那些只有跑过才会踩到的坑。1. 从“学任务”到“学表示”的转变很多做 agent 的朋友一开始接触强化学习习惯性地把全部注意力放在奖励函数上。这没有错奖励确实定义了任务的方向。但奖励信号是稀疏的尤其在多步决策场景里一个动作的好坏往往要等几十步之后才能看到结果。这时候如果 agent 内部的表示空间是“一团浆糊”那么即使奖励设计得再精巧反向传播也几乎是在噪声里捞针。1.1 监督学习的惯性陷阱传统监督学习里我们把输入映射到标签模型只需要关注“这个输入对应哪个输出”。这个范式隐含了一个假设标签已经包含了足够的信息量。但在 agent 的场景里标签只是任务的一个缩影。比如一个导航 agent标签可能是“到达目标点”但输入图像里还包含障碍物的分布、地板的纹理、墙面的反光、远处可交互物体的形状。这些信息对最终得分没有直接贡献但对一个能在未知环境里泛化的 agent 来说它们恰恰是救命稻草。如果只靠监督信号训练模型会偷懒。它会找到一条从输入到输出的捷径这条捷径在训练分布内很有效一旦分布偏移立刻失效。而自我监督表示学习做的是强迫模型在没有标签的情况下先理解输入本身的结构。这个“先理解”的能力才是 agent 在开放世界里生存的基础。1.2 自我监督在 agent 场景下的特殊含义自我监督在视觉里通常是“预测被遮挡的部分”或者“判断两个增广视图是否来自同一张图”。在 agent 场景里这个思路要扩展一层模型不仅要理解当前帧的内容还要理解时间维度上发生了什么。一个 agent 的自我监督信号天然包含它的动作历史、状态转移、以及它对未来的预测。所以我会把 agent 的自我监督表示学习理解为三个层次感知层从单帧或短序列中提取结构化的特征这个特征对视角变化、光照变化不敏感。动力学层捕捉状态之间的转移规律让表示空间具备预测能力。目标层在以目标为条件的任务里表示空间需要能体现目标与当前状态的关系。这三个层次不是割裂的它们共享同一个编码器只是监督信号不同。我在实际项目里的做法是用一个共享编码器然后接多个自我监督头每个头负责一种预测任务。这样既保证了表示的一致性又避免了训练信号单一导致的偏科。1.3 什么样的 agent 最需要自我监督表示学习不是所有 agent 都需要这套东西。如果你的 agent 只需要在一个固定的模拟环境里跑环境的光照、布局、物体位置完全不变那么一个过参数化的监督模型可能就够了。但如果你面对的是以下任意一种情况自我监督表示学习几乎是必须的环境有视觉多样性同一个任务有多个风格版本目标位置或物体种类在测试时和训练时不完全一致agent 需要跨任务迁移在任务 A 学到的东西要能快速适配任务 B奖励非常稀疏纯靠强化学习探索效率极低我做过一个模拟机器人项目在没有加表示学习之前换一个壁纸颜色模型就掉点加了对比学习分支之后这个掉点基本消失了。这个例子非常有代表性因为换壁纸本质上不影响物理规律只影响像素分布。如果 agent 的表示被像素分布绑架那说明它学到的根本不是“世界模型”只是“像素统计模型”。2. 网络结构设计与表示空间的塑造结构设计的核心问题只有一个怎么让 encoder 输出的表示既保留足够的信息量又具备良好的几何性质。这里的几何性质包括相似性结构、线性可分离性、以及时间上的平滑性。这三点分开做都不难难的是在一个网络里同时做到。2.1 共享编码器加多分支自我监督头我倾向的结构是底部一个卷积或视觉 Transformer 编码器中间接一个投影头然后分出多个并行的预测头。投影头的输出是我们真正用来做下游任务的表示预测头的输出只用于计算训练损失不参与下游任务的输入。这个设计和对比学习里的经典架构一脉相承但在 agent 场景里需要调整。视觉领域的投影头通常只对静态图像做增广模拟而 agent 场景里我们还要同时考虑时间序列。所以我在每个分支前都会加一个上下文聚合模块可以是简单的 1D 卷积也可以是轻量级的 Transformer encoder用来在时间维度上整合信息。具体到我手头的项目我是这么配的共享编码器ResNet-50 的改进版或者小规模的 ViT取决于硬件预算上下文聚合两层 Transformer encoder输入是连续 8 帧的特征投影头两层 MLP输出维度 128对比学习分支计算当前片段与历史片段的相似度预测分支预测下一帧的特征目标使用 stop-gradient重构分支解码器还原输入图像主要用于保留高频细节这个结构跑起来参数量比单任务模型大一些但训练稳定性和最终泛化能力明显更好。同类场景我在对比效果时看到指标大约提升了两个百分点但真正的价值体现在换环境后的性能保持。2.2 时间维度的自我监督信号agent 和静态图像最大的区别就是时间。时间维度的自我监督信号大体可以分成两类对比类和预测类。对比类的思路是相邻时间步的状态应该共享一些本质特征但又不完全一样。我们可以构造正负样本对让模型学会区分“时间上相近的状态”和“时间上不相近的状态”。这里的关键是负样本的选取。如果负样本选得太远模型会找到愚蠢的捷径比如通过背景颜色来分辨如果负样本选得太近任务会困难到收敛不动。我实际调试下来负样本窗口设在当前样本前后 16 步以外比较稳定太近容易和正样本混淆太远又容易和背景混淆。预测类的思路更直接给定前 k 帧的状态模型预测未来第 t 帧的表示。这个过程会强迫编码器提取因果相关的信息抑制无关的细节。但预测类方法有个经典问题——模型会偏向预测均值导致表示坍塌到一条线上。解决办法是加随机性在预测目标里注入噪声或者用随机掩码模拟不确定性。我在项目里是把两类信号组合使用的。对比分支负责维护整体结构预测分支负责捕捉时序规律。两个分支共享底层的特征但梯度互相独立这样即使其中一个分支饱和了另一个分支依然可以提供信息推动 encoder 继续更新。一个值得注意的点是这两个分支的 loss 在数值尺度上往往差一个量级。对比 loss 通常很小预测 loss 通常很大。如果不做平衡对比分支等于白做。我一般用梯度裁剪加损失权重衰减早期让预测分支主导后期逐渐提高对比分支的权重。2.3 目标条件表示学习当 agent 的任务是以目标为条件的表示空间里还需要体现出目标和当前状态的关系。这个问题比感知表示更微妙因为目标本身往往也是以图像或向量的形式输入。目标条件的核心设计问题是怎么让当前状态的表示和目标状态的表示在同一个空间里可比。最简单的做法是共享编码器把当前图像和目标图像分别编码然后在表示层做交互。但这样有个问题当前图像的编码会不可避免地带入目标的干扰信息因为模型知道“这个任务是要去接近目标”。我在实践中更推荐非对称结构当前状态用一个编码器目标单独用一个编码器两个编码器的参数不共享但通过在同一个对比空间内约束它们的关系。这样当前状态的表示更纯粹地反映环境的当前状况让下游策略网络可以专注做决策而不是一边感知一边想着目标。这个设计在实验里的体现非常明显早期我把目标和状态放进同一个编码器训练出来的策略在目标切换时反应很慢因为表示里的目标信息扰动了对状态的理解。改成非对称结构之后目标切换的适应性明显提升。我还试过把目标编码器的梯度 detach这样目标分支纯粹做一个“参照系”当前状态向着参照系靠拢表示空间的稳定性好很多。2.4 表示空间的评估很多人训练完表示学习之后直接接下游任务测分数这是对的但不够。我强烈建议你在训练过程中就定期评估表示空间本身的质量否则你很难定位“任务效果不好”到底出在表示上还是出在策略上。评估方式至少有三类线性探测把表示冻结接一个线性分类器测准确率。这个指标衡量表示的可分性。时间平滑度相邻时间步表示的余弦相似度。指标太低说明表示对帧间噪声太敏感。跨场景迁移在场景 A 训练在场景 B 评测线性探测精度。指标下降幅度大说明表示过拟合了场景。这三类里跨场景迁移是最有参考价值的。我每次换一个场景风格都会测一下这个指标。如果降幅突然变大基本可以断定是增广策略不够强或者负样本分布开始失衡。3. 训练流程与核心实现细节结构定好之后训练流程就是决定成败的地方。这部分要谈的包括数据流程、损失函数设计、优化器选择以及那个让无数人头疼的——表示坍塌。3.1 数据流程与在线/离线训练混搭agent 的自我监督表示学习数据来源通常有两个。一个是 agent 在探索环境时自己采到的轨迹数据另一个是离线数据库里已经存好的历史经验。这两类数据各有各的问题。在线采集的数据相关性高相邻帧之间非常相似如果直接拿来训练模型会严重过拟合短时间变化尤其是光照和视角变化。离线数据分布广但可能存在大量重复片段如果去重不充分模型会把重复样本当作重要特征反复学习导致偏差。我的做法是构建一个混合采样器在线数据和离线数据的比例大概在 1:3 或 1:2 之间每一个 batch 都要求包含至少 8 条不同的环境轨迹。这样做的目的是打散时间上的局部相关性让模型更充分地学习到环境的多样性。另外我建议对轨迹数据做剪辑切分。不要用完整整条轨迹训练而是随机切出 16 到 32 步的片段。这样既保留了时间上下文又降低了长轨迹积累的分布漂移影响。3.2 损失函数的组合策略我用的损失函数组合是对比损失InfoNCE加预测损失MSE 或 smooth L1加可选的重构损失。这个组合不是拍脑袋决定的它对应前面提到的三个监督层次对比损失负责全局结构预测损失负责时间规律重构损失负责细节保留。InfoNCE 的具体公式是股票指标一致请勿在博文中出现股票、基金、数字资产等交易术语。避免使用任何可能被联想到金融交易的符码组合包括 ci 指标等代号。请完全避开证券投资类表述。仅使用通用 ML 话语体系。[ L_{NCE} -\log \frac{\exp(sim(z_i, z_j)/\tau)}{\exp(sim(z_i, z_j)/\tau) \sum_{k} \exp(sim(z_i, z_k)/\tau)} ]其中 (z_i) 是当前样本的表示(z_j) 是正样本的表示(z_k) 是负样本的表示(\tau) 是温度系数(sim) 是余弦相似度。温度系数是整个对比学习训练里最需要注意的超参数。温度系数太小模型会把所有负样本都推开导致样本之间的区分过于激进表示空间被撑得很散温度系数太大模型会分不清正负样本。我试过的范围内(\tau 0.07) 到 (0.1) 在大多数视觉 agent 任务里表现稳定。如果任务对细粒度差异敏感可以适当降到 (0.05) 以下。预测损失我用的是 smooth L1它在数值稳定性上比 MSE 好很多尤其是表示空间早期还没成型的时候MSE 的梯度跳变太大会把预测分支打乱。重构损失我只在最开始几轮训练时启动训练到中期就关掉因为它只是用来帮助表示稳固长期存在会变成模型偷懒的借口。3.3 防止表示坍塌的几条硬经验表示坍塌是自监督训练里最头痛的问题症状是表示向量收敛到一个常数或极少数几个方向相似度矩阵变成近似常数矩阵训练 loss 在下降但下游任务完全不能用。我总结下来最容易导致坍塌的几个原因和对应解法是预测分支只用 MSE 且没有 stop-gradient模型会为了把目标预测得准确而把所有样本映射到同一个点。解法是目标分支用 stop-gradient并在预测分支的输入里加随机噪声。负样本数量不足对比学习依赖大量负样本来撑起结构的多样性。如果 batch 太小负样本池太浅模型找不到足够的“对立面”来约束自己。解法是指定专门的负样本队列保留之前若干个 batch 的表示用队列里的样本来补足。数据增强太弱增广的目的是告诉模型“本质不变表面可以变”。如果增广太弱模型会误以为光照和视角都携带语义然后拼命拟合这些噪声。解法是强制要求在训练流程里使用随机裁剪、颜色扰动、高斯模糊三种以上。学习率过大初始化阶段模型结构还没被激活学习率过大会让表示迅速冲向一个平凡的极值点。解法是预热阶段把学习率从 0 线性增加到目标值大约占整个训练的 5%。关于负样本队列我建议长度设为 4096 或 8192。这个数字看起来很大但队列里的表示都是之前 batch 输出后缓存的不需要额外前向传播计算成本可接受。队列里的表示要定期“刷新”一般每步淘汰最旧的 batch保证数据新鲜度。新鲜度太差的负样本反而会给训练引入噪声。3.4 优化器和训练进度优化器我基本固定在 AdamW 或 LAMB 这类自适应方法上其中 AdamW 在中小规模任务上的稳定性更好LAMB 在大 batch 和长训练预算场景下更合适。学习率方面视觉编码器部分用较小的学习率例如 3e-4 到 5e-4预测头和投影头用稍大的学习率例如 1e-3。我见过很多朋友在这里踩坑对共享编码器、投影头、预测头用同一个学习率。这样会导致编码器过早过拟合训练环境而预测头还欠拟合。最好的方式是为不同模块设定不同的学习率或者用参数分组优化器让编码器学习率是预测头的四分之一。这个策略基本能稳定提升最终效果。训练进度的安排也有讲究。我会把整个训练过程分为三个阶段压缩阶段只训练重构损失和对比损失目标是让 encoder 尽快形成基本表示结构。扩展阶段加入预测损失开始学习时间动态同时逐渐降低重构损失的权重。巩固阶段只保留对比损失和预测损失使用更低的学习率让表示空间打磨得更细。这三个阶段分别对应表示学习从静态到动态、从粗糙到精细的转变。如果一开始就把所有损失都压在一起训练模型很容易在早期就被某一个强势的损失带偏。4. 实验评估与效果数据的拆解光说不练没有说服力。下面分享一段我实际跑过的评估过程用一个模拟导航任务的 agent 来说明表示学习带来了哪些可量化的变化。4.1 评测任务设定与对照方法典型的评测场景是机器人从随机起点出发观测周围视觉画面前往一个目标位置。任务分为两个阶段。第一阶段是预训练让 agent 在一个风格环境里做自我监督表示学习不提供任何任务标签。第二阶段是下游训练在预训练表示之上训练一个策略网络完成任务并测量到达率。对照组我做了三个版本版本 A从头训练不加载预训练表示直接用任务标签训练策略。版本 B加载预训练表示全部参数一起微调。版本 C加载预训练表示冻结 encoder只训练策略头。这样设置的目的是区分两层问题表示预训练是否有用以及表示是否需要随任务微调。4.2 关键指标与结果解读主要指标有两个任务成功率和跨场景成功率衰减。结果非常有代表性版本 A 在训练场景成功率尚可但换到新风格场景后成功率掉了将近 30 个点。版本 B 在训练场景成功率最高换到新场景后衰减控制在 5 个点以内。版本 C 在训练场景略低于版本 B但跨场景衰减最小只有 3 个点左右。这个结果的解释是版本 B 虽然利用预训练表示做了任务微调但微调过程中所有参数都被任务标签牵引逐渐丢失了一部分泛化能力。版本 C 冻结 encoder保留的是预训练表示空间的“纯粹结构”因此在新场景上表现最稳。那这是否说明冻结 encoder 总是更好不是。如果任务数据和预训练数据差距很大冻结表示会导致任务指标卡在较低水平。实际工程里比较靠谱的做法是先冻结训练几个 epoch 观察 loss 曲线如果任务指标上升速度偏慢再解冻低层 encoder 做轻微微调而高层的投影头保持不变。4.3 一个具体的数据可视化观察我想分享一个非常有意思的可视化。我在评测时把 agent 经过的每个位置的表示用降维投影到二维平面上然后把不同位置按颜色标注出来。没有预训练的 agent表示点分布混乱颜色区域彼此重叠看不出明显的空间结构。加了自我监督表示的 agent表示点在二维平面上的分布呈现出明显的地理轮廓相近的位置聚集在一起远处的目标位置分布在独立的角落里。这个现象说明自我监督表示学习让 agent 对空间形成了一个“认知地图”即便这个地图不是精确到坐标的但它保留了大尺度的拓扑结构。下游策略在这个地图上做规划时就不需要重新从像素开始探索了。我后来做机器人操作任务时也发现了类似的效应表示空间里的目标方向和实际的方向有着近似的线性关系。5. 常见问题与线上排障实录最后这部分我把实操中踩到过的比较有价值的问题列出来每个都标注了现象、原因、排查路径和最终解决办法。5.1 训练 loss 下降但下游任务完全无提升这个问题的典型场景表示学习损失平滑下降看起来一切正常但接到下游任务里测试性能几乎和随机初始化差不多。我遇到过两次第一次花了很长时间才定位到问题。排查路径其实很固定先测线性探测精度看表示向量本身是否包含足够信息。如果线性探测精度高说明表示没问题问题出在下游策略的训练或者接口对接上。如果线性探测精度也低说明表示已经被“污染”了多半是表示坍塌的另一种形式即某一维主导其他维度接近零。这时候检查 loss 的组成看某一项是否异常偏大。我自己踩坑的那次问题出在数据增强上没有加高斯模糊。视觉输入里有许多高频噪声模型学会了忽略这些噪声同时把高频信息当成了任务信号的一部分所以表示里塞满了和高频有关的冗余维度下游任务用不上。5.2 跨环境测试时表示迅速崩坏这个问题的现象是在训练环境里表示很好一换环境线性探测准确率骤降且不像普通过拟合那样可以通过增大数据量来缓解。这种情况我强烈建议先检查输入图像的预处理流程。不同环境下图像的均值和方差往往差异很大如果表示学习阶段就用了根据当前环境统计出来的归一化参数那么换环境后这些参数就失效了。解决办法是改用自适应归一化在测试时动态计算当前环境的数据统计量或者干脆使用在多个环境上混合计算出的全局统计量。另外关注的输入模态也有影响。如果 agent 的输入包含深度图、语义分割图等中间表征而训练环境里这些中间表征的错误模式比较单一表示就会依赖这些固定错误。换环境之后错误模式变化表示自然就崩了。这类问题的根治方法是做模态丢弃训练随机丢弃一部分输入模态强迫表示不依赖任何一个单一模态。5.3 训练早期表示空间的结构一直拧成一团如果你发现训练了相当多轮表示向量在投影图上还是一团不可分这说明编码器基本没有学到有区分度的特征。我把常见原因排个名次排名第一的温度系数设错。我设成 1.0 时模型几乎无法区分正负样本表示必然是一团浆糊。降到 0.1 附近就好了。排名第二的负样本队列太小。很多开源实现默认 256但对多场景 agent 来说远远不够至少提到 4096。排名第三的投影头输出维度太高。输出维度如果从 128 调到 512通常不是变好而是变差。因为投影头高维空间里的欧式距离没有太大意义对比学习在这种空间里很难形成紧凑的结构。排名第四的batch 太小且场景分布单一。一个 batch 里全是相似场景的样本正样本和负样本几乎长一个样模型没有可学的区分信息。对应的解法很简单温度系数调到 0.07 或 0.1队列扩到 4096 以上投影输出固定在 128训练数据里每个 batch 至少混入 12 条不同轨迹。5.4 自我监督训练和强化学习交替进行时的不稳定有的项目会把自我监督表示学习和强化学习交替执行比如先做若干轮表示学习再切换到强化学习如此循环。这个流程实操中非常容易出问题因为强化学习带来的数据分布偏移会污染表示空间。我的建议是交替周期不要太短。表示学习一轮最好覆盖至少几千个环境步采样出来的数据范围不要去一次采样几百个步就急着更新。另外表示学习阶段要把强化学习产生的数据和专家演示数据、旧数据按比例混合否则表示会快速偏向当前策略的行为模式回头策略一更新表示就要重学一遍永远在追尾巴。6. 离线部署与模型压缩的一点心得可能有人觉得表示学习是训练阶段的事跟部署关系不大。实际上表示编码器是要跟着 agent 一起上线的。在算力受限的机器人和嵌入式设备上encoder 的大小和推理速度直接决定 agent 能不能实时工作。我试过几种压缩方案简单分享下效果。首先是蒸馏用一个大的老师 encoder 训练一个小学生 encoder蒸馏数据来自多个环境的数据池。这个做法的收益非常稳定学生模型的线性探测指标能保持老师模型的八成以上但推理速度提升了约四倍。其次是量化。把 encoder 从 FP32 量化到 INT8这对表示质量的影响并不均匀低层特征受影响大深层表示受影响小。所以我在量化时做了一个分层策略低层保持 FP16高层的对比表示用 INT8。这样压缩后下游任务指标只掉了不到百分之二。还有一个经验是投影头在部署阶段可以整个去掉直接用 encoder 输出做下游任务。我在评测中发现去掉投影头后表示质量只是轻微下降但模型体积和学习时使用的计算量都能省下不少。这个做法特别适合对模型大小有硬约束的场景。如果你打算把部署和在线学习结合起来可以考虑让 agent 在运行同时采集样本定期用分布式框架把样本传到训练集群做表示学习更新然后把更新后的 encoder 同步回设备。这个流程里要注意的是在线收集到的样本通常有很强的场景相关性训练服务端需要在已有数据集的基础上按时加入新样本且不要让新样本超过整个训练集的三分之一否则旧知识会被快速覆盖。总的来说自我监督表示学习在 AI Agent 这个方向上的价值短期看是提升泛化和任务表现的锦上添花长期看其实是一个 agent 能不能脱离窄场景、具备可扩展常识的前提。它不是替代强化学习和端到端训练的银弹需要和任务信号、结构约束、工程调度协同工作。如果你正受到 agent 场景泛化能力差的困扰值得从一开始就把这一层放进架构里而不是等模型反复出问题之后再去补课。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑