自监督判别特征学习:深度多视图聚类SDMVC框架解析 做聚类的人这几年应该都有同感传统的 k-means 配合手工特征在面对图像、文本、多模态这类高维原始数据时越来越力不从心。问题倒不复杂——特征本身不够好聚类结果的天花板就摆在那里。所以“深度多视图聚类”成了热门方向大家的思路也高度一致先用神经网络从原始数据里学特征再在特征空间里做聚类。而《Self-Supervised Discriminative Feature Learning for Deep Multi-View Clustering》简称 SDMVC这篇 2023 年的论文提出的方案是把“自监督”“判别特征”“深度多视图聚类”这三件事拧成一股绳用聚类结果自己生成监督信号再让网络不断学出类内紧凑、类间可分的判别特征从而把多视图数据的分群质量整体抬上去。这篇文章我想从问题本质、框架设计、训练流程、复现避坑等角度把它完整拆开聊聊适合正在做聚类、多模态表示学习或者准备在业务里尝试无监督分群的读者。1. 先厘清问题深度多视图聚类到底要解决什么难在哪1.1 多视图数据的现实来源同一个对象的多种描述“多视图”这个词在论文里听着抽象但在实际业务里非常朴素。一个商品页面同时有主图、详情文字和评论一段监控视频同时包含画面、音频和时间戳一套工业设备同时采集温度、振动和电流信号——这些就是同一个对象的不同视图。形式化地说假设有 n 个样本每个样本有 V 组特征第 v 组特征来自一种采集方式或一个语义角度视图之间是互补关系而不是简单重复。单视图聚类只能看到对象的一个侧面比如只看商品图会忽略评论里反映的质量问题只看电流信号会漏掉振动里蕴含的机械磨损信息。多视图聚类想做的事情就是把这些侧面的信息整合起来在无标签的前提下找到一致的类别划分。这里的关键词是“一致”——不同视图对同一个样本的类别判断必须对齐否则聚类结果就会四分五裂不同视图各自为政。1.2 传统方法的三座大山手工特征、亲和矩阵、线性融合早年的多视图聚类主流是谱聚类和子空间聚类思路不能说错但有三座大山。第一座是特征工程需要为每个视图专门设计特征图像要提颜色直方图、纹理特征文本要做词频统计领域知识要求高而且特征设计的好坏直接决定聚类上限。第二座是亲和矩阵。谱聚类类方法通常要构造 n×n 的相似度矩阵样本量到几万之后内存和计算量就已经非常吃力几十万上百万样本的场景基本无从下手。第三座是融合方式很多经典方法假设多个视图是线性可加的或者最多做核方法的非线性映射对视图之间复杂的非线性交互建模能力很弱。这三座大山结合起来导致传统方法很难直接吃原始数据扩展性也被锁死。1.3 从深度表示到自监督判别这一步为什么必须走深度方法把每个视图丢进神经网络映射到一个公共表示空间算是绕过了手工特征和亲和矩阵这两个问题。但很快大家发现一个新问题“有个表示”不等于“适合聚类”。如果学出来的特征空间里类别之间还互相纠缠边界模糊不清后面接任何聚类算法都白搭。我见过不少失败的实践就是拿一个预训练好的编码器提取特征然后直接跑聚类。结果往往很差因为通用预训练模型优化的是重建或者分类目标不是聚类目标学出来的特征没有针对“分群”这件事做专门的适配。SDMVC 这类工作的价值就在于明确把“判别性”写到学习目标里不仅要学表示还要学一种簇内紧凑、簇间分离的表示。这件事在无监督环境下并不容易因为没有真实标签告诉网络哪些样本应该被拉近哪些应该被推开。2. SDMVC 三个关键词的技术拆解自监督、判别、特征学习如何咬合2.1 自监督信号从哪里来让聚类结果反哺特征自监督在这里的核心手段是“聚类即标注”。流程并不复杂先用当前网络提取特征跑一遍聚类给每个样本分配一个簇 ID把这个簇 ID 当成伪标签再用伪标签监督编码器继续更新。这形成了一个有趣的反身关系——聚类结果依赖特征特征又依赖聚类结果来学习。伪标签当然是有噪声的尤其是在训练早期。缓解噪声的手段也是常规操作不要用硬标签而是用软分配对目标分布做锐化处理让置信度高的样本贡献更大的梯度定期重新聚类刷新伪标签避免错误标注被固化。这些手段在深度聚类领域已经被反复验证SDMVC 的提法很聪明的地方在于它把“自监督”和“判别”放在同一个框架里说而不是当成两个独立的 trick。2.2 判别特征到底指什么类内聚集类间分离判别性不是一个虚的概念它可以直接用两个尺度来衡量同类样本在特征空间的平均距离应该足够小不同类簇中心之间的最小距离应该足够大。换句话说好的特征空间里每个类别应该像一颗实心球球与球之间界限清楚不能你中有我。要让特征具备这种结构常见做法是在损失函数里做文章。比如用交叉熵型损失让样本特征向它被分配的簇中心靠拢或者用对比型损失把样本特征与其所属簇心的相似度拉高与其他簇心的相似度压低。训练完成之后判别特征还有一个额外的好处它对视图里的噪声信息天然有过滤作用因为与聚类无关的信息会被网络逐步丢弃。2.3 三者的闭环特征越好标签越干净把“自监督”“判别”“特征学习”放在一起看本质上是一个自举回路。初始特征是粗糙的聚类结果也粗糙伪标签噪声大但网络可以从粗糙的伪标签中先学出一个大概的判别方向让特征稍微变好一点特征变好之后下一次聚类就更准伪标签噪声更低于是再学一轮特征又更好。这个回路如果控制得当会像滚雪球一样越滚越干净。但它的危险也在于此如果早期误差太大反馈回路会放大错误导致模型收敛到局部最优甚至平凡解。所以整个框架的稳定性很大程度上取决于训练节奏、伪标签更新频率和目标分布锐化程度这些细节。论文把这些细节组合成了一套完整的训练方案这也是它比“换个网络结构”更有借鉴意义的地方。3. 框架设计与训练流程从多视图编码到伪标签反传3.1 视图编码与注意力融合的取舍框架的第一层是视图编码器。每个视图由一个独立的编码器处理输出固定维度的向量常见设置是 256 或 512 维。视图之间不共享参数因为不同视图的原始分布差异太大强行共享会让网络陷入矛盾。得到各视图的特征之后需要一个融合层把它们整合起来。这里 SDMVC 走的是注意力加权路线网络根据每个视图对当前样本的置信度自动分配权重然后加权求和得到全局表示。为什么不直接把视图特征拼接起来因为拼接会带来两个问题一是维度膨胀训练难度上升二是某个高维视图容易淹没低维视图的信息。注意力融合让网络学会动态加权更重要的是它天然能够容忍视图缺失的情况——某个视图不可用时对应权重可以被压低剩下的可见视图仍然能够支撑表示学习。3.2 两大主流损失函数交叉熵型与对比型有了全局表示之后下一步是定义一个可优化的聚类目标。目前的主流方案有两类SDMVC 框架下这两类都可以套用。先说交叉熵型把全局特征和 K 个可学习的簇中心做点积经过 softmax 得到样本属于每个簇的概率 p_ik再构造一个锐化后的目标分布 q_ik——典型做法是 p_ik 的平方再按簇频率归一化让高置信度的分配权重更大——最后最小化两个分布的 KL 散度。对比型的做法则更贴近近年表示学习的风格把样本特征视为锚点它被分配的簇中心视为正样本其他簇中心视为负样本使用带温度系数的对比损失让锚点与正簇心的相似度指数级别地高于负簇心。温度系数 τ 控制惩罚的力度τ 越小模型对困难负样本越敏感。无论哪种损失核心目的一致把“判别”直接写进目标函数而不是先聚类再做后处理。3.3 训练节奏预训练、联合优化、聚类刷新训练流程大体分为三个阶段。第一阶段是预训练只优化重构损失让编码器具备基本的特征提取能力得到一个相对稳定的初始表示空间。第二阶段是联合优化重构损失和聚类损失一起回传网络在学习判别特征的同时保持对原始信息的记忆。第三阶段是周期性聚类刷新每训练若干个 epoch就对全体特征重新跑一次聚类更新伪标签然后带着新标签继续训练。训练节奏直接决定成败。我见过有人跳过预训练直接上聚类损失结果特征空间完全崩溃伪标签全是噪声几个 epoch 之后模型所有样本都分到同一个簇。也有人的伪标签刷新频率太高每两个 epoch 就重聚类一次导致模型在几个聚类结果之间反复横跳损失曲线像锯齿一样。论文方案里对这套节奏的把握恰恰是最值得新手学习的地方。4. 容易被忽略的细节视图缺失、聚类数假设与冷启动4.1 视图缺失场景下的特征补齐与加权真实场景里视图不可能总是完整的。设备掉线、传感器故障、用户不上传某类数据都会导致部分样本的某些视图缺失。如果直接把缺失视图的位置填零会让编码器面对大量无意义的零输入噪声被放大。比较常规的思路有两种一种是用可见视图去预测缺失视图的特征但这等于额外训练一个生成模型复杂度高另一种更轻量直接让缺失视图的特征置为空白依靠注意力机制把权重分配给可见视图。后一种做法对缺失比例不高的场景非常管用也符合多视图聚类的本质——只要可见视图的信息足够完成判别缺失视图就不应该成为负担。SDMVC 框架下可以用这个思路做缺失隐式处理训练时引入随机遮蔽增强让网络提前适应不完整输入测试时遇到真实缺失也能稳住。4.2 聚类数 K 的隐式假设几乎所有深度聚类论文都假设聚类数 K 是已知的SDMVC 也不例外。这在公开基准上有道理因为评测数据集天然知道类别数。但在业务里K 往往是未知的这就需要先用小批量样本做一个初步探索跑 K 从 2 到 20 的聚类观察损失下降的拐点、轮廓系数或聚类稳定性的变化定一个合理的 K 再训练模型。K 定得不合理会带来很直接的问题K 太大簇中心互相竞争同一个区域的样本判别损失很难收敛K 太小不同类别被强制揉进一个簇特征空间被压成一个稠密的混合体。我给的建议是先粗定再细调而不是指望模型自己发现合适的簇数。4.3 冷启动为什么不能一上来就聚类冷启动是很多复现失败的根本原因。神经网络权重初始化之后是随机的提取出来的特征基本不具备语义信息此时直接做聚类得到的伪标签约等于随机噪声。用噪声标签训练网络网络只会学到把随机性固化下来后面再想纠正就难了。所以预训练阶段不是可选项而是必选项。至少用重构损失把编码器训练到收敛让特征空间具备一定的流形结构再开始加聚类损失。如果数据量足够也可以先用对比学习做一轮表征预训练效果往往更好。冷启动问题处理得好后面整个训练过程会顺很多。5. 复现中的参数与避坑笔记一份可抄的实验配置5.1 数据集、视图构造与评价指标复现这类工作首选的基准一般是图像类数据手写数字、服饰、人脸这类带明确类别标签的公开数据集。多视图怎么构造简单的方式是图像切块把一张图按区域切成几块不同块作为不同视图也可以是原始图像和它的傅里叶幅度谱构成两个视图文本数据则可以把词袋向量和主题模型向量作为两个视图。评价指标用四个就够下表是它们的核心区别。指标全称关注点取值范围ACC聚类准确率预测簇与真实标签的最佳匹配[0,1]越高越好NMI归一化互信息聚类结果与真实标签的互信息占比[0,1]越高越好ARI调整兰德指数样本对划分的一致性[-1,1]越高越好Purity纯度每个簇中多数类别样本占比[0,1]越高越好注意 ACC 在类别不平衡时会有虚高NMI 对簇数多的结果更友好建议四个指标一起报告别只看一个。5.2 关键超参数温度、批大小、损失权重下面这组配置是我在类似任务上反复试过比较稳的起点不是论文原文参数但完全可以用作第一次复现的基线。超参数推荐值说明嵌入维度256 或 512太大容易过拟合太小判别性不足温度系数 τ0.05 到 0.1越小对负样本惩罚越强但太小会让训练不稳定批量大小128 到 256受限于显存但不宜小于 64聚类损失权重0.1 到 1.0与重构损失权重配合调整重构损失权重0.1 到 1.0重构太弱特征容易坍塌伪标签刷新周期5 到 10 epoch太频繁训练震荡太慢噪声固化优化器Adam学习率 1e-3 到 1e-4配合余弦退火更稳聚类损失和重构损失的权重是联动关系。聚类损失权重过大网络会走捷径把所有样本映射到同一个点来降低聚类损失重构损失权重过大特征会偏向重建细节判别性不足。我一般先在预训练阶段把重构训练收敛再以 0.1 的聚类权重起步逐步上调到 1.0观察验证集上的 NMI 变化。5.3 五个高频问题与排查方向复现这类框架问题通常出在训练动态上而不是代码 bug。下面是我整理的高频问题排查表。现象可能原因排查方向所有样本被分到同一个簇聚类损失主导特征坍塌检查损失权重提高重构损失检查目标分布锐化损失曲线震荡严重伪标签刷新太频繁把刷新周期从 2 epoch 调到 10 epochACC 长期不涨冷启动失败伪标签全是噪声放弃当前模型重新预训练 20 个 epoch 再联合训练某个视图权重恒为 0该视图信息量低网络学会忽略查看单个视图单独聚类的表现考虑增强该视图特征训练到后半程性能骤降温度系数太低梯度爆炸调高温度或给聚类损失加梯度裁剪这五个问题里特征坍塌是最隐蔽的。表面上看损失在下降ACC 却一动不动打开特征可视化一看全部点挤在一团。遇到这种情况别先去调网络结构先把损失权重和锐化系数调回保守区间往往是更快的解决路径。6. 把 SDMVC 迁移到自己的数据上适用判断与扩展方向6.1 先回答三个问题再动手迁移到自己的业务数据之前先回答三个问题。第一你的数据真的有多个视图吗如果只有单一视图可以考虑切块、加变换、拆分语义维度来构造弱多视图但效果取决于构造方式是否真的带来互补信息。第二聚类数能不能估完全没有业务先验的话需要先做一轮预实验确定 K。第三数据量够不够深度方法通常需要几千个样本起步如果只有几百条数据不如老老实实用传统方法。这三个问题有一个不达标都不建议直接套用 SDMVC 的完整框架。6.2 从图像文本扩展到表格与多模态业务数据SDMVC 的编码器并不限定必须是卷积网络。结构化表格数据可以每个视图用一层多层感知机先做标准化和缺失值填充再把不同特征组视为不同视图。我在金融和营销场景见过这类应用用户的基本属性、消费行为、浏览记录各成一视图目标是做无监督客群划分。这类场景下注意力融合的价值非常明显因为不同用户的视图完整度差异很大有的用户没有行为记录注意力机制会自动压低缺失视图的权重。多模态业务数据也同理。视频内容可以拆成帧特征、音频特征、文本字幕三个视图文本内容可以用预训练模型提取句向量。唯一需要提醒的是不同模态的特征尺度差异可能非常大务必在融合之前对每个视图的特征做归一化否则注意力权重会被大尺度的视图绑架。6.3 值得一试的改进鲁棒伪标签、更强编码器与缺失生成如果已经跑通了基线后面可以往三个方向改进。第一是伪标签质量可以用置信学习或者最优传输替代简单聚类让伪标签更干净对噪声更鲁棒。第二是编码器升级把骨干网络从卷积结构换成 Transformer 类结构对视图内部的长程依赖建模更强但要注意训练数据量不够时容易过拟合。第三是缺失视图生成当缺失比例超过 30%简单置零加注意力的方案开始吃力此时可以考虑用生成式模型从可见视图重建缺失视图让融合层重新看到完整信息。我在实际项目中最大的体会是自监督聚类的很多失败不是结构问题而是节奏问题。把聚类损失和重构损失画在同一张图里如果重构损失已经收敛聚类损失还在剧烈震荡基本可以先怀疑伪标签刷新频率太高。这个调参经验往往比换一个更强的骨干网络更立竿见影。希望这篇拆解能帮你把 SDMVC 的思路真正落到自己的数据上。