
最近几年少样本学习这个方向最吊诡的一个地方就是任务明明叫“少样本”但做研究时元训练阶段依然依赖大量有标注的数据。你想让模型学会从几个样本里抓住类别规律可训练时用的基类标签往往比目标任务的标注还贵。所以真正落到实际项目时无监督元学习一直是个很让人心痒的方向——不用标注还能在小样本场景下干活。但心痒归心痒以前看无监督元学习的工作心里总有个疙瘩大多数方法用自监督特征强拼一个原型分类器或者干脆拿对比学习预训练的嵌入去凑合性能跟有监督范式比总差着一截。所以我第一次看到这篇被 TPAMI 2025 接收的工作——国内高校与澳门高校合作的 PL-CS——标题里写着“聚类友好特征 语义感知伪标签无监督元学习反超有监督 SOTA”的时候第一反应不是惊喜而是不太相信。无监督路线反超有监督基线那得把多少隐形的便宜占全了才做得到带着这股较真劲把论文来来回回翻了几遍之后我承认这套思路确实有它的巧妙之处。它没有堆模型没有上大规模外部数据就靠两个组件——聚类友好特征和语义感知伪标签——把无监督元学习的基础架构重新捋了一遍。这篇文章我就从一个正在折腾少样本项目的从业者视角拆一拆 PL-CS 到底解决了什么问题、两个核心组件是怎么工作的、实验结论该怎么理解以及它在真实工程场景里有多大借鉴价值。1. 一个反直觉的起点都无监督了为什么还要让特征空间具备“类”的结构论文标题里的每个词都不是白给的。要理解 PL-CS得先退回到无监督元学习的基本盘上看清楚它和普通自监督预训练到底差在哪为什么以前那些做法一直压不过有监督方法。1.1 无监督元学习的两条主流路线PL-CS 选了更难的那条无监督元学习大体分两派。一派是 E2E端到端自监督路线。这种思路很直接先用 SimCLR、BYOL、MAE 这类自监督方法在海量无标注数据上预训练一个特征抽取器然后用支撑集样本的特征去直接构建分类器。在 CIFAR、mini-ImageNet 这类常见基准上这条路线的上限很稳定但也有个很难突破的天花板——它学到的表征足够通用却不够“结构化”。什么意思就是嵌入空间里的点虽然彼此可分但类簇之间的边界很模糊支撑集只有一两个样本时你很难判断查询样本应该归属到哪个簇。本质原因在于对比学习、掩码重建这类代理任务并不关心“类”这个概念它们只关心样本间的相似关系和结构完整性。另一派是 SLSelf-supervised Learning for meta-learning路线也叫自监督元学习。思路是在无标注数据上自己构造伪任务把无标注样本随机分成若干伪类每个伪类当成元训练里的一个“类”然后在伪 episode 上训练元学习器让它学会“从少量样本中归纳类别规律”的能力。这个路线和元学习的目标对齐度更高——你要的能力不是“看一眼就认出物体”而是“看三个样本就学会一个新概念”。PL-CS 走的正是这一派。别看都是自监督SL 路线有一个隐藏的大坑伪任务的质量完全取决于伪类的划分质量。如果伪类划分乱糟糟比如一个伪类里混了十几个真实语义类别那模型在伪任务上学到的就不是“抓住类别共性的能力”而是“强行拟合噪声的能力”。这恰恰是我在前几年不少 SL 方法里看到的问题——伪类划分太粗糙训练出来的模型迁移到真实少样本任务上总是差口气。1.2 聚类怎么就成了无监督元学习的胜负手既然伪类划分是命门那最自然的改进思路就是让伪类划分更贴近真实语义边界。可问题来了没有标签怎么知道真实语义边界在哪PL-CS 给了一个极致的回答既然不能靠标注知道边界那就让特征空间本身长成“对聚类友好”的样子。这里的“聚类友好”并不是一句空话它有两层含义。第一层嵌入空间里的样本呈现明显的簇状分布类内紧凑、类间分散同类样本天然聚在一起第二层这种簇状结构在经历下采样时依旧稳定——这一点会被很多人忽略。什么是下采样问题构造伪 episode 时你从一个大类里随机抽几个样本当作支撑集如果这个类内部特征本来就分散那抽出来的几个样本说不定落在簇的不同角落模型会误以为这几个样本代表了好几个不同的类。这与真实任务里“一个类只有几个样本”的场景严重冲突。换句话说以前的方法默认“类别”在特征空间里是好的几何对象却没想过要主动去塑造它。PL-CS 干脆把这个隐含假设摆到台面上想让无监督元学习有效前提是特征抽取器产出的表征必须“长得像类别”——这正是它第一个组件 Per-class Clustering 要干的事。而语义感知伪标签这个组件解决的是另一层问题一个特征簇即使形状很规整它也不一定对应真实语义类别。聚类只管“分得开”不管“分得对”。如果某个簇实际上是两个相似类别的拼接体那再规整也没用。所以 PL-CS 引入语义信息来校准伪标签相当于给伪类划分加了一个“语义质检员”。这两件事放在一起才是标题里“聚类友好特征 语义感知伪标签”的完整含义一个管特征空间的几何结构一个管伪标签的语义正确性。接下来我分别把这两个组件的实现逻辑拆开讲。2. PL-CS 的两个核心组件拆开看其实都不复杂我第一次看这两个组件的名字时以为里面又是复杂的多阶段训练、交替优化那一套。真正读完才发现每个组件背后的动机都很朴素实现上也不冗赘难的是把它们组合进同一条训练管线里还能保持稳定。2.1 Per-class Clustering把“未知”当“半已知”来用的艺术先看第一个组件Per-class Clustering逐类聚类。它的出发点非常直接无标注样本虽然不知道标签但它们的特征分布里隐藏着类结构我们要做的是在训练过程中显式地把这种类结构“逼出来”而不是指望它在对比学习里自动涌现。具体做法通常是这样的每次拿到一个 batch 的无标注数据先用特征抽取器比如 ResNet-12 或者 ResNet-18得到嵌入特征然后对这个特征集合做聚类把样本划到 K 个簇里。这里的 K 是超参数对应你预期元训练阶段用到的伪类别数量。接下来聚类结果不只是一个离线后处理步骤而是直接反馈到训练损失里要求模型把每个样本的特征推向它所属于的簇中心同时拉开不同簇中心之间的距离。用公式直观点说就是最小化一个类似这样的目标L_cluster -log( exp(-||f(x) - c_i||^2 / tau) / sum_j exp(-||f(x) - c_j||^2 / tau) )其中 f(x) 是样本特征c_i 是样本所属簇的中心tau 是温度参数。这个形式大家应该在对比学习里很眼熟——本质上就是把“样本 vs 增广样本对”的对比换成了“样本 vs 簇中心”的对比。不同的地方在于簇中心代表着某种“类原型”每次更新特征抽取器时簇结构也在跟着变两者形成一个相互促进的循环。为什么管它叫 Per-class 而不是 Cluster-friendly 或别的名字关键在它对“簇”的用法。普通聚类比如直接跑个 K-means 再拿结果当伪标签只关心怎么把点分组PL-CS 则更进一步把每个簇视为一个“隐式类别”在构造伪 episode 时以簇为单位抽取支撑集和查询集。这么一来元训练的每个 episode 里面“类”已经不是随机拼凑的样本集合而是特征空间里确实存在的、相对密集的簇。支撑集样本抽出来以后它们内部的一致性会高得多模型更容易学到“类别内共享的共性”。我当时读到这块时印象很深的一点是这个设计本质上是在“不知道标签”和“知道有类别”之间找了个中间位。我们不知道哪个簇对应哪个语义类别但我们知道真实世界里存在类别结构那么就让特征空间去拟合这个结构。这是一种比对比学习更强的归纳偏置也恰恰是无监督元学习最需要的偏置。2.2 Semantics-aware Pseudo-labeling给伪标签装一个“质检员”如果说 Per-class Clustering 解决的是“特征形状”的问题那 Semantics-aware Pseudo-labeling 解决的就是“伪标签含义”的问题。这是第二个组件也是 PL-CS 全文里我觉得最有实验价值的设计。聚类得到的簇再规整也可能和真实语义对不上。举个例子假设无标注数据里有三种狗和两种狼的照片特征空间里狗和狼的边界很模糊聚类可能把一部分狼和深色狗划进同一个簇。这个簇内部形状是紧凑的但它对应的是“犬科动物”这个跨类概念而不是任何一个可命名的类别。用这种簇构造伪 episode模型学到的就不是“区分具体类别”的能力而是“区分宽泛语义群”的能力一到真实少样本任务上就会露馅。PL-CS 怎么处理这个问题它引入了一个语义空间来“审计”伪标签。具体来说预训练一个视觉-语言对齐模型从论文的通用设计来看通常就是那种已经把图像和文本嵌入到同一空间的双塔模型然后为每个伪类生成一个语义描述向量——本质上就是用文本侧的特征去表示“这个簇可能在语义上指的是什么”。对每个样本可以同时计算出它跟所属簇中心的视觉相似度以及它跟簇语义描述的语义相似度两个分数结合成一个伪标签可信度分数。低于阈值的样本不进入元训练或者被打回去重新分配伪标签高于阈值的样本才被采纳。这个方法让我想起了半监督学习里常见的置信度筛选但 PL-CS 做了两个重要升级。第一它不是只看模型自己对伪标签的置信度而是把视觉特征层面的聚类一致性和语义空间层面的合理性绑在一起双重校验。第二它没有把伪标签当一次性结果用而是形成闭环——模型更新后重新聚类、重新计算语义相似度、重新筛选伪标签质量会随着训练推进而逐步提升。我自己在做半监督项目时遇到过类似问题只用模型置信度做筛选前期还好后期模型开始过度自信错标签的置信度也高筛选机制就失效了。PL-CS 这种“视觉 语义”双通道校验的思路相当于给伪标签筛选加了一个外部的稳定锚点避免模型自说自话。2.3 整条训练管线聚类、筛选、元训练、再聚类把两个组件串起来整个训练流程是下面这样一条闭环用无标注数据预训练特征抽取器得到初步的嵌入空间对特征空间做 Per-class Clustering得到 K 个簇用语义感知模块为每个簇生成语义描述计算每个样本的伪标签可信度按可信度筛选样本筛出的样本构成伪 episode 的支撑集和查询集在伪 episode 上执行元训练通常就是原型网络式或度量学习式的更新更新后的特征抽取器重新跑回到第 2 步迭代直至收敛。可以给一个简化版的伪代码帮助大家形成直觉# PL-CS 训练循环的简化伪代码 for iteration in range(max_iter): # 1. 特征抽取 features encoder(unsupervised_batches) # 2. 逐类聚类得到 K 个簇中心和样本分配 centers kmeans(features, K) assignments soft_assign(features, centers, tau0.1) # 3. 聚类友好损失拉近样本与所属簇中心 cluster_loss cross_entropy(assignments, pseudo_classes) # 4. 语义感知伪标签校验视觉相似度 x 语义相似度 visual_conf assignments.max(dim-1) # 样本与簇中心最高相似度 semantic_conf text_similarity(features, class_descriptions) pseudo_conf visual_conf * semantic_conf # 5. 生成伪 episode高置信度样本进入支撑集和查询集 support_set select_high_conf(episode_support, pseudo_conf) query_set select_high_conf(episode_query, pseudo_conf) # 6. 元学习损失 聚类损失联合更新 meta_loss prototype_loss(support_set, query_set) total_loss meta_loss lambda * cluster_loss update(encoder, total_loss)这里有几个细节值得注意。聚类不是每个 iteration 都重跑否则计算开销吃不消通常每隔若干轮次更新一次簇中心语义描述向量一般也是离线算好或者低频更新的因为双塔模型的参数在训练中保持不变。节奏上有点类似半监督里的但更慢一点的伪标签刷新周期。我后来在别的项目中试过类似的闭环设计经验是如果你把聚类的更新频率定得太高训练噪声会很大适中一点比如每隔几百步更新一次稳定性和最终精度都会更好。3. 实验结论怎么读不只盯那张 SOTA 表还要盯怎么做的对比论文标题里最扎眼的词是“反超有监督 SOTA”。这句话单独拿出来很有冲击力但作为有经验的读者我更关心的是在什么条件下反超、反超了多少、公平不公平。3.1 “反超有监督 SOTA”是在什么设定下成立的从论文的实验设置来看PL-CS 是在常见少样本基准上做的验证包括 mini-ImageNet、tiered-ImageNet、CIFAR-FS、CUB 这类大家跑烂了的数据集。训练时元训练数据完全不带标签模拟的是真实场景里“有大量图像、但没人告诉你它们属于哪一类”的情况测试阶段才引入标准的 few-shot episode 评估即 N-way K-shot 的支撑集和查询集。在这样的条件下PL-CS 报告的结果和之前无监督方法拉开了明显差距并且在多个数据集的 5-shot 设定上超过了报告里有监督元学习基线的水平。以 mini-ImageNet 5-shot 为例我记得无监督方法在这类基准上通常要比有监督方法低 2 到 4 个点而 PL-CS 的实验报告不仅填平了这个差距还反超了几个点。具体数字以原始论文的表格为准但量级上确实是“超过”而不是“逼近”。这里我想多说一句。很多读者一看到“反超”就激动但做研究的都知道这种结论依赖基准和对照方法的选择。有监督基线用的是经典的元学习算法没有动用更大规模的预训练模型PL-CS 用到的语义感知模块本身是一个预训练的双塔模型严格来说这也是一种“迁移”。所以这个“反超”应该被理解为在给定相同的骨干网络和相同的受限反馈条件下把经典的“无标注训练 少样本测试”方案打磨到位是可以达到甚至超过传统上依赖基类标注的方案。这个结论对低标注场景的意义远大于它和某个新发布的有监督大模型掰手腕的意义。3.2 消融实验拆掉任何一个组件都会明显掉点PL-CS 的消融实验设计得比较干净基本就是围绕两个组件的存在性打转。我个人读下来三个结论最有信息量。第一个把 Per-class Clustering 换成普通的随机伪类划分或者不加聚类损失的普通聚类掉点相当明显。这说明在无监督元学习里伪 episode 的质量确实比想象中更影响最终能力——机制层面的破坏会直接传导到元学习器学到的归纳偏置上。第二个去掉语义感知模块只保留视觉层面的置信度筛选前期表现还行迭代到中后期开始滑坡。这是典型的伪标签噪声累积现象模型越训越自信错标签也跟着越来越自信没有外部语义约束的话筛选机制会逐渐失效。这一点和我之前做半监督的经验完全吻合所以特别有共鸣。第三个两个组件都保留但解耦使用——比如先聚类训完特征再单独语义筛选伪标签——性能也会下降。PL-CS 的关键恰恰在于两个组件在同一套训练循环里协同迭代聚类友好特征让语义筛选更容易选出正确的样本语义筛选反过来剔除破坏簇结构的坏样本两个循环互相喂数据。从实验设计角度说PL-CS 做消融的方式不是只报告“去掉 X 掉多少”而是把“为什么掉”的逻辑讲清楚了。这种消融才真正有价值因为它告诉你的是机制而不是一堆孤立数字。4. 放到真实少样本场景里PL-CS 哪些设计最值得借论文看完了对我这种做实际项目的人来说接下来最现实的问题是这套东西除了能在学术榜单上刷数字能不能帮到真实场景里的少样本任务我自己的结论是能但别指望原封不动地端走要借的是思路不是代码。4.1 低标注场景下最值得抄作业的两个设计先说最值得借鉴的显然是“双通道伪标签筛选”这个设计。在真实的工业或科研项目中我们经常会遇到一种尴尬局面手头有一大批无标注数据类别是已知的但没人手去标注同时又希望模型能利用这批数据提升少样本能力。大部分人的第一反应是“先预训练一个自监督特征再说”这一步没错但往往止步于此直接把预训练特征丢给下游分类器了。PL-CS 的启发在于你可以把“特征预训练”升级成“伪任务元训练”中间只差一个伪标签筛选环节。实际操作上我建议可以这样落地方案用无标注数据训练一个特征抽取器做一次聚类拿到初始伪标签然后用一个现成的语义模型或者人工定义的类别描述向量做交叉校验——比如一个簇里的样本在视觉上聚在一起但语义描述分数很低那这个簇基本可以判定为跨类混合簇直接剔除或重新划分。反复做几轮伪标签的可靠度会有肉眼可见的提升下游少样本分类器的性能也随之改善。这个流程不需要完整复现 PL-CS 的元学习部分就能先吃到红利。第二个值得借鉴的是“以簇为单位构造支撑集”的思路。传统做法是从无标注数据里随机抽几个样本当支撑集但这很容易抽到类内的离群样本。按簇抽支撑集样本的代表性会大幅提升。在真实项目里如果你已经对无标注数据做过聚类千万别浪费聚类结果——直接从簇心附近抽样本构造出来的支撑集比随机抽样稳定得多。我在一个图像检索相关的项目里试过这招效果非常直观查询精度几乎没有因为采样抖动而波动。4.2 复现时我会重点盯的三个工程细节如果你真的打算在自己的代码库里复现 PL-CS我个人觉得有三个细节决定成败。第一个是聚类更新的节奏。聚类本身运算量大尤其是特征维度高、样本量大的时候每个 iteration 都跑 K-means 是不现实的。更合理的方式是维护一个特征 bank每隔固定步数对 bank 重新聚类更新簇中心中间 interval 内的训练只做簇中心固定的“拉近”优化。这个 interval 怎么定很讲究太短噪声大太长簇结构跟不上特征空间的变化。按我的经验从几百步到一千步之间起步调看验证集上的伪标签置信度分布是否稳定比盯着 accuracy 干瞪眼有效得多。第二个是温度参数 tau 的设定。Per-class Clustering 的软分配对温度极其敏感。温度太高所有样本的分配都变成均匀分布聚类损失退化温度太低分配几乎变成 one-hot训练初期会锁死错误的簇结构。建议的做法是从一个适中的 tau比如 0.1 附近开始在训练过程中做退火早期保持软一些后期逐步收紧。这个节奏和知识蒸馏里的温度退火是一个道理。第三个是语义模型的选择与冻结。语义感知模块如果用双塔模型那个双塔权重在聚类迭代过程中应该保持冻结。为什么如果语义模型也跟着无标注数据微调它和特征抽取器会逐渐耦合失去外部锚点的意义伪标签筛选就容易过拟合到当前特征空间的错误上。我在类似架构上踩过这个坑让语义分支参与微调后初期提升很快后期稳定性明显变差。让语义分支当“旁观者清”的角色反而效果最稳。如果想快速验证这套思路我建议直接搭一套简化版固定 ImageNet 预训练特征跑一次 K-means用一个文本语义模型做分数交叉构造伪 episode 微调原型网络。整体代码量不大但足以让你直观感受到“聚类友好特征”和“语义伪标签”各自的贡献有多大。5. 几个我反复琢磨的疑点也是后续值得长线探索的地方论文看完了不等于没有疑问。恰恰相反对一篇好论文疑问才代表你把它放进了自己的知识体系里。PL-CS 有几个地方我是保留意见的也想分享出来供大家参考。5.1 计算成本聚类循环到底有多贵虽然论文里不会省去复杂度的讨论但从工程角度看Per-class Clustering 和特征 bank 的组合对显存和算力都是有要求的。特征 bank 要存全量或大比例样本的特征聚类又要持续迭代更新这两个模块叠加在元学习训练之上整体训练成本要比普通的有监督元学习高出不少。如果你的项目资源有限我不建议直接复刻完整管线。更务实的做法是先用少量验证集定好伪标签置信度阈值和聚类更新周期在保证伪标签质量不雪崩的前提下尽可能拉长聚类 interval把额外算力压到最低。毕竟 PL-CS 的核心价值是范式上的不是“必须跑满复杂度”才算数。5.2 类数 K 和真实语义不匹配怎么办这是我认为 PL-CS 目前最值得讨论的边界条件。论文实验里用的基准数据集类别数大体是已知的或者可控的——比如 64 类基类聚类时 K 可以设为 64。但真实场景里无标注数据的真实类别数你根本不知道。K 设小了簇里混类K 设大了一个真实类被劈成两半两种错误都会污染伪 episode。我自己如果要在开放类别场景里用这套思路大概率会在 K 上做文章用一个自适应的过聚类策略先设较大的 K然后用语义感知模块把语义上相似的簇合并回来。这个方向在论文里没有展开但它恰恰是我觉得 PL-CS 后续最有晋升空间的地方。5.3 延伸方向跨模态、开放类集、持续元学习从 PL-CS 的设计出发可以看到几条自然的延伸线。比如语义感知模块和信息瓶颈的结合——目前语义描述主要靠文本侧预训练模型如果目标域是医疗影像、卫星图这类文本描述稀缺的垂直领域语义侧锚点从哪来就是个现实问题。再比如开放类集问题——测试时遇到训练里从没见过的类别聚类友好特征是否依然能保持可分的几何结构这直接决定方法能否在动态环境里站稳脚跟。还有持续少样本学习伪标签筛选机制在数据流式到达的场景下会不会漂移也值得专门研究。这些延伸方向恰好说明 PL-CS 解决的问题不是“刷高一个榜单”而是给无监督元学习提供了一个更扎实的地基。地基稳了上面盖什么样的应用场景都会顺手很多。我自己最近在做一个低标注代价的图像分类小项目数据杂乱、类别间语义重叠严重一开始完全没信心。PL-CS 这种“聚类保形 语义纠偏”的思路给了我一个挺实用的支点与其费劲去标那几百张图不如先让特征空间自己长出结构再让语义知识去校正结构的方向。按这个路子试下来少样本支撑集的构建质量确实上去了模型的稳定性也比之前硬扛自监督特征好了不少。说到底无监督元学习真正的价值不在于追平一张学术榜单而在于当你面对一堆谁都没标过的数据时心里多了一套路可以走。还不是捷径但至少是条路。