1. 多视图聚类做久了,你会发现一个被忽视的“第三维度”
做过多视图聚类的人应该都有这种感觉:学术界折腾了这么多年,大部分方法都在围绕两个关键词打转——一致性和互补性。
一致性说的是多个视图应该共享某些共同信息,互补性说的是每个视图各自带了别人没有的独特信息。早期的典型做法是把多视图特征拼接在一起跑k-means,或者用图拉普拉斯把几个视图的相似度矩阵揉成一个。后来深度学习起来了,大家开始训练编码器把多个视图映射到公共空间,再加各种对齐损失去约束。包括后来热议的COMPLETER,用互信息做上下界约束去捕捉一致性和互补性,本质上还是在“一致 + 互补”这个框架里做文章。
但我读TKDE-2023这篇《Self-Supervised Discriminative Feature Learning for Deep Multi-View Clustering》,标题里的SDMVC方案最戳我的一个点,是它把目光放到了第三个维度——判别性。
判别性是什么?简单说,就是学出来的特征不仅要“能代表”这个样本,还要“能区分”不同类别的样本。一致性视角关注的是视图间公共部分,互补性视角关注的是视图内私有部分,但判别性视角关注的是特征空间的类别可分性。这个维度在监督学习里已经是老生常谈(交叉熵损失本身就是判别式训练),但在多视图聚类里,因为没有标签,判别性特征一直没被好好对待。
那SDMVC具体是怎么做的?它设计了一个自监督对比学习模块,通过三个损失函数协同工作,让网络同时学到一致性、互补性和判别性。伪标签从亲和矩阵的特征分解中生成,不依赖任何数据增强,还用了反事实生成缺失视图来增强训练信号。整套方案在6个基准数据集上跑出了当时的SOTA结果,在许多指标上比对比方法高出好几个点。
这篇文章适合谁读?如果你在做深度聚类、多视图学习相关工作,或者对自监督对比学习在无标签场景下的应用感兴趣,这篇值得精读。我会从方法设计的动机、三个损失函数的细节、训练流程、实验表现和个人体会几个层面拆一下,尽量把实现层面能避的坑也一并说清。
2. SDMVC整体框架:三个支柱撑起来的判别性特征学习
先说宏观设计。SDMVC的全称翻译过来是“面向深度多视图聚类的自监督判别特征学习”,一个网络架构外加一个自监督学习模块贯穿整个过程。
2.1 深度多视图聚类网络
SDMVC的基础是一个双分支的深度聚类网络。每个视图对应一个深度编码器,把原始的视图特征映射到一个公共的嵌入空间。这里有一个值得注意的设计细节:两个视图的编码器是独立网络,不共享权重。
为什么要独立?传统的多视图方法很多都会做权重共享,希望借此约束两个视图映射到一致的空间。但SDMVC反其道而行之,刻意让两个网络参数独立。论文里的解释是:视图之间的分布差异往往是显著的,共享权重会限制每个视图提取自己特有信息的能力,反而损害特征表达。实验部分的消融也验证了这一点——换成共享权重之后,聚类精度普遍下降。
这一点可以在脑子里面类比成团队合作中“专人专事”的思路,不是所有信息都要大家一起共享,保留各自的领域特色,在后期通过目标任务对齐更有优势。
2.2 亲和矩阵特征分解生成伪标签
自监督信号从哪来?这是自监督方法的核心问题。SDMVC的答案是:从数据自身的亲和矩阵中来。
流程是这样的:先用当前模型提取所有样本的特征,构建一个亲和矩阵(affinity matrix),对这个亲和矩阵做特征分解,得到连续放松的聚类分配结果,再基于这个结果构建伪标签和伪标签分布。
这个做法在思路上跟谱聚类、kernel k-means的连续放松形式一脉相承,好处是它得到的不是一个硬聚类结果,而是一个概率分布,软信号比硬标签在训练早期更稳定。之后这个伪标签分布就作为自监督信号,指导学生网络更新。
2.3 自监督对比学习模块
核心模块包含三个损失项,协同构成完整的判别性特征学习:
自监督对比损失:利用伪标签做聚类层面的对比学习,拉近同一类样本的嵌入,推远不同类样本的嵌入。这是判别性的核心来源,伪标签替代了真标签,让对比信号上升到类别级别。SS Loss。
反事实损失:所谓反事实,就是构造一个视图缺失的样本,喂给另一个视图的编码器,然后通过一个重建模块把缺失视图补全。这个方案的出发点是,当某个视图的信息不全时,模型可以从另一个视图中学到这部分信息的表征,从而增强特征在信息不完整场景下的鲁棒性。这个方向之前是在多模态学习/因果推断里用得比较多。CF Loss。
跨视图对比损失:除了类别层面的对比,还需要把同一实例在不同视图下的表征拉近。这部分的思路并非SDMVC原创(对比学习在自监督视觉表征里已经很成熟了),但在多视图聚类中的应用方式有其特点:不做数据增强,而是直接用真实的多视图作为正样本对。换句话说,在多视图聚类里,视图本身就是天然的增强手段,不需要像图像自监督那样去裁剪、旋转、加噪声。这算是真实世界自带监督信号的一个典型利用了。CV Loss。
三个损失分别对应“类别可分”、“信息鲁棒”、“实例对齐”三个目标,加总成总损失函数,联合优化整个模型,拿到判别性强的嵌入表示,最后对嵌入做k-means完成聚类。
到这里,SDMVC的整体轮廓已经很清楚:一套自监督学习机制,让网络在完全没有标签和外部数据的前提下,借助视图关系与伪标签信号训练出类别可分的特征。
3. 损失函数逐项拆解:每一项都在解决什么问题
上面提到了三部分损失,单说概念大家可能感受不到妙处。下面我们从“它到底在优化什么”的角度逐项拆开来看。
3.1 自监督对比损失:把聚类信息注入特征学习
很多深度聚类方法的做法是分两阶段:先跑一个聚类算法得到伪标签,再拿伪标签训练特征提取器。问题在于,伪标签的质量跟不上训练过程,到后期特征更新了,伪标签还是旧的,形成一个滞后效应。
SDMVC的自监督对比损失不是简单用固定伪标签做分类训练,而是动态地利用当前模型生成的亲和矩阵去引导特征学习。公式层面的逻辑是:对每个样本i,根据伪标签分布选中它的正样本集和负样本集,然后构造一个对比损失,目标是让样本i的嵌入靠近其正样本类中心,远离负样本类中心。
值得注意的是它在自监督损失中采用了软标签方案,而不是硬标签。我的理解是,软标签在训练初期的容错能力更强,因为早期的伪标签里必然包含大量噪声,如果直接当硬标签用,错误累积问题会非常严重。用分布做软约束,让网络更有余量去纠错。
这一步防坑要点:伪标签不是用来做交叉熵分类的,而是用来构造对比样本对的。这两个方法的本质差别在于,交叉熵分类要求特征能够判别到具体类别,而对比学习只要求特征在相对意义下类内近类间远即可,鲁棒性远超前者。
3.2 反事实生成损失:信息缺失场景下的自监督增强
反事实损失这部分,如果不看原论文的公式,可能会对这个名字产生迷惑。在多视图聚类里,“反事实”指的是一个不存在的输入——比如某个视图被完全丢弃或遮挡的样本。
实现思路是:给定一个样本的两个视图,把其中一个视图的特征抹掉,用剩余的视图特征去预测或重构缺失视图的信息。若两个视图包含互补信息,那么缺失视图的内容在很大程度上可以从保留视图推断出来。这个推断过程,相当于自动构造了大量训练样本——单视图甚至残缺视图也能作为输入参与学习。
这个设计跟另一类方法COMPLETER的思路在目标上是一致的,都想挖掘视图间的互补信息,但机制不同:COMPLETER用的是互信息上下界,SDMVC用的是条件生成或基于重建的思路。相比起来,SDMVC的机制更直接,性质上更接近encoder-decoder框架的变种,训练起来也相对稳定。
这块对实际工程有个很好的启发:在做跨模态任务时,不要只利用那些完整对齐的数据,大量的“单侧信息”也是监督信号工厂。哪怕某个模态缺失,只要另一模态足够丰富,就能通过反事实训练把这部分样本利用起来。这在数据稀缺的真实场景下价值很大。
3.3 跨视图对比损失:在多视图场景下“数据增强”是标配
第三项为跨视图对比损失,方向为实例级别的判别性。前面第一项做的是类别级别的对比(通过伪标签划分正负样本集),第三项则是经典的对比学习:把同一实例在不同视图的表示当作正样本对,而不同实例的表示互作负样本。
许多做单视图自监督的人可能会问:图像那边常用的做法是人为构造正样本对,比如裁剪、旋转、色偏,为什么多视图这边要专门用不同视图作为正对?原因有两个:
其一,真实多视图数据是自带的、天然的视图变化,比人为增强更接近真实分布。其二,多视图对比让两个编码器在迭代中协同进化——每个视图的特征表达都会受到另一视图的约束——这比单靠内部伪标签驱动要稳定得多。
我在复现类似结构时的一个体会是,跨视图对比这个损失对负样本的选择策略非常敏感,如果采到的负样本大部分来自不同视图空间的错位比较,网络容易退化成一个退化的输出。为此SDMVC中用到的归一化和对应的采样策略是很关键的设计,去掉之后整体精度会跌掉不少。
4. 训练策略与实现细节:这是能复现结果的关键
论文里最容易被忽略的反而是训练策略部分。方法设计得好不好,还要看训练稳不稳。SDMVC在这块的安排,对复现结果影响很大。
4.1 两阶段训练:先预热,再联合优化
SDMVC的训练分为两个阶段。
第一阶段是预热阶段,只优化跨视图对比损失和反事实生成损失,先不加入伪标签相关的自监督对比损失。原因很简单:早期特征还没成形,如果就用它去构建亲和矩阵、生成伪标签,大概率是噪声标签,会给整个训练过程带偏。经过一个稳定的预热期之后,特征空间有了基本判别结构,伪标签的质量才值得信任。
第二阶段再把自监督对比损失加进来,三个损失联合优化。
这个“先易后难”的思路其实是很多自监督方法的标准操作——先让网络学会基本的表征和视图对应关系,再引入更高级的语义任务。我在自己的项目里也试过直接端到端训练,效果明显不稳定,抖动很大,后来老老实实切成两阶段,收敛就顺了。这里有一个关键细节:切换阶段的时机不是拍脑袋定的,论文基于预热之后聚类性能收敛的实验,验证了切换的合理性。不同数据集上升的最优的切换点可能略有不同,建议你用验证集调一调。
4.2 样本分配与动态亲和矩阵
样本分配比例是SDMVC中反复被强调的一个参数。在构建伪标签做对比时,不是所有样本都被利用,而是按照某个比例挑选置信度高的样本参与损失计算。大体思路如下:聚类完成后会得到每个样本簇分配的置信度信息,置信度高的样本在对比学习里权重更大,低置信度的样本参与度压低。
这种做法相当于在大规模数据中做了一个隐式的难样本挖掘:用容易判别的样本稳住训练方向,对模糊样本保持谨慎。反过来,如果所有样本一视同仁地参与,噪声样本带来的梯度更新会让网络朝错误方向偏移,尤其是在训练的中后期。
亲和矩阵这边也值得多说一句。SDMVC不是一开始锁定一个亲和矩阵然后用到最后,而是每个epoch动态更新。特征在变,样本间关系也在变,亲和矩阵必须跟着特征走,伪标签才有意义。实现上的技巧是:为了效率,更新亲和矩阵不是全量重新计算,而是在小批次上做增量式更新。
4.3 转移学习与测试阶段
论文里还有一个在复现时容易被忽略的点:训练完成后,直接把训练集上训练好的网络参数转移到测试集上使用,不做微调。
多视图聚类跟普通聚类不太一样,通常是在同一个数据集内部做“训练即测试”的转导式学习。但SDMVC为了保证评估的公平性,明确说明了它的参数是先从训练子集上学到的,再直接应用到测试子集上。
这个设计值得留意。它说明学到的判别性特征具备一定的泛化能力,不是只在训练数据上过拟合出好的聚类结果。这一点在实践中有参考价值:如果我们的目标是做一个通用的多视图特征提取器,用它提取训练过程中从未见过的样本特征,SDMVC的训练范式比端到端的聚类方法更合适。
5. 实验与消融:读实验不只是看数字,更要看设计
论文的实验部分信息密度比较高。我没有能力也无必要复现所有对比,但从方法和结论层面拆解,有几个值得说道的地方。
5.1 六个基准数据集上的表现
SDMVC在多个公开的多视图基准上做了评估,维度覆盖图像、文本、场景识别等类别。数据集的样本数从几百到几千不等,视图数量从2到5不等,类别数从几个到几十个不等。
在大多数数据集上,SDMVC的ACC、NMI和ARI指标都取得了当时的最优结果,而且不是小幅度领先,往往是几个百分点的明显优势。特别是一些样本量偏少的数据集上,原有方法下降明显,SDMVC依然能保持较高的聚类精度,这应该归功于反事实生成损失补充的训练信号——让网络在数据不足时仍有足够的监督信号可用。
附一个要点:不同指标之间的提升幅度并不完全一致。比如在某些数据集上NMI提升显著,ACC提升相对平缓;在另一些数据集上则相反。这其实反映了方法对不同数据分布的适应性差异,样本类别相对均衡的数据上更容易同时提升各项指标。
5.2 消融实验的关键结论
消融实验里的几个发现很有参考价值:
第一,去掉反事实损失,性能下降明显。尤其是在数据量较少或者视图信息互补性较强的数据集上,没有反事实生成,模型从单一视图中提取有效信息的能力会变弱,这直接验证了互补性信息挖掘的价值。
第二,把自监督对比损失替换成简单的伪标签分类损失,性能不升反降。这个消融非常有意思,直接证明了SDMVC选择对比学习而不是分类学习不是随意的——对比学习的相对判别性比分类学习的绝对判别性更适合无标签场景。
第三,共享编码器权重的方案在大多数数据集上劣于独立编码器。这个我在前文已经提过,要多说一句:共享权重不是不好,它在视图分布差异较小的时候可能带来参数效率的好处,但在视图差异大的场景下,独立编码器提供的自由度确实更宝贵。
5.3 与相关方法的边界辨析
读这类论文最大的挑战是搞清楚它和已有方法之间的区别到底在哪。SDMVC跟几个知名方法的关系值得梳理一下:
跟DSC系列(深度子空间聚类)比:DSC的核心在于子空间自表达,无论怎么加深度,还是在做“用自表达系数构建亲和矩阵”这件事。SDMVC不这么做,它的亲和矩阵直接基于特征内积或相似度构建,不做子空间约束,学习范式完全不同。
跟COMPLETER比:两者都在挖掘一致性和互补性,但COMPLETER用互信息来刻画,SDMVC用反事实生成来暗含互补性信息,前者对估计器的要求较高,后者实现起来更直接。
跟对比聚类(如SCAN)比:SCAN的对比信号来自数据增强,SDMVC的对比信号来自伪标签和真实多视图。它们虽然都叫对比学习,监督来源不同意味着适用场景完全不同。
这些边界大体分清了之后,你就能理解为什么这个标题里“Self-Supervised”是核心定语——它不需要外部标注、不需要邻域先验、不需要预训练分类器,仅靠自身数据内部的亲和结构完成监督信号的构建,这在多视图聚类中具有明显优势。
6. 局限性与可能的改进方向
没有方法是完美的,SDMVC也有一些明确的短板。
第一,双网络带来的参数开销。两个编码器独立意味着两倍的特征提取参数,在大规模数据上的显存和训练时间成本都不低。虽然效果更好,但效率确实值得优化,比如在训练后期做网络剪枝或蒸馏。
第二,伪标签质量问题依然存在。亲和矩阵虽然动态更新,但它在类别极度不均衡的数据上容易偏向多数类。如果某个簇的样本数量远大于其他簇,伪标签的置信度分布会倾斜,对比学习的梯度也会跟着倾斜。这一问题目前没有在框架层面做专门的平衡机制。
第三,视图数量大于2时,方法需要进行扩展。原文中SDMVC的跨视图对比和反事实生成主要围绕两个视图展开,虽然理论上可以扩展到更多视图,比如逐对视图做跨视图对比,但计算成本会随视图数平方增长。对于天生就是多模态(比如视频里的RGB、光流、音频)的场景,效率瓶颈会比较突出。
基于这些局限性,后续可以在三个方向上做探索:一是引入自适应邻居图或局部结构保持来提升伪标签对局部结构的刻画能力;二是考虑在框架中用解耦表示来分开编码共享信息和视图特有信息,让一致性特征和互补性特征各司其职;三是探索对比学习在无公共语义空间的前提下如何直接对比异构特征,这是一个更有挑战性的方向。
7. 个人实操层面的一些体会
总结几个我读这篇论文以及在工作里复现类似思路时攒下来的经验,供参考。
第一,伪标签动态更新时,频率和幅度要控制。有人可能每几个iteration就重新计算一次亲和矩阵,结果特征还没学好,标签反而一直在变,训练像在追一个移动靶,非常不稳定。SDMVC的podcast训练虽然没有在字面上强调这一点,但基于前面的分析可以看到合理的动态标签策略,本质上是设计“低延误”的伪标签更新方案。
第二,样本分配比例这个参数值得在数据集上单独调。论文给出的最优值未必适配你的数据分布,特别是类别数差异大的场景。我习惯把它做成一个scheduler,训练早期用较高的使用率,让模型尽快见足够多的正负样本,后期降低使用率,聚焦高置信度样本。
第三,对比学习实现的向量归一化要特别小心。很多复现翻车是因为在构造对比损失时对特征归一化的位置搞错了,样本对之间的相似度应该是余弦相似度,而不是点积。如果忘记做l2归一化,在大数值特征下损失会变得极其不稳定。
第四,也是我想重点强调的:多视图数据本身就是一种天然的数据增强库。很多时候我们为单视图数据设计繁复的增强策略,却忽略了真实场景中的多视图、多模态数据已经提供了丰富的变化信息。哪怕不做聚类任务,在一般的自监督预训练中,跨视图对比学习都能显著优于单个视图的强增强版本——这已经被后来的多个工作进一步验证。
SDMVC这篇论文给我的最大收获,不是某个损失函数的精妙设计,而是一种视角转换:与其在复杂的一致性约束上不断加码,不如让特征学习本身具备更强的判别能力,聚类下游任务自然受益。这个思路看起来简单,实际做起来需要整套自监督机制的支撑,读了之后对多视图聚类的未来方向还是很有启发。
说实话,我现在做项目的时候,遇到特征质量问题,第一个想到的往往就是SDMVC那套“先预热再联合优化”的范式,以及软标签在噪声场景下的容错能力。这些经验放到真实业务里,不只是聚类任务能用,检索、匹配、异常检测都有可以借力打力的地方。如果你正在折腾多视图聚类或者自监督表征学习,我强烈建议你把原论文找出来细读一遍,最好动手复现一下损失函数——你会有很多意想不到的收获。