想象一间热闹的水果教室。班主任拿来一筐苹果、香蕉、橙子,但故意不贴任何名字。小明和小红是同桌,他们都不认识这些水果,却要自学成才。唯一的办法,是两人分别从不同角度观察同一个水果,然后各自凭感觉把它的“特征小抄”放进教室后面的水果相册——相册里有很多空文件夹,每个代表一种“想象中的标准水果”。放完还不算完,班主任要求他们互相猜对方把照片放进了哪个文件夹。猜来猜去,文件夹的分类就越来越合理。更妙的是,班主任还立了一条规矩:每个文件夹收的照片数量必须差不多,不许大家偷懒全塞进同一个文件夹。这套“看照片、归档、互猜、雨露均沾”的流程,就是 SwAV(Swapping Assignments between Views)的核心思想——它是对比学习家族里一位不走寻常路的成员,不需要举着“负样本”满世界找不同,只靠聚类分配就能学会好特征。

岗位关联

掌握 SwAV 聚类分配,你就拿到了自监督学习中“免负样本”路线的万能钥匙——无论做图像检索、医学影像预训练,还是大规模多模态表征,都能显著降低对标注和超大 batch 的依赖,是 AI 工程师面试和落地中的硬通货。

目录
  1. 可视化演示
  2. 聚类分配:免负样本的直觉
  3. 交换预测:互猜归档码
  4. 均衡算法:Sinkhorn的雨露均沾
  5. 特征编码器:在线提取与原型更新
  6. 多视角训练:Multi-Crop的全局视野
  7. 训练策略:损失、温度与批大小
  8. 评估应用:从预训练到落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

聚类分配:免负样本的直觉

水果教室里,小明把苹果照片归档到“红彤彤圆滚滚”的文件夹,小红也这么干。他们没有去把所有不认识的陌生水果都找出来对比——这正是 SwAV 与传统对比学习的第一个分岔口。传统对比学习像“认人游戏”:想认识小明,得同时记住班里几十个其他同学当反例,batch 越大越费内存。而 SwAV 的思路是“就近归档”:只要找到一个最像的文件夹就行,不需要知道文件夹之外还有什么。

这个“文件夹”在数学里叫原型向量(prototype),它本质上是可学习的簇中心。一张图片的特征像一位同学的小抄,谁和小抄最像,就把照片放进谁的文件夹。SwAV 用 softmax 把“像不像”变成概率,形成软分配——不是一刀切说“这就是苹果”,而是“90% 像苹果、6% 像梨、4% 像橙子”。软分配保留了不确定性,让模型在早期训练时不会莽撞犯错。

归档动作完成后,班主任又加了一条硬性纪律:每个文件夹收的照片数必须基本均衡。这条“雨露均沾”规则由 Sinkhorn-Knopp 算法实现,它把刚算出的软分配再打磨一遍,防止所有照片都涌向同一个最像的文件夹——那样分类就失去了意义。聚类分配因此成了 SwAV 摆脱负样本、又不会崩塌的定海神针。

qik=exp⁡(zi⊤pk/τ)∑k′=1Kexp⁡(zi⊤pk′/τ)\displaystyle q_{ik} = \frac{\exp(z_i^{\top} p_k / \tau)}{\sum_{k'=1}^{K} \exp(z_i^{\top} p_{k'} / \tau)}
这个公式计算第 i 张图片的特征 z 与第 k 个文件夹原型 p 的相似度,再除以温度 τ 并用 softmax 变成“分到每个文件夹的概率”。温度越低,概率越尖锐,越接近硬分配。
  1. 相似度打分把图片特征 \(z_i\) 和原型向量 \(p_k\) 做内积,得到了“这张图有多像第 k 个文件夹”。
    simik=zi⊤pk\displaystyle \text{sim}_{ik} = z_i^{\top} p_k
  2. 温度调节除以温度系数 \(\tau\),控制打分分布的软硬程度,\(\tau\) 越小分布越尖锐。
    zi⊤pkτ\displaystyle \frac{z_i^{\top} p_k}{\tau}
  3. softmax 归一化对 K 个文件夹的分数取指数并求和,把分数转化为相加为 1 的分配概率。
    qik=exp⁡(simik)∑k′exp⁡(simik′)\displaystyle q_{ik} = \frac{\exp(\text{sim}_{ik})}{\sum_{k'} \exp(\text{sim}_{ik'})}

交换预测:互猜归档码

小明看完照片,把它放进了 2 号文件夹;小红看完同一张照片的另一角度,放进了 5 号文件夹。班主任这时说:“现在,小明你来猜小红归档到几号,小红你来猜小明归档到几号。” 两个人交换的不是照片,而是各自的归档结果——这个动作就是 SwAV 名字里的 Swapping Assignments。

为什么互猜能让学习发生?因为两张照片来自同一个水果,如果两人真的理解了水果的本质,那么小明看了小红的归档码,就应该能从小红的笔记里推出她进了哪个文件夹;反之亦然。如果猜错了,说明至少有一方的“水果相册”还没建好,模型就更新参数,让下一次互猜更准。整个过程不需要任何标注,只需要“同一水果的两个视角应该互相印证”这个朴素的假设。

“互猜”机制妙在对称性:两个视图地位平等,谁都不是绝对的老师,谁都在学。这就像同桌互批作业,批改别人的过程其实也在巩固自己的知识。SwAV 把这种对称的互教互学做成了损失函数,让特征表示在一次次交换预测中越来越稳定、越来越有区分度。

Lswapped=−1N∑i=1N(qi(1)log⁡p(zi(2))+qi(2)log⁡p(zi(1)))\displaystyle \mathcal{L}_{\text{swapped}} = -\frac{1}{N}\sum_{i=1}^{N}\left( q_i^{(1)} \log p(z_i^{(2)}) + q_i^{(2)} \log p(z_i^{(1)}) \right)
交换预测损失把“小明用自己特征预测小红的归档码”和“小红用自己特征预测小明的归档码”两个方向的交叉熵加起来。谁的归档码是标准答案,谁的特征就是考生。
  1. 两个视图的分配视图 1 得到软分配 \(q^{(1)}\),视图 2 得到软分配 \(q^{(2)}\),作为彼此的标准答案。
    q(1)=Sinkhorn(z(1),P),q(2)=Sinkhorn(z(2),P)\displaystyle q^{(1)} = \text{Sinkhorn}(z^{(1)}, P), \quad q^{(2)} = \text{Sinkhorn}(z^{(2)}, P)
  2. 特征预测概率把视图 2 的特征与所有原型算 softmax,得到“小红视角下每个文件夹的概率”。
    p(zi(2))=exp⁡(zi(2)⊤P/τ)∑kexp⁡(zi(2)⊤pk/τ)\displaystyle p(z_i^{(2)}) = \frac{\exp(z_i^{(2)\top} P / \tau)}{\sum_k \exp(z_i^{(2)\top} p_k / \tau)}
  3. 交叉熵求和用 \(q^{(1)}\) 当标准答案去评估 \(p(z^{(2)})\),同时反向也做一遍,两个损失相加取平均。
    L=−1N∑i(qi(1)log⁡p(zi(2))+qi(2)log⁡p(zi(1)))\displaystyle \mathcal{L} = -\frac{1}{N}\sum_i \left( q_i^{(1)} \log p(z_i^{(2)}) + q_i^{(2)} \log p(z_i^{(1)}) \right)

均衡算法:Sinkhorn的雨露均沾

如果教室里没有纪律,所有同学大概率都会把照片塞进最显眼的那个文件夹,“苹果”文件夹被塞爆,而“火龙果”文件夹空空如也。这样聚类就退化了:所有特征挤在一起,毫无区分度。班主任于是制定了均衡配额——每个文件夹收的照片数量要尽量均衡。但直接加“每列正好 N/K 张”的硬约束很难求解,SwAV 采用了老祖宗留下的最优传输工具:Sinkhorn-Knopp 算法。

Sinkhorn 的做法非常朴素:先把相似度矩阵逐行归一化,让每行相加为 1;再逐列归一化,让每列相加接近均衡值;然后再逐行、再逐列……如此交替反复几次,矩阵就会收敛到一个既满足“每张图分配总和为 1”、又满足“每个文件夹分到的量大致均衡”的漂亮矩阵。整个过程只需要矩阵按行、按列除一除,又快又稳,完全可以在线计算。

如果把聚类比作分蛋糕,Sinkhorn 就是那个保证“每人一块、块头相近”的分蛋糕师傅。它不追求让每个人都分到最爱的口味,而是追求整体公平。SwAV 论文里通常只迭代 3 次就足够,因为原型和特征都在训练中同步更新,迭代太多次反而浪费算力。这碟“雨露均沾”的配菜,是 SwAV 聚类稳定性的真正功臣。

Q=Diag(u) exp⁡ ⁣(Mε)Diag(v),ui←1∑jQijvj,vj←1∑iQijui\displaystyle \mathbf{Q} = \mathrm{Diag}(u)\,\exp\!\left(\frac{\mathbf{M}}{\varepsilon}\right)\mathrm{Diag}(v), \quad u_i \leftarrow \frac{1}{\sum_j Q_{ij} v_j}, \quad v_j \leftarrow \frac{1}{\sum_i Q_{ij} u_i}
这里的 M 是特征与原型的内积矩阵,ε 是控制均衡强度的温度。算法反复更新行缩放因子 u 和列缩放因子 v,像两个标尺来回校正,直到行列都达标。
  1. 构造传输矩阵对相似度矩阵 M 的每个元素取指数,得到正的传输成本矩阵,ε 控制平滑程度。
    Tij=exp⁡ ⁣(Mijε)\displaystyle \mathbf{T}_{ij} = \exp\!\left(\frac{\mathbf{M}_{ij}}{\varepsilon}\right)
  2. 行归一化更新行缩放因子 \(u_i\),让每张图对所有文件夹的分配比例之和趋于 1。
    ui←1∑jTijvj\displaystyle u_i \leftarrow \frac{1}{\sum_j \mathbf{T}_{ij} v_j}
  3. 列归一化更新列缩放因子 \(v_j\),让每个文件夹收到的总量趋于均衡,防止簇退化。
    vj←1∑iTijui\displaystyle v_j \leftarrow \frac{1}{\sum_i \mathbf{T}_{ij} u_i}
  4. 交替迭代重复行、列归一化若干次,矩阵同时满足行和与列和的双重约束。
    Q=Diag(u) T Diag(v)\displaystyle \mathbf{Q} = \mathrm{Diag}(u)\,\mathbf{T}\,\mathrm{Diag}(v)

特征编码器:在线提取与原型更新

小明和小红之所以能看照片,是因为他们有一双好眼睛。在 SwAV 里,这双眼睛是卷积神经网络编码器——一张图进来,经过多层卷积和池化,被压缩成一个高维特征向量 z。这个向量就是“水果小抄”,记录了颜色、形状、纹理等抽象信息。编码器在训练中不断更新,眼睛越练越尖,小抄越写越准。

训练时编码器和原型是“在线同步进化”的。每个 batch 的图像先被编码器变成特征,特征做 L2 归一化后与原型矩阵算相似度,经过 Sinkhorn 得到分配码,再算交换预测损失回传。有趣的是,原型向量并不是独立更新的“老师”,而是和编码器一起接受梯度下降的“共犯”。为了防止某些原型长期不被分配到,Sinkhorn 的均衡约束已经从源头保证了每个文件夹都会被雨露沾到。

编码器和原型就像一对默契的搭档:编码器负责把图片翻译成简洁的笔记,原型负责提供归档的参考标准。如果哪一方跑偏,交换预测损失与均衡约束会立刻把 ta 拉回来。正是这种在线联合训练,让 SwAV 不需要额外的动量编码器或存储队列,结构比 MoCo 类方法更简洁,一张显卡也能跑起来。

z^i=zi∥zi∥2,p^k=pk∥pk∥2\displaystyle \hat{z}_i = \frac{z_i}{\|z_i\|_2}, \quad \hat{p}_k = \frac{p_k}{\|p_k\|_2}
特征和原型在计算相似度前都要做 L2 归一化,把自己的长度变成 1。这样内积只看“方向”而不看“长度”,避免某些特征模长过大霸占得分。
  1. 特征归一化把特征向量除以它的模长,得到一个单位向量,代表“方向”信息。
    z^i=zi∑dzi,d2\displaystyle \hat{z}_i = \frac{z_i}{\sqrt{\sum_d z_{i,d}^2}}
  2. 原型归一化原型向量做同样的单位化,保证相似度分数只反映形状契合度。
    p^k=pk∥pk∥2\displaystyle \hat{p}_k = \frac{p_k}{\|p_k\|_2}
  3. 余弦相似度单位向量做内积等价于计算余弦相似度,值域落在 [−1, 1],便于稳定训练。
    sim(zi,pk)=z^i⊤p^k\displaystyle \text{sim}(z_i, p_k) = \hat{z}_i^{\top} \hat{p}_k

多视角训练:Multi-Crop的全局视野

让小明和小红只看整张水果照片,难免以偏概全——苹果的蒂、香蕉的弯、橙子的纹路,都可能被忽略。班主任于是增加了一个大招:Multi-Crop。训练时,除了两张高分辨率的整图裁剪,再生成多张低分辨率的局部小裁剪。整图负责把握全局结构,局部小图负责抠细节纹理,两者结合,特征表示更加丰满。

Multi-Crop 的另一个好处是“花小钱办大事”。低分辨率的小裁剪计算量远小于高分辨率整图,却能为交换预测提供更多“同桌组合”。SwAV 的做法是:两张高分辨率视图之间互相做交换预测,高分辨率视图与所有低分辨率小图之间也做交换预测,但小图之间互不预测。这像全班同学互相结对子,大图和大图深聊,大图和小图也交流,小图之间点点头即可——用最少的算力换取最丰富的监督信号。

Multi-Crop 就像请来了全班同学,有人看正面,有人看侧面,还有人拿着放大镜看纹路。视角越多,对水果本质的认识就越全面,学到特征就越不容易被背景、遮挡等无关因素干扰。这也是 SwAV 能在 ImageNet 无监督预训练上追平甚至超越有监督方法的重要原因之一。

L=1∣E∣∑(s,t)∈Eℓ(s,t),ℓ(s,t)=−∑kqt(k)log⁡ps(k)\displaystyle \mathcal{L} = \frac{1}{|\mathcal{E}|} \sum_{(s,t) \in \mathcal{E}} \ell(s,t), \quad \ell(s,t) = -\sum_{k} q_t^{(k)} \log p_s^{(k)}
E 表示所有允许互猜的视图组合集合。每个组合都计算一次“用小 s 的特征预测小 t 的归档码”的交叉熵,最后取平均,让多视角信息充分融合。
  1. 视图组合集合限定哪些视图对可以互猜,通常是高分辨率图之间、以及各图与低分辨率小图之间。
    E={(s,t):可预测的视图对}\displaystyle \mathcal{E} = \{(s,t) : \text{可预测的视图对}\}
  2. 单对损失对某一对视图,以 t 的均衡分配码作为教师,用 s 的特征预测各原型的概率作为学生。
    ℓ(s,t)=−∑kqt(k)log⁡ps(k)\displaystyle \ell(s,t) = -\sum_{k} q_t^{(k)} \log p_s^{(k)}
  3. 取平均对所有视图对的损失求和再除以对数,得到多视角总损失。
    L=1∣E∣∑(s,t)∈Eℓ(s,t)\displaystyle \mathcal{L} = \frac{1}{|\mathcal{E}|} \sum_{(s,t) \in \mathcal{E}} \ell(s,t)

训练策略:损失、温度与批大小

有了相册和规则,接下来就是班主任的操盘艺术。SwAV 的总损失以交换预测交叉熵为主,但想让训练顺利收敛,还要细心调理几个旋钮。首先是温度系数 τ:它决定分配概率的“尖锐程度”。τ 太大,概率分布太平,模型觉得每个文件夹差不多,学不到差异;τ 太小,分布过于极端,早期训练容易锁死在错误分类上。SwAV 在实践中通常把 τ 设在 0.1 附近,让分配既有主见又不失弹性。

其次是批大小。虽然 SwAV 不需要负样本,但批量大小依然重要——更大的 batch 意味着 Sinkhorn 的均衡估计更准确,原型更新更稳定。论文在 ImageNet 上使用 256 的批大小,配合多机分布式训练。值得一提的是,相比 SimCLR 动辄需要 4096 的大 batch,SwAV 在 batch 较小时表现更稳,这是它“省显存”口碑的来源。

训练策略就像是班主任的排课表:温度定难度,批大小定规模,学习率定步速,Multi-Crop 定内容。任何一个旋钮拧过头,课程效果都会打折扣。SwAV 的优秀之处在于,它在这些旋钮的默认值下就能取得顶尖效果,工程落地时不需要像某些对比学习方法那样耗尽算力去调参。

τ=0.1,lrinit=0.6×batch256,epochs≈100∼400\displaystyle \tau = 0.1, \quad \text{lr}_{\text{init}} = 0.6 \times \frac{\text{batch}}{256}, \quad \text{epochs} \approx 100 \sim 400
SwAV 论文推荐的一组代表性超参:温度 0.1,学习率随批大小线性缩放,训练周期越长特征质量越高,100 到 400 个 epoch 都有不错收益。
  1. 温度选择温度设 0.1,使 softmax 输出保留陡峭但不极端的概率分布。
    τ=0.1\displaystyle \tau = 0.1
  2. 学习率缩放基础学习率 0.6 乘以当前批大小与 256 的比值,大 batch 配大学习率。
    lr=0.6×batch256\displaystyle \text{lr} = 0.6 \times \frac{\text{batch}}{256}
  3. 损失聚合总损失为所有交换预测子损失之和,每个子损失都用交叉熵衡量预测与分配的差距。
    Ltotal=∑(s,t)∈EH(qt,ps)\displaystyle \mathcal{L}_{\text{total}} = \sum_{(s,t) \in \mathcal{E}} \mathrm{H}(q_t, p_s)

评估应用:从预训练到落地

半年过去,小明和小红的水果相册已经整理得井井有条。但他们到底学得怎么样?班主任发下一场“转学考试”:把相册带到新班级,新班级的同学只认识少量水果,主要看小明小红能不能帮他们分好类。这就是自监督学习的经典评估方式——线性探测。把预训练好的编码器冻住,只在特征上接一个线性分类器,用少量标注数据训练。如果特征本身足够好,线性分类器就能拿到很高的准确率。

SwAV 在 ImageNet 的线性探测准确率曾达到 75.3%,超过了当时许多有监督预训练模型,证明它的特征具有强迁移能力。实际工程中,这套特征可以直接用于图片检索、商品聚类、医学影像预训练等领域——先把海量无标签数据用 SwAV 洗一遍,再在少量标注数据上微调,往往比直接从零训练又快又准。相比 SimCLR 动辄需要超大 batch 和大量负样本,SwAV 的工程门槛友好得多。

从水果教室到真实世界,SwAV 讲了一个朴素而深刻的道理:好特征不需要海量标签,也不需要满世界找反例,只需要同类的不同视角互相印证、并由一套公平的归档规则把秩序维持住。今天,这个思路已经渗透进多模态预训练、视频自监督、无监督语义分割等前沿方向,成为“免负样本”流派最具代表性的基石之一。

Top-1 Acc=1Ntest∑i=1Ntest1[y^i=yi]\displaystyle \text{Top-1 Acc} = \frac{1}{N_{\text{test}}} \sum_{i=1}^{N_{\text{test}}} \mathbb{1}\left[ \hat{y}_i = y_i \right]
线性探测准确率是衡量自监督特征质量最常用的指标:在冻结的特征上训练一个线性分类器,统计测试集上预测正确的比例。
  1. 冻结特征提取预训练编码器不再更新,只把输入变成特征,当做“现成的小抄”。
    zi=fθ(xi),θ 冻结\displaystyle z_i = f_{\theta}(x_i), \quad \theta \text{ 冻结}
  2. 线性分类器在特征之上加一层全连接,用少量标注训练出类别决策边界。
    y^i=argmax(Wzi+b)\displaystyle \hat{y}_i = \mathrm{argmax}(W z_i + b)
  3. 准确率统计计算预测标签与真实标签一致的比例,数值越高说明特征越可分。
    Acc=1Ntest∑i1[y^i=yi]\displaystyle \text{Acc} = \frac{1}{N_{\text{test}}} \sum_i \mathbb{1}[\hat{y}_i = y_i]

AI 应用场景

电商无标签商品聚类与检索

阶段:自监督预训练

解决的问题:电商平台每天上新数百万商品,人工标注商品类别成本高、滞后性强。传统有监督模型只能识别已标注的类目,遇到新品类就无能为力。SwAV 先在全部无标签商品图上做自监督预训练,学到的特征天然具有聚类一致性,可自动把相似商品归入同一簇。

具体案例:某服装平台积累了 5000 万张无标签商品图。工程师用 SwAV 预训练 14 天,再对特征做 K-Means 聚类,直接生成“连衣裙”“卫衣”“牛仔裤”等 800 个细粒度簇。运营人员只需抽查每个簇的少量样本确认质量,就能上线智能推荐和同款检索,省去了数十人月的标注工作量。

医学影像无标注预训练

阶段:自监督预训练 + 下游微调

解决的问题:医院积累的海量 CT、MRI 影像大多没有详细诊断标注,而有标注的数据涉及专家隐私和昂贵人力。SwAV 可以在全部无标注影像上先学习通用解剖结构特征,再用少量标注微调出病灶检测模型,大幅降低对标注量的需求。

具体案例:某三甲医院联合 AI 团队,用 SwAV 在 10 万张无标注肺部 CT 切片上预训练,随后仅用 500 张标注结节切片微调,肺结节检测的 AUC 比从零训练提升了约 12 个百分点,达到与使用 5000 张标注训练的模型相当的水平,且训练成本降低 70%。

Python 演示

python45 行
import numpy as np def sinkhorn_knopp(sim, num_iters=3):    """用 Sinkhorn-Knopp 迭代得到均衡的软分配矩阵。    sim: 相似度矩阵, 形状 (N, K), 每行是一张图的相似度。    返回: Q, 形状 (N, K), 每行和为 1, 每列近似均衡。    """    Q = np.exp(sim - sim.max(axis=1, keepdims=True))    Q = Q / Q.sum(axis=1, keepdims=True)    for _ in range(num_iters):        Q = Q / Q.sum(axis=0, keepdims=True)        Q = Q / Q.sum(axis=1, keepdims=True)    return Q def swapped_prediction_loss(z1, z2, prototypes, temperature=0.1):    """计算 SwAV 的交换预测损失。    z1, z2: 两个增强视图的特征矩阵, 形状 (N, d)。    prototypes: 原型矩阵, 形状 (K, d)。    """    p_norm = prototypes / np.linalg.norm(prototypes, axis=1, keepdims=True)    z1 = z1 / np.linalg.norm(z1, axis=1, keepdims=True)    z2 = z2 / np.linalg.norm(z2, axis=1, keepdims=True)    logits1 = z1 @ p_norm.T / temperature    logits2 = z2 @ p_norm.T / temperature    q1 = sinkhorn_knopp(logits1)    q2 = sinkhorn_knopp(logits2)    p1 = np.exp(logits1 - logits1.max(axis=1, keepdims=True))    p1 = p1 / p1.sum(axis=1, keepdims=True)    p2 = np.exp(logits2 - logits2.max(axis=1, keepdims=True))    p2 = p2 / p2.sum(axis=1, keepdims=True)    loss = -np.mean(np.sum(q1 * np.log(p2 + 1e-12), axis=1) +                    np.sum(q2 * np.log(p1 + 1e-12), axis=1))    return loss def main():    rng = np.random.default_rng(42)    N, d, K = 32, 128, 8    prototypes = rng.normal(size=(K, d))    z1 = rng.normal(size=(N, d))    z2 = rng.normal(size=(N, d))    loss = swapped_prediction_loss(z1, z2, prototypes)    print("SwAV swapped prediction loss:", round(float(loss), 4)) if __name__ == "__main__":    main()
目的:用 NumPy 从零实现 SwAV 的核心计算——特征与原型求相似度、Sinkhorn 均衡化得到分配码、再算两个方向的交换预测交叉熵损失。真实训练中只需把 z1/z2 换成编码器输出、把损失回传更新网络即可。
  1. def sinkhorn_knopp(sim, num_iters=3):定义 Sinkhorn 迭代,交替做行、列归一化,让分配既满足每行和为 1,又满足每列均衡。
  2. Q = np.exp(sim - sim.max(axis=1, keepdims=True))对相似度取指数并做数值稳定处理,防止溢出。
  3. Q = Q / Q.sum(axis=1, keepdims=True)行归一化,把每个视图的分配概率总和变为 1。
  4. Q = Q / Q.sum(axis=0, keepdims=True)列归一化,强制每个原型分到的总量趋于均衡。
  5. logits1 = z1 @ p_norm.T / temperature计算视图 1 与所有归一化原型的相似度,温度缩放出软硬度。
  6. q1 = sinkhorn_knopp(logits1)得到视图 1 的均衡软分配码,作为视图 2 的“标准答案”。
  7. p1 = p1 / p1.sum(axis=1, keepdims=True)普通 softmax 概率,作为“学生预测”,和均衡分配码区别开。
  8. loss = -np.mean(np.sum(q1 * np.log(p2 + 1e-12), axis=1) + ...)计算双向交叉熵之和,正是交换预测损失。

常见误区

误区“SwAV 也是对比学习,所以它一定也需要正样本和负样本,只是把负样本藏起来了。”

正解SwAV 的监督信号不是“正样本远离负样本”,而是“不同视角分配码的一致性”。它没有显式的负样本对,也不需要维护负样本队列,聚类分配本身就是判别信号。就像小明和小红不需要知道所有陌生人是谁,只要互猜归档码成功,分类就成立。

为何常见:SwAV 常被归类在“对比学习”大伞下,名称里又带“Swapping”,初学者容易把它和 SimCLR 的对比损失画等号。

误区“Sinkhorn-Knopp 不就是另一种 K-Means 吗?输出每个样本所属的一个簇编号,相当于硬分配。”

正解K-Means 输出的是非 0 即 1 的硬标签,而 Sinkhorn 输出的是连续概率矩阵,只是额外增加了列均衡约束。它更像“雨露均沾的软打分”,而不是“一锤定音的选中谁”。硬分配会让损失无法平滑回传梯度,SwAV 之所以用 Sinkhorn,正是为了保留概率的柔和性。

为何常见:聚类算法在大众认知里就是“分到第几类”,容易忽略 SwAV 里分配其实是带温度的概率向量。

误区“交换预测就是把两张图像互相交换一下再输入网络,相当于数据增强的一种。”

正解交换的是两个视图各自算出的聚类分配码(q1 和 q2),不是图像像素。网络输入仍然是原本的两个视图,只是损失函数用 q1 去约束 p2、用 q2 去约束 p1,形成交叉监督。好比小明和小红没有交换照片,只是交换了“归档到哪个文件夹”的答案去互相检验。

为何常见:SwAV 全称里 “Swapping Assignments” 字面直译容易让人理解为“交换分配对象”,而忽略 Assignments 特指聚类代码。

误区“聚类的文件夹越多,分类越精细,所以把原型数量设到非常大效果一定更好。”

正解原型数量 K 是超参数,不是越大越好。K 过大时,在有限 batch 下每个原型分配到的样本过少,Sinkhorn 的均衡估计噪声变大,训练不稳定;K 过小时又损失了细粒度。SwAV 论文使用 3000 个原型,并指出原型数要与 batch、数据规模匹配。

为何常见:直觉上“类别越细模型越强”,但忽略了 Sinkhorn 均衡约束对每簇样本量的统计要求。

误区“SwAV 学到特征后,不用任何标注,直接对特征跑个聚类就能完成分类任务。”

正解SwAV 学的是特征表示,不是分类器。它让同语义样本的特征聚拢,但某个具体聚类簇对应哪个语义类别仍需少量标注或人为映射。后续通常要做线性探测或微调,才能完成监督分类任务。这和“学说话”与“考语文”是两回事:SwAV 负责把话说流利,分类器负责答对题。

为何常见:自监督预训练常被宣传为“无需标注”,容易让人误以为整个流程都不需要标签,实际上下游任务通常还要少量标注。

面试题

Q1. SwAV 中的“交换预测”主要交换的是什么?

单选题 · easy

  • A.交换两个视图的图像
  • B.交换聚类分配代码← 正确答案
  • C.交换网络结构权重
  • D.交换数据增强策略

答案:B。SwAV 交换的是两个视图各自算出的聚类分配码(Assignments),用视图 1 的分配码去监督视图 2 的预测,反之亦然。它不交换图像、权重或增强策略。就像同桌互猜归档文件夹,猜的答案可以交换,照片本身没有换。

Q2. 与 SimCLR 相比,SwAV 最大的特点是什么?

单选题 · easy

  • A.不再依赖任何标签数据
  • B.无需显式负样本对← 正确答案
  • C.使用更深的骨干网络
  • D.需要更大的输出维度

答案:B。SimCLR 依赖大量负样本区分不同图像,而 SwAV 用聚类分配作为判别信号,不需要构造负样本对。用标签数据并非 SwAV 独有,SimCLR 也不用标签;骨干网络和输出维度也不是二者的本质区别。

Q3. Sinkhorn-Knopp 迭代的作用是什么?

单选题 · mid

  • A.让聚类分配尽可能均衡← 正确答案
  • B.让特征收敛速度更快
  • C.让原型数量动态增减
  • D.让损失函数变为稀疏

答案:A。Sinkhorn 通过交替行、列归一化,使分配矩阵既满足每行和为 1、又让每列接收的量近似均衡,防止所有样本涌入同一个原型。它不改变网络结构、特征速度或损失稀疏性。

Q4. 原型向量的本质是什么?

单选题 · mid

  • A.一组可学习的簇中心← 正确答案
  • B.固定不变的卷积核
  • C.输入图像的像素值
  • D.数据增强后的图像

答案:A。原型向量是可学习的参数,代表“想象中的标准水果”,参与相似度计算并随梯度更新。它不同于卷积核,也不是像素或增强图。原型像档案柜里的文件夹标签,训练中不断被修正。

Q5. 温度系数 τ 偏大时,softmax 分布会发生什么?

单选题 · mid

  • A.概率分布更加尖锐集中
  • B.概率分布更加平坦均匀← 正确答案
  • C.概率分布变成硬编码
  • D.概率分布不会有变化

答案:B。温度 τ 出现在指数项的除数位置,τ 越大,相似度分数被压缩得越小,softmax 输出趋向均匀,模型难以区分文件夹;τ 越小,分布越尖锐。所以 τ 偏产生“都差不多”的平坦分布。

Q6. 为什么 SwAV 相比 SimCLR 对超大 batch 的依赖更小?

单选题 · hard

  • A.因为原型矩阵提供了替代负样本的全局信号← 正确答案
  • B.因为 SwAV 使用了更小的输入图像
  • C.因为 SwAV 不需要任何数据增强
  • D.因为 SwAV 的损失函数不含除法运算

答案:A。SimCLR 的对比损失需要 batch 内有足够多负样本才有判别力;SwAV 用少量原型向量充当“全局聚类中心”,不再依赖 batch 内的负样本对,因此小 batch 下也能稳定训练。输入尺寸、增强和除法并非原因。

Q7. Multi-Crop 为 SwAV 提供了哪些优势?

多选题 · easy

  • A.多张裁剪视图参与训练← 正确答案
  • B.多尺度信息丰富特征← 正确答案
  • C.不再需要任何数据增强
  • D.直接替代全部损失函数

答案:AB。Multi-Crop 生成两张高分辨率视图和多张低分辨率小图,既增加视图数量,又引入多尺度信息,用便宜的小图换取丰富监督。它是增强策略的一部分,并未取消增强,也不替代损失函数。

Q8. 关于 SwAV 的软分配,下列说法正确的有?

多选题 · mid

  • A.输出连续的概率值← 正确答案
  • B.经过 Sinkhorn 实现均衡← 正确答案
  • C.相比硬分配更利于梯度回传← 正确答案
  • D.无须归一化即可使用

答案:ABC。软分配输出连续概率,并经过 Sinkhorn 行列归一化达到均衡,连续性让交叉熵损失可以平滑回传梯度。它必须归一化才能作为概率使用,因此 D 错误。

Q9. SwAV 的学习信号主要来自哪里?

单选题 · hard

  • A.两个视图聚类分配的一致性← 正确答案
  • B.人工提供的监督标签
  • C.环境返回的奖励值
  • D.解码重构的像素误差

答案:A。SwAV 用交换预测让一个视图的分配码去预测另一个视图的分配码,迫使跨视图聚类结果保持一致,这就是自监督信号。它不依赖人工标签,不是强化学习的奖励,也不是自编码器的重构误差。

Q10. 以下哪些因素会影响 SwAV 的训练效果?

多选题 · easy

  • A.批处理样本的数量← 正确答案
  • B.温度系数的取值← 正确答案
  • C.Multi-Crop 的尺度← 正确答案
  • D.原型数量的选择← 正确答案

答案:ABCD。论文实验表明,批大小影响 Sinkhorn 的均衡估计稳定性,温度决定分配软硬,Multi-Crop 的裁剪尺度决定多视角信息质量,原型数量影响聚类粒度。四者都是训练效果的关键超参,需要配合调优。