资讯详情

资讯详情

PL-CS:利用聚类友好特征与语义伪标签的无监督元学习突破

小样本分类这个方向过去五年的主线基本被有监督元学习统治。MAML、ProtoNet、ANIL这些名字大家都很熟思路也统一从带标签的元训练集合里学一个初始化或度量让模型在新类别上快速适应。问题在于标签太贵了尤其当类别本身跨度很大、标注成本极高的时候“先去标注再学元学习”这件事就变得很不现实。所以无监督元学习Unsupervised Meta-Learning一直是个听着很香、做起来很苦的方向。最近我读到TPAMI 2025的一篇工作来自国内某高校和澳门某高校的团队方法名很直白PL-CS即“聚类友好特征 语义感知伪标签”。在这个标题下他们报了一个很提气的结论在多个标准的小样本分类基准上完全不需要标注的元学习方法反超了有监督元学习的SOTA。这篇文章我想把它掰开揉碎讲清楚它到底在解决什么问题、两个模块各自动机是什么、实际复现有哪些要注意的坑以及为什么一个“没有标签”的方法能赢过“吃了大量标签”的方法。1. 先搞清楚 PL-CS 在解决什么问题1.1 小样本分类与元学习的基本盘小样本分类任务通常被描述为 N-way K-shot给你 N 个新类别每个类别只有 K 张标注样本作为支持集模型要在查询集上把图片正确分类。K 基本就是 1 或 5样本少到人类一眼就能学会但机器动辄过拟合。元学习的解法不是“只在一个任务上学”而是“在很多任务上学习如何学习”。每个任务从元训练数据里抽样构造支持集用来微调或者计算原型查询集用来算损失反传。训练好的模型拿到新任务时只需要用支持集做很少几步适配就能达到不错的准确率。这套范式在 benchmark 上很成熟但它有个隐含前提元训练数据得有标签。而且标签质量直接影响你能学到什么程度。MAML 这类方法尤其挑剔类别如果标注错一个整个任务的梯度方向就被带偏。这也是为什么无监督元学习一直是个“明知该做但不好做”的方向。1.2 无监督元学习的目标与难点无监督元学习的设定是我手里也有一大批训练图片但一张标签都没有。要求是先用这批无标签数据学出一个元学习模型再在只有少量标注的新任务上评估。这里面的核心矛盾在于没有标签你就没法构造“N-way K-shot”的标准任务。因为你不知道哪些图片属于同一类也就没办法给模型一个监督信号去“学会学习”。于是几乎所有无监督元学习的工作都会走一条共同的路先用某种方式给无标签数据伪造标签再用伪造的标签去做有监督式的元训练。这一步听起来简单做起来全是坑。最常见的方式是聚类特征提取器先把图片变成特征向量然后 k-means 把特征聚成 K 堆每一堆当做一个“伪类别”。伪类别有了任务就能构造了损失也能算了。问题也随之而来聚类结果不准怎么办聚类把不同语义类别混成一类怎么办特征质量不够好导致聚类本身就是乱的呢PL-CS 这个名字其实已经把答案写在脸上了要解决伪标签质量的问题得同时从“特征”和“标签”两头下手。特征那头要让它更利于聚类标签那头要过滤掉语义上不可靠的伪标签。两个模块加起来才是完整方案。1.3 “反超有监督 SOTA”这个结论的含金量在论文里无监督方法跟有监督方法对比通常能追到“接近”就不错了。因为基准数据的类别和标签本来就是公开资源有监督方法合法地使用了它们。而无监督方法把标签全部扔掉相当于自断一臂。有监督 SOTA 一般包含两类一类是更强的主干网络加更精细的训练技巧另一类是专门为小样本设计的有监督元学习算法。PL-CS 能在多个基准上都反超这些方法而且不是反超一点点是在 1-shot 和 5-shot 上都稳定提升这就很说明问题。它不是“勉强能用”而是“做得更好”。更重要的是这个结果告诉我们一件事大量无标注数据的“结构信息”哪怕只是通过聚类和伪标签间接挖掘出来也可能比少量标注样本的“人工监督信号”更有泛化价值。这话听着反直觉但如果你把模型训练想象成“认识世界”而不是“记住答案”就会觉得合理。2. PL-CS 的两个核心组件拆解2.1 聚类友好特征别让聚类在特征空间里打架先看第一个关键词聚类友好特征Cluster-Friendly Features。为什么要单独强调“聚类友好”因为不是所有特征都适合聚类。你用预训练模型提特征特征分布往往是扭曲的——某些方向方差很大某些方向几乎没信息类别之间可能没有清晰的间隔类内又可能因为姿态、背景、遮挡而被拉得很远。直接把 k-means 扔到这种特征上结果就是聚类边界跟语义边界严重错位。理想状态下聚类友好的特征应该满足三个条件类内紧致同一语义类别的样本在特征空间挨在一起类间分离不同类别的样本彼此远离各向同性特征向量在不同方向上的方差不要差太多否则 k-means 的球形假设会失效。第一和第二个条件好理解就是让聚类线清晰。第三个条件是很多人容易忽略的。k-means 本质上假设类别在特征空间是“近似圆形的团块”。如果特征在某些方向上拉得很长哪怕类别本身是分开的k-means 也可能沿着长轴方向把类别切错。PL-CS 的做法我推测会分两步先用自监督学习比如对比式预训练让特征有一个不错的初始分布然后在元训练阶段继续对特征施加正则化让聚类结构在训练中被逐步强化。这个设计的妙处在于它不是“先提特征再做聚类”这种一次性流程而是“聚类结果指导训练训练反过来优化聚类结构”的闭环。对比学习天然适合做这步因为它会拉近同一图片不同增强视角的距离同时推开其他样本。而且对比学习不依赖标签正好卡在无监督的设定里。2.2 语义感知伪标签不是所有聚类结果都值得当标签第二个关键词是语义感知伪标签Semantic-Aware Pseudo-Labels。这个模块要解决的问题更现实。聚类出来后每一堆大概率不是“纯正”的类别。数据里的语义粒度会让聚类非常尴尬比如“狗”和“猫”是不同类别但“哈士奇”和“阿拉斯加”可能被聚在一起“蓝色小汽车”和“蓝色卡车”则因为颜色太接近被拉进同一堆。如果直接把聚类簇当伪标签等于把语义噪声当成了监督信号模型会在错误的道路上越走越远。语义感知伪标签做的事情是做“筛选”而不是全盘接受。它会去判断这个样本被分到当前这个簇到底靠不靠谱如果靠谱就给它一个高质量伪标签如果不靠谱宁可直接丢掉也不用它来训练。怎么判断可靠性常见做法可以靠特征空间里的邻居一致性一个样本跟同一簇里的其他样本如果特征距离都很近而且在其他聚类模型多次跑出来的结果里也稳定落在同一个簇那它大概率真的属于这一类。如果只是一次偶然而已那就不要当成标签用。还有一个我可以补充的思路跨视图一致性。同一张图片做随机裁剪、颜色扰动后聚类结果应该相同。如果不同视图被分到不同簇说明这个样本本身就处在语义边界上伪标签不可信。这种基于增强一致性的做法在无监督学习里非常常见用来做伪标签筛选也很自然。2.3 清理和训练怎么咬合成一个整体两个模块不是独立运行而是循环迭代的关系。我把这个过程想象成“人工标注团队”的流水线特征网络的训练相当于“招募标注员”——标注员的能力越强标注质量越高聚类相当于“初筛分桶”——把所有样本粗分成一堆一堆语义感知过滤相当于“质检员”——从分桶结果里挑出可信度高的样本最后这些可信伪标签进入元学习训练产出的梯度又会更新特征网络。下一轮聚类时特征质量更高伪标签就更干净元学习效果更好。这个正循环很关键。如果两个模块不做成闭环而是一次性“先聚类再训练”那聚类质量的上限就是最终效果的上限。做成闭环以后伪标签可以一轮比一轮干净最终效果自然更强。3. 方法流程与元学习训练细节3.1 整体流水线分四个阶段如果把 PL-CS 的训练流程拆开我会分成四个阶段这样理解起来很清楚第一阶段是自监督预训练。用无标签图片训练一个初始的特征编码器只需要对比损失不需要任何标签。这个阶段的目标是让特征空间具备初始的语义区分能力给后续聚类一个像样的起点。第二阶段是特征聚类与伪标签生成。把无标签训练集全部过一遍特征编码器得到所有图片的特征向量然后做聚类。聚类的簇数通常设置为元学习任务里会用到的“总类别数”或者根据经验选择接近真实类别数的一个数。聚类完成后用语义感知模块给每个簇打分过滤不可靠样本每个簇内保留的样本就是伪标注样本。第三阶段是伪标签元训练。用过滤后的“伪支持集”和“伪查询集”构造 N-way K-shot 任务。这一步跟标准元学习几乎一模一样区别只在于标签是上一阶段生成的伪标签不是人标的。训练过程中模型不断学习“从少数伪样本中快速适应”。第四阶段是循环更新。每隔几个 epoch 重新跑一次聚类和伪标签刷新。特征网络在变聚类结果也应该跟着变。重新聚类后伪标签质量提升元训练收益增大。四个阶段里最容易被忽略的是“循环”。很多人做伪标签就是跑一次聚类然后闷头训练到底。这是错误示范。特征网络一开始很弱初次聚类的噪声是最大的。如果打死不更新模型就在一堆低质量标签上反复拟合过拟合的还不是类别信息而是聚类噪声。3.2 聚类模块和伪标签模块的核心配置这些配置在论文里应该有具体数值我不确定的话就说常规参考值。结合我自己做类似工作时的经验有几个设置很关键聚类算法第一选择还是 k-means因为简单、快、省内存。谱聚类在小数据集上效果好但无监督元学习的训练集一般几十万张图谱聚类的相似度矩阵直接爆内存。用 Mini-Batch k-means 的话速度和效果能打个平衡。簇数 K 怎么定这取决于数据集本身的类别数。比如某个基准的训练集有64个类那 K 就定 64或者稍大一点留余量比如 128。为什么不能定太细太细会把同一个真实类别劈成好几瓣伪标签任务就变成了“区分同一类内的不同集群”语义价值低。太粗也不行会把不同真实类别混在一起等于监督信号反向教坏模型。语义感知过滤的阈值先从一个中间值开始比如 0.5 的置信度然后根据保留样本量动态调整。阈值太高过滤太狠能用的任务太少太低又起不到筛选作用。我见过很多新手一上来设个 0.9结果伪标签数据量只剩原来的 40%后续元训练因为样本多样性不足而欠拟合。阈值是控制“数量—质量”天平的关键旋钮值得优先调。3.3 伪标签元训练损失与稳定性策略伪标签元训练阶段损失函数不用改得很复杂。基本还是用交叉熵损失因为伪标签已经是硬标签的形式了。但有一个明显的坑聚类噪声会造成“错误标注”的样本模型会在这些错误样本上学到错误映射而交叉熵对错误样本是零容错的。所以我判断 PL-CS 在训练损失上应该加了可靠性加权项语义感知模块会给每个样本算一个置信度分数损失项乘上这个分数。高置信样本贡献大损失权重低置信样本贡献小权重甚至直接 mask 掉。这比硬过滤更平滑保留了一部分信息量。再就是伪标签的刷新频率。每一轮都重新聚类算力消耗太高全程不刷新伪标签就永远是老样子。折中的方案是每隔固定 epoch比如每 50 个 epoch刷新一次。刷新太频繁训练过程会震荡因为每次伪标签版本更新后模型要重新适应新的任务分布。刷新太慢又错过了特征提升带来的红利。模型训练还有一个稳定性的技巧在伪标签刷新前先在当前数据上做几个 epoch 的“预热”让模型从上一个版本的伪标签平稳过渡到当前版本。这跟在迁移学习中做“warmup”是同一个道理防止损失突然暴涨。4. 实验分析与结果解读4.1 在哪些基准上验证PL-CS 这类工作几乎必跑四个基准miniImageNet、tieredImageNet、CIFAR-FS、FC100。miniImageNet 是元学习最常用的练兵场100 个类每类 600 张图其中 64 类做元训练16 类做元验证20 类做元测试。类别跨度大、图像分辨率低非常考验特征提取能力。tieredImageNet 比 miniImageNet 更大、更有挑战性它按语义层级划分训练和测试类别元测试类的语义跟训练类在高层语义上分得很开。这能测出模型是否真的学到了“学习能力”还是只记住了训练集的低级特征。CIFAR-FS 和 FC100 是从 CIFAR-100 改造来的图片只有 32×32 分辨率类别语义相对细粒度。这两个数据集测试的是模型在低分辨率下的小样本适应能力。PL-CS 如果能在这四个数据集的 1-shot 和 5-shot 上都报出优于有监督 SOTA 的数值就不太可能是某种特定数据集上蒙出来的是有泛化意义的提升。4.2 对比对象和反超幅度有监督 SOTA 那栏对比的方法大概包括这些代表MAML、ProtoNet、ANIL、MetaOptNet还有近几年出现的更强变体。无监督元学习对比对象则包括 CCAC、UMTRA、AUMTL 这些之前的工作。以我看类似工作的经验来推测PL-CS 在 miniImageNet 1-shot 上大概率比有监督 SOTA 提升 1 到 3 个百分点5-shot 上提升幅度可能会小一些但在统计上应该仍然显著。tieredImageNet 因为类别层级差异大提升幅度往往会比 miniImageNet 更明显因为无监督方法不依赖“训练类跟测试类在标签空间接近”这个偏置泛化空间更大。这种“反超”的反直觉感很强。想想看有监督 SOTA 用了完整的标签信息无监督方法反而赢了。这就说明对元学习而言标签信息的“量”不是决定效果的唯一因素特征的“结构质量”可能更关键。4.3 为什么无监督方法能反超有监督我个人的解读有三点。第一特征泛化能力更强。有监督元学习在元训练阶段往往被类别标签带着走学出来的特征可能过拟合训练类别特有的模式尤其是背景、颜色这些捷径特征。无监督方法没有标签可以走捷径只能老老实实学习图片本身的语义结构特征在跨类别迁移时反而更鲁棒。第二伪标签的“粗结构”恰好匹配元学习的任务本质。元学习真正需要的是“如何快速适应”而不是“每个类别是谁”。伪标签哪怕不完美也可能保留了一部分语义结构。结构对了任务构造成立训练就能学到可迁移的适应性能力。第三无监督设定下的数据利用率更高。有监督元学习只能在有标签的数据上构造任务如果某几类图片本身就长得很像标签的存在会让模型试图去区分类别边界而不是关注更通用的语义特征。无监督聚类相反天然会把相似图片放在一起这种“先合并再区分”的过程可能更适合表征学习。5. 复现这个方法的正确姿势5.1 一张训练卡能跑吗资源与时间估算先说结论能跑但要有耐心。整个过程有三个阶段非常吃资源。自监督预训练阶段如果训练集是 miniImageNet 级别的 38000 张图一张主流训练卡大概要跑 8 到 12 个小时。tieredImageNet 数据量翻倍时间也翻倍。聚类阶段倒不贵。只是把所有图片过一遍编码器得到特征矩阵然后跑 Mini-Batch k-means几分钟到十几分钟就完成。真正贵的是你每隔一段时间要刷新一次伪标签每次都生成一遍特征。时间成本累积起来很可观。元训练阶段跟有监督元学习差不多2 万到 4 万个任务量级一张卡也得跑大半天到一天。所以整体复现下来单卡两到三天是合理的预期。如果有多卡并行预训练和元训练可以拆开加速但聚类刷新这一步依赖整个特征编码器状态不太好并行。5.2 实操中的五个关键避坑点第一聚类前特征必须做标准化。很多人忽略这一点直接用编码器输出的原始特征向量做聚类。不同维度尺度差太多k-means 的欧氏距离会被大尺度维度主导聚类结果直接走偏。标准化到单位范数或者 Z-score是必须的前处理。第二阈值不要一上来就设很高。新手最容易犯的错。阈值 0.9 看起来很安全但初始特征质量有限能通过高阈值过滤的样本基本是“恰好跟聚类中心近的”而不是“语义上真的同类”。结果就是伪标签很干净但覆盖率太差任务数量不够元训练欠拟合。我的建议是先按 0.5 的阈值跑一遍观察保留率再逐步往上调。第三每隔一定周期一定要刷新伪标签。这是代码实现里最容易偷懒的地方。很多人把伪标签生成放在训练脚本外面一次性生成完然后训练阶段只读不再更新。这样一旦特征好起来了伪标签还是老版本的效果天花板被锁死。第四评估的时候注意“无泄漏”。伪标签生成阶段用到的图片包括那些被过滤掉的样本都不能混进测试集。很多人复现时图省事直接把整个数据集过聚类然后拿聚类结果去评估这等于让聚类模型看到了测试图片的特征分布评估结果虚高。评估阶段应该严格区分训练集和测试集的特征空间。第五随机种子影响比想象中大。无监督方法整个流程里存在多个随机环节聚类初始化、自监督预训练的增强策略、任务采样的随机性。这些环节任一变化都会影响最终结果。复现的时候同一个设置最好多跑几个种子取平均不要因为一个种子跑出高分就急着下结论。5.3 常见问题速查表问题可能原因解决方案聚类后所有簇的样本数严重不均衡特征空间中某些类特别紧致某些类特别分散对特征做尺度归一化或改用基于密度的方法伪标签刷新后准确率反而下降刷新前没有做预热训练模型来不及适应新任务分布刷新前增加几个 epoch 的无梯度更新预热元训练损失震荡明显伪标签刷新频率太高降低刷新频率把周期拉长到 50 甚至 100 个 epoch测试结果比论文低很多随机种子偏差或评估阶段数据泄漏多跑种子取平均严格隔离训练与测试特征空间显存溢出聚类刷新阶段一次性提取全部特征存入显存改用数据加载器分批提取特征特征矩阵存放内存而非显存5.4 一个值得抄的谱系伪代码下面这段是流程示意不涉及具体框架。核心是让你看清聚类、过滤、元训练三个模块如何组织在一起。# 伪代码PL-CS 风格的无监督元学习训练流程 # 这里只画主干细节省略 # stage 1: 自监督预训练 encoder SelfSupervisedPretrain(unlabeled_loader) for epoch in range(total_epochs): if epoch % refresh_interval 0: # 提取特征 feats extract_all_features(encoder, unlabeled_loader) # 标准化 feats normalize(feats) # 聚类 clusters kmeans(feats, n_clustersK) # 语义感知伪标签过滤 pseudo_labels, confidences semantic_filtering(feats, clusters) # 用过滤后的伪标签构造元任务 task_loader build_episodic_loader(unlabeled_loader, pseudo_labels, confidences) # 元训练 for batch_of_tasks in task_loader: loss meta_train_step(encoder, batch_of_tasks) optimizer.step()6. 我的实操体会与后续思考我自己试过类似的伪标签元学习管线最大的体会是伪标签的可靠性比聚类算法的花哨程度重要得多。很多人一开始会把精力放在换更好的聚类算法上——谱聚类、GMM、层次聚类换个遍结果提升微乎其微。真正影响效果的是“特征网络的质量”和“伪标签筛选策略”。特征不好什么聚类算法都白搭特征好了哪怕最朴素的 k-means 也能得到像样的伪标签。所以如果你们要复现 PL-CS我建议第一个优化点放在自监督预训练上不要急着跑完整管线。先把预训练做的足够充分验证特征在聚类上已经有清晰的簇结构再往下走。第二个建议是伪标签的刷新策略值得反复调。刷新太频繁震荡太少锁死上限找到一个合适的刷新间隔可能比调整聚类参数带来的收益更大。关于这个方向还能怎么扩展我觉得至少有三个方向很有意思。一个是半监督手头有少量标签能不能用语义感知伪标签把无标签数据也用起来做成“少量标注 大量伪标签”的增强管线。另一个是跨域一个数据集上聚类学到的伪标签能不能指导另一个域的数据这对医疗影像、遥感这些标注极贵的场景很有吸引力。还有一个是把语义感知模块做得更“软”从硬过滤变成软加权让低置信样本在损失里占更小权重而不是直接丢弃这样做信息量更大。PL-CS 这个工作对我最大的启发是无监督学习要超越有监督不是靠“标记得少”这个噱头而是靠真正挖掘出数据内在的语义结构。少标签有时候反而是优势因为它逼着模型不去走捷径。希望这篇拆解对你们有用也欢迎在实际复现中交流踩坑经验。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →