Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3.6 迁移学习与自监督预训练

3.4–3.5 节讲的都是「怎么造一个骨干」。但绝大多数真实项目的正确做法不是造骨干,而是拿一个别人已经训好的骨干,改造成自己的模型。这一节讲两件事:怎么正确地迁移(工程手法),以及在没有标签的情况下怎么得到一个好骨干(自监督)。

这两件事在近五年里发生了地位互换:2015 年前后,「预训练」几乎等同于「在 ImageNet 上用 1000 类标签监督训练」;2020 年之后,自监督预训练(对比学习、掩码建模)成为主流,因为它不需要标签、表示的通用性更好。理解这条转变的动机,比记住一堆缩写更重要。

这节的五个问题
  1. 迁移学习为什么几乎总是优于从零训练?冻结与微调各自的适用条件是什么?(3.6.1)
  2. 工程上怎么调学习率、怎么分层?(3.6.2)
  3. 对比学习的目标函数是什么?为什么叫 InfoNCE?(3.6.3)
  4. 为什么会有「不用负样本」的方法(BYOL / DINO)?它们靠什么防崩塌?(3.6.4)
  5. 小数据场景应该按什么顺序做决策?(3.6.5)

3.6.1 迁移学习:为什么几乎总是从预训练开始

定义 3.6.1 · 迁移学习(transfer learning)

把在源任务(source task,如 ImageNet 1000 类分类)上预训练好的网络参数,迁移到目标任务(target task)上作为初始化,再在目标任务数据上继续训练。两种基本策略:

  • 特征提取 / 冻结(feature extraction / freeze):把预训练网络当作固定的特征提取器,冻结其权重(不让梯度更新),只训练新加的任务头。适合目标数据少、且与源任务相近。
  • 微调(fine-tuning):解冻部分或全部层,用较小的学习率继续训练,让特征适配新任务。适合目标数据较多或与源任务差异较大。
迁移为什么有效:特征的层次性

3.4.1 提到骨干学到了层次化特征:浅层是边缘、颜色、纹理,中层是部件,深层是类别语义。层次越浅,越通用——「边缘检测」这件事对 X 光片和街景照片是一样的需求。

于是迁移的有效性可以这样理解:目标任务的输入端往往与源任务共享低层结构,因此从预训练权重出发,等于把「如何看图像」这一部分免费拿到,只需要重学「如何把这些特征映射到我的标签」。这就是为什么源任务与目标任务的相似度越高、迁移收益越大——共享的前缀越长。

反过来,如果目标任务的输入分布与源任务完全不同(例如把自然图像骨干直接搬到频谱图或点云上),浅层特征也不再通用,迁移收益就会大幅下降,甚至不如从零训练。这是条件性结论,不是普适定律。

迁移学习的实操流程(可直接照做)
1. 选骨干:在足够大的数据上预训练的模型(ImageNet 监督、CLIP、DINOv2、MAE 等)
   - 先确认它的输入预处理(分辨率、归一化统计、通道顺序)与你的数据一致
   - 用与骨干匹配的预处理([3.3.5](sec33.md#sec-3.3.5)),否则初始 loss 会异常高
2. 换头:把原分类头替换为适配自己类别数的新头(随机初始化)
   - 分类:Linear(d_model, n_classes)
   - 检测 / 分割:换成对应的检测头 / 解码器,骨干保持不变
3. 两阶段训练(推荐)
   阶段 A(warmup):冻结骨干,只训新头
       - 学习率可以大(1e-3 量级),因为只有几万个参数要学
       - 训练 1-3 个 epoch,直到训练 loss 明显下降
       - 目的:让随机初始化的头先"学会读特征",避免它用大梯度把骨干打乱
   阶段 B(微调):解冻骨干(全部或后段),用更小的学习率联合训练
       - 骨干学习率约为头的 1/10(或更小)
       - 典型:头 1e-3、骨干 1e-4;大数据时可整体 1e-4 ~ 3e-5
       - 用余弦退火 + warmup;配合早停(验证集)
4. 常规防护:数据增强、标签平滑、EMA、混合精度(注意 loss scaling)、固定随机种子
5. 判断是否该继续:验证指标连续 N 轮不升 → 早停;训练 loss 远低于验证 → 过拟合,转回更冻结的方案或加正则

四条判据(数据量 × 相似度):

与源任务相似 与源任务差异大
目标数据少 只训头(冻结骨干) 只微调后段;强增强;考虑自监督预训练骨干
目标数据多 微调全网络(小学习率) 微调全网络或从零训练;考虑领域自监督预训练
例 3.6.1 · 冻结与微调的成本对比(一个具体的量级估算)

某任务用 ResNet-50 骨干(25.5×10625.5\times10^6 参数),目标任务有 5,0005{,}000 张图、2020 类。分别计算「只训头」与「全网络微调」两种方案下的可训练参数量、每 epoch 的梯度显存量级差异(用参数量粗略估计),并说明哪个方案更可能过拟合。

解

可训练参数量

  • 只训头:新头为 Linear(2048, 20),参数量 2048×20+20=40,9802048\times20+20=40{,}980(约 4.1×1044.1\times10^4)。
  • 全网络微调:25.5×106+4.1×104≈2.55×10725.5\times10^6+4.1\times10^4\approx2.55\times10^7。

比值:约 622622 倍。

显存中的梯度量级(以 fp32 计,梯度张量本身约 44 字节 / 参数)

  • 只训头:40,980×4≈0.1640{,}980\times4\approx0.16 MB
  • 全网络:2.55×107×4≈1022.55\times10^7\times4\approx102 MB

若使用 Adam 类优化器,还要为每个可训练参数保存一阶、二阶动量(各 4 字节,fp32 下共 88 字节 / 参数),于是:

  • 只训头:约 0.16+0.33≈0.50.16+0.33\approx0.5 MB
  • 全网络:约 102+204≈306102+204\approx306 MB

过拟合风险判断:目标数据只有 5,0005{,}000 张、2020 类(平均每类 250250 张),却要更新 2.55×1072.55\times10^7 个参数——每个参数平均只有 0.00020.0002 个样本支撑。这个比例下全网络微调通常需要很强的正则(小学习率 + 早停 + 强增强 + 权重衰减)才不崩;而「只训头」把可训练参数压到 4.1×1044.1\times10^4,过拟合风险低得多。

结论(工程默认):小数据先只训头,观察验证集表现;只有在「训练 loss 与验证 loss 都还在下降、且验证明显欠拟合」时才逐步解冻后段。不要一上来就全网络微调——这是小数据项目最常见的翻车方式。

∎

3.6.2 学习率分层与领域偏移 {#sec-3.6.2}

分层学习率(layer-wise learning rate decay)

微调时对不同深度的层使用不同学习率,越浅的层学习率越小(因为它们承载的是更通用的特征,不需要大幅改动):

ηl=ηhead⋅α K−l,α∈[0.5,0.9], l=1,…,K,\eta_l=\eta_{\text{head}}\cdot\alpha^{\,K-l},\qquad \alpha\in[0.5,0.9],\ l=1,\dots,K,

其中 KK 是层数(或阶段数),ll 越小表示越浅。以 ηhead=10−3\eta_{\text{head}}=10^{-3}、四个阶段为例:

α\alpha 阶段 4(最深) 阶段 3 阶段 2 阶段 1(最浅)
0.10.1 1.0×10−31.0\times10^{-3} 1.0×10−41.0\times10^{-4} 1.0×10−51.0\times10^{-5} 1.0×10−61.0\times10^{-6}
0.50.5 1.0×10−31.0\times10^{-3} 5.0×10−45.0\times10^{-4} 2.5×10−42.5\times10^{-4} 1.25×10−41.25\times10^{-4}
0.80.8 1.0×10−31.0\times10^{-3} 8.0×10−48.0\times10^{-4} 6.4×10−46.4\times10^{-4} 5.12×10−45.12\times10^{-4}

实践建议:α\alpha 取 0.50.5–0.80.8 比 0.10.1 更常见;α=0.1\alpha=0.1 会让最浅层几乎不动,只有在你确信浅层特征完全通用时才用。Transformer 骨干(ViT 系)微调时分层衰减尤其常见,因为它的浅层与深层功能分化更明显。

为什么「越浅越小」的直觉是对的

浅层学的是通用特征(边缘、纹理),这些特征在目标任务里同样有用,因此不希望它们被目标任务的小数据带偏——小学习率相当于「轻推,不改架构」。深层学的是与源任务标签强相关的语义,需要更大程度的重塑。任务头是随机初始化的,必须用最大学习率。

这条规则还有一个更朴素的检查法:如果你把骨干学习率设得和头一样大,会发生什么? 骨干会在前几十步被大梯度"打乱"(随机初始化的头产生的梯度包含大量噪声方向),浅层通用特征被破坏,之后需要很长时间才能恢复——表现为训练初期 loss 抖动剧烈、需要更长的 warmup。先冻结、只训头,正是这个问题的极端解法。

定义 3.6.2 · 领域偏移(domain shift)与任务偏移
  • 领域偏移:输入分布 P(X)P(X) 变化而任务的输入输出关系 P(Y∣X)P(Y\mid X) 大致不变。例:白天街景 → 夜间街景;自然图像 → 内窥镜图像。
  • 任务偏移 / 标签偏移:输出分布或语义定义变化。例:源任务是"1000 类物体",目标任务是"病灶良恶性"——标签体系完全不同。

领域偏移的诊断信号:模型的浅层特征统计出现明显漂移;在无标签目标域上,BN 的运行统计量(3.3.3)与源域不匹配。任务偏移的诊断信号:只有最后几层的输出分布与源域差异大,浅层仍然相似。

领域偏移为什么要单独讨论:BN 统计量是最早出问题的地方

3.3.3 讲过:BatchNorm 在推理时用的是训练期间累积的运行统计量。当领域偏移发生时(例如训练集是晴天、部署时是雨天),输入的均值与方差变了,而推理阶段的 BN 仍在用晴天统计量做归一化——于是每一层都被施加了一个系统性偏移,误差逐层累积。

三种缓解手段(按代价从低到高):

  1. 重估 BN 统计量(BN re-estimation):冻结所有参数,只用目标域的无标签数据跑前向、重新累积 running statistics。这是最便宜的领域适配手段——通常几十到几百个 batch 就够,且不需要任何标签。
  2. 测试时自适应(test-time adaptation):在推理时根据当前样本动态调整归一化统计(如只更新 BN 参数或统计量)。
  3. 领域自监督预训练:在目标域的无标签数据上做自监督预训练(3.6.3),让骨干从一开始就见过目标域分布。代价最高,但收益也最大。
本节的前半部分常见误解
  1. 「预训练权重是万能的,随便换数据就行」:必须对齐预处理(分辨率、归一化统计、通道顺序)。用错统计量会导致初始 loss 异常高、收敛变慢,是「微调不收敛」的高频原因(3.3.5)。
  2. 「全网络微调一定比只训头好」:小数据下相反(例 3.6.1)。正确顺序是「冻结 → 观察 → 逐步解冻」。
  3. 「骨干学习率应该和头一样」:会导致骨干被随机头的噪声梯度破坏;应小 1010 倍左右(或使用分层衰减)。
  4. 「迁移学习一定能提升」:源域与目标域差异很大(如把自然图像骨干直接用到点云 / 频谱图)时收益可能为负。要给出条件的判断,而不是默认结论。
  5. 「冻结骨干就不用管了」:冻结时若骨干带 BN,它的运行统计量在微调阶段仍会随前向数据更新(train() 模式下),这会影响结果。冻结骨干的正确做法通常是把 BN 也切到 eval(),或使用 GroupNorm 骨干。

3.6.3 对比学习:InfoNCE 与它的推导 {#sec-3.6.3}

有标签的预训练需要 ImageNet 量级的标注。自监督的核心想法是:让「同一张图的不同视图」在表示空间里靠近,让「不同图」的表示远离——监督信号来自数据自身的结构,不需要人工标签。

定义 3.6.3 · 对比学习与 InfoNCE 损失

给定一批 NN 个样本,每个样本生成两个增强视图,得到 2N2N 个表示 z1,…,z2N\boldsymbol z_1,\dots,\boldsymbol z_{2N}。对每个锚点 ii,记其正样本(同一图的另一视图)为 j(i)j(i),其余 2N−22N-2 个为负样本。相似度用余弦相似度

sik=ziTzk∥zi∥ ∥zk∥ / τ,s_{ik}=\frac{\boldsymbol z_i^{\mathrm T}\boldsymbol z_k}{\lVert\boldsymbol z_i\rVert\,\lVert\boldsymbol z_k\rVert}\ \Big/\ \tau,

其中 τ>0\tau\gt0 是温度(temperature)。InfoNCE 损失(NN 个锚点求平均)为

L=−12N∑i=12Nlog⁡exp⁡(si,j(i))∑k≠iexp⁡(sik).(3.11)\mathcal L=-\frac{1}{2N}\sum_{i=1}^{2N}\log\frac{\exp(s_{i,j(i)})}{\sum_{k\neq i}\exp(s_{ik})} . \tag{3.11}

InfoNCE 就是一个 2N2N 类分类问题

把每个视图的表示当作一个"类别",那么「找出 ii 的正样本」就是一个 2N−12N-1 类的分类任务(2N−22N-2 个负样本 + 1 个正样本)。于是 (3.11) 与交叉熵完全同形——这解释了它为什么有效:它把表示学习变成了「在表示空间里做最近邻分类」。

三个直接推论:

  1. 负样本越多,任务越难,表示越好。分母求和里的负样本数决定了"班级规模"。这正是 SimCLR 需要大 batch(每张图有 2N−22N-2 个负样本)、MoCo 需要大队列的原因。
  2. 温度控制分布的"锐度"。τ\tau 越小,siks_{ik} 被放大得越厉害,softmax 越接近 argmax,模型被逼着把正负样本分得很开;τ\tau 太大则所有 logits 都接近,梯度太弱,学不到判别性。
  3. 负样本的多样性决定学到的表示。如果负样本与锚点本身很相似(如同图的另一视图被误当负样本),会引入错误的排斥信号——这是数据增强与匹配逻辑必须小心的原因。
推导 · InfoNCE 的梯度是一个「吸引 + 排斥」的力

记 pik=exp⁡(sik)∑j≠iexp⁡(sij)p_{ik}=\dfrac{\exp(s_{ik})}{\sum_{j\neq i}\exp(s_{ij})}(负样本上的 softmax 分布),pii:=0p_{ii}:=0。对锚点 ii 的损失 Li=−log⁡pi,j(i)\mathcal L_i=-\log p_{i,j(i)} 求关于 siks_{ik} 的偏导。

第一步:一般情形。设 qk=exp⁡(sik)/Zq_k=\exp(s_{ik})/Z、Z=∑j≠iexp⁡(sij)Z=\sum_{j\neq i}\exp(s_{ij}),则 log⁡qk=sik−log⁡Z\log q_k=s_{ik}-\log Z,于是

∂log⁡qk∂sik=1−∂log⁡Z∂sik=1−qk.\frac{\partial \log q_k}{\partial s_{ik}}=1-\frac{\partial \log Z}{\partial s_{ik}}=1-q_k .

对 l≠kl\neq k:∂log⁡qk∂sil=−∂log⁡Z∂sil=−ql\dfrac{\partial \log q_k}{\partial s_{il}}=-\dfrac{\partial\log Z}{\partial s_{il}}=-q_l。

第二步:代入损失。Li=−log⁡qj(i)\mathcal L_i=-\log q_{j(i)},故

∂Li∂sik={−(1−pi,j(i)),k=j(i)+ pik,k≠i, j(i)\frac{\partial\mathcal L_i}{\partial s_{ik}}=\begin{cases}-\bigl(1-p_{i,j(i)}\bigr),& k=j(i)\\[4pt] +\,p_{ik},& k\neq i,\ j(i)\end{cases}

第三步:换回 sik=cos⁡θik/τs_{ik}=\cos\theta_{ik}/\tau,得

∂Li∂zi=−1τ[(1−pi,j(i))⏟正样本权重∂cos⁡θi,j(i)∂zi−∑k≠i,j(i)pik⏟负样本权重∂cos⁡θik∂zi].\frac{\partial\mathcal L_i}{\partial \boldsymbol z_i}=-\frac{1}{\tau}\Bigl[\underbrace{\bigl(1-p_{i,j(i)}\bigr)}_{\text{正样本权重}}\frac{\partial\cos\theta_{i,j(i)}}{\partial\boldsymbol z_i}-\sum_{k\neq i,j(i)}\underbrace{p_{ik}}_{\text{负样本权重}}\frac{\partial\cos\theta_{ik}}{\partial\boldsymbol z_i}\Bigr].

读法:−∂L/∂zi-\partial\mathcal L/\partial\boldsymbol z_i 是梯度下降的方向,它把 zi\boldsymbol z_i 往正样本拉、从负样本推开,权重分别是 (1−ppos)(1-p_{\text{pos}}) 与 pikp_{ik}。所以:

  • 越"难"的负样本(pikp_{ik} 大,即当前被判得越像正样本)被推得越用力——难负样本主导学习;
  • 若正样本已经被分对(ppos≈1p_{\text{pos}}\approx1),它的吸引权重 →0\to0,该项不再贡献梯度;
  • 温度 τ\tau 在分母上:τ\tau 越小,梯度整体越大(需要更小的学习率配合)。

这也解释了 (3.11) 与「在表示空间做最近邻分类」是同一件事——梯度就是分类器在调整决策边界时的力。■\blacksquare

∎
三大对比学习方法的机制对照
方法 负样本来源 关键机制 是否需大 batch
SimCLR(2020,arXiv:2002.05709) 当前 batch 内(2N−22N-2 个) 强增强组合(裁剪 + 颜色抖动 + 模糊…)+ 投影头(MLP),损失在投影后的空间算 是(论文主结果用大批量;具体数值需核实)
MoCo(2019/2020,arXiv:1911.05722) 队列(queue,跨 batch 累积动量编码器产生的表示) 动量编码器(key encoder 的参数是 query encoder 的滑动平均)保证队列中特征一致 否(队列与 batch 解耦)
CLIP(2021,arXiv:2103.00020) 同一 batch 内的其他图文对 双塔(图像编码器 + 文本编码器),对称 InfoNCE:图像→文本与文本→图像两个方向的对比 是(4 亿图文对训练)

投影头的作用(SimCLR 的一个反直觉发现):在表示后接一个小型 MLP(如 d→2048→d′d\to2048\to d'),损失在投影空间计算,下游任务使用投影之前的表示。原文报告这能显著提升下游线性评估精度——一种解释是投影头承担了「丢弃与增强无关信息」的任务,从而让主干表示保留更多通用信息。

例 3.6.2 · 负样本数量与温度的量级感

(a)SimCLR 风格:batch 大小 B=4096B=4096,每张图两个视图。求每个锚点的负样本数与正样本数。(b)MoCo 风格:队列长度 65,53665{,}536(需核实具体数值)。对比两者的负样本规模。(c)计算余弦相似度 0.30.3 在不同温度下的 logit 值,说明温度的影响。

解

(a) 每批共 2N=2B=81922N=2B=8192 个视图。对某个锚点 ii:正样本 11 个(同图的另一视图),负样本 2B−2=81902B-2=8190 个。注意:2B−22B-2 而不是 B−1B-1——因为同图的另一视图既是别人的锚点也可能是自己的正样本,计数时要去掉自身与正样本。

(b) MoCo 的队列提供 65,53665{,}536 个负样本(跨多个 batch 累积),与当前 batch 大小解耦。所以 MoCo 在小 batch 下也能有与 SimCLR 大批量相近的负样本规模——这是它设计上的核心动机。(队列长度与动量系数取值的具体数字以原论文为准。)

(c) s=cos⁡θ/τs=\cos\theta/\tau:

τ\tau 0.5 0.2 0.1 0.07 0.05
cos⁡θ=0.3\cos\theta=0.3 时的 logit 0.60 1.50 3.00 4.29 6.00

读法:τ\tau 从 0.50.5 降到 0.050.05,同一个相似度对应的 logit 放大了 1010 倍。softmax 对 logit 尺度极度敏感:τ=0.5\tau=0.5 时分布近乎均匀(梯度弱、学不到东西),τ=0.05\tau=0.05 时分布接近 one-hot(梯度强但对噪声敏感、可能不稳定)。所以 τ\tau 必须与学习率、batch 大小一起调,不能单独看。

∎

3.6.4 不用负样本:BYOL 与 DINO

对比学习有一个内在张力:性能依赖大量负样本,而负样本要么需要大 batch(显存爆炸),要么需要队列(实现复杂、特征一致性难保证)。于是出现了一条「不要负样本」的路线。

定义 3.6.4 · 自蒸馏式自监督(BYOL / SimSiam / DINO)

同时维护两个网络:在线网络(online,θ\theta,带预测器)与目标网络(target,ξ\xi,不接收梯度)。损失要求在线网络对同一图的一个视图的预测,去拟合目标网络对另一个视图的表示:

L=∥qθ(gθ(x1))−sg(gξ(x2))∥22,\mathcal L=\Bigl\lVert q_\theta\bigl(g_\theta(\boldsymbol x_1)\bigr)-\mathrm{sg}\bigl(g_\xi(\boldsymbol x_2)\bigr)\Bigr\rVert_2^2,

其中 qθq_\theta 是预测器(predictor,额外的一层 MLP),sg(⋅)\mathrm{sg}(\cdot) 表示停止梯度(stop-gradient),目标网络的参数按在线参数的滑动平均更新(BYOL):

ξ←m ξ+(1−m) θ.\xi\leftarrow m\,\xi+(1-m)\,\theta .

为什么「不用负样本」不会立刻崩塌,以及为什么这可能不是全部答案

直觉上的担忧:如果只有「拉近」这一条力,网络可以把所有表示都映射到同一个常数向量——这样损失直接为 0,表示完全无用。这个现象叫表示崩塌(collapse)。

BYOL 靠什么避免崩塌(原文给出的机制,属于正文的假说而不是摘要级结论,引用时须明确):

  1. 预测器 qθq_\theta:在线分支多一层 MLP。两个分支的函数形式不对称,因此"输出恒等式"不是最优点。
  2. 停止梯度 + 动量目标网络:目标分支不接收梯度、且更新缓慢,它扮演了「稳定的移动靶」,使在线网络无法通过同时修改两侧来作弊。
  3. BatchNorm 的存在:有研究指出 BN 对防止崩塌有实质贡献(它的批统计阻止了所有样本收敛到同一常数)。

后续的理论工作给出了不同的解释(例如把这类方法理解为「隐式地做了特征去相关」或「等价于谱方法」),说明「为什么不用负样本也能work」并没有一个被普遍接受的单一解释。这是本教程必须明确区分的一类情况:观测到的现象(能稳定训练且效果好)与机制解释(为什么)之间存在差距。

实践上的结论:BYOL / SimSiam 一类方法可以省掉负样本与大 batch,对显存友好;但它们对预测器结构、增强强度、权重衰减更敏感,调参空间小、复现难度更高。工程选型时,团队熟悉的路线往往比"理论上更优雅"的路线更可靠。

DINO:自蒸馏 + 防崩塌的两个显式手段

DINO(2021,arXiv:2104.14294)把自蒸馏从「回归 MSE」换成「分类式交叉熵」,并显式加了两把"防崩塌"手段:

结构:student 与 teacher 共享架构(ViT / ResNet),teacher = student 的动量平均
输入:多裁剪(multi-crop)——2 个全局视图 + 若干局部小视图
       student 吃全部视图,teacher 只吃全局视图("局部预测全局")
损失:H(teacher(global), student(crop)),对每个 (student, teacher) 视图对求交叉熵
防崩塌的两个手段:
1. centering(居中):teacher 输出的每个维度减去一个滑动平均的均值
   → 抑制某个维度长期占优
2. sharpening(锐化):teacher 输出除以一个较小的温度(softmax 温度低)
   → 避免所有维度趋于均匀(那也是一种退化)
   center 与 sharpen 必须同时使用:只用 centering 会导致输出均匀化(崩塌),
   只用 sharpening 会导致某几维主导(另一种崩塌)。

结果(摘要口径):DINO 表示在 k-NN 分类上达 78.3%、线性评估达 80.1%;注意力图自带显式的语义分割信息(这一现象在摘要中被明确报告)。这是「自监督学到的东西不只是分类特征,还包含对目标边界的理解」的一个著名证据。

例 3.6.3 · 动量目标网络:为什么不能直接用同一组参数

设在线网络参数 θ\theta、目标网络 ξ\xi。如果直接用同一组参数(ξ=θ\xi=\theta,即没有动量、没有 stop-gradient),损失为 L=∥qθ(gθ(x1))−gθ(x2)∥2\mathcal L=\lVert q_\theta(g_\theta(x_1))-g_\theta(x_2)\rVert^2。说明这个损失为什么存在平凡的崩塌解,以及动量 + stop-gradient 如何消除它。

解

平凡解的存在性:令 gθg_\theta 输出恒为常数向量 c\boldsymbol c(即对所有输入 xx 都有 gθ(x)=cg_\theta(x)=\boldsymbol c),并令预测器 qθ(c)=cq_\theta(\boldsymbol c)=\boldsymbol c。则

L=∥c−c∥2=0.\mathcal L=\lVert \boldsymbol c-\boldsymbol c\rVert^2=0 .

这是全局最小值,而且与输入无关——网络只要学会"什么都输出同一个东西"就完成任务,表示完全无用。这就是崩塌。

动量 + stop-gradient 为什么消除它:

  1. stop-gradient 让 gξ(x2)g_\xi(x_2) 在反传中是一个常数(不接收 θ\theta 的梯度)。于是优化目标变成「让 qθ(gθ(x1))q_\theta(g_\theta(x_1)) 去匹配一个当前被冻结的目标值」——网络不能通过同时改变两侧来作弊达到 0 损失。
  2. 动量更新(ξ←mξ+(1−m)θ\xi\leftarrow m\xi+(1-m)\theta,mm 接近 1)让目标网络变化很慢:它提供的是「历史上的一致表示」这一稳定信号。在线网络必须持续产出与这个慢变目标一致的表示,而崩塌解需要两侧同时塌陷才成立,慢变目标使这一同步过程无法完成——目标网络总是"落后"于崩塌的尝试。
  3. 不对称结构(预测器):qθq_\theta 只存在于在线分支,因此两侧不是同一函数,"输出恒等式 + 同一函数"这条最省力的路径被切断。

但要如实说明:以上是机制解释的要点,不同论文对哪一项起决定作用存在分歧(有的工作认为 BN 是关键,有的强调预测器)。结论层面可确定的是:这套组合在实践中能稳定训练,且下游性能良好;机制层面尚未有被普遍接受的单一解释。■\blacksquare

∎

3.6.5 小数据场景的实操清单

小数据视觉项目的决策顺序(按顺序执行,不要跳)
第 0 步:先做基线,不要上复杂度
  - 用最简单的方案(预训练骨干 + 冻结 + 线性头)跑出一个验证指标
  - 记录这个数字,之后所有改动都与它比较(没有基线就没有"提升")
第 1 步:数据层面(收益最大、成本最低)
  - 检查标签质量:小数据下标签噪声的伤害远大于数据量不足
  - 合理增强:随机裁剪 + 水平翻转 + 颜色抖动 + RandAugment(注意:翻转可能不适用于垂直语义的任务,
    如"上下"有意义的医学影像或字符识别)
  - 分层划分训练/验证:确保每个类别在各划分中比例一致,避免验证集分布偏移
  - 若数据极少:考虑 k 折交叉验证,而不是单一划分(避免"验证集选型"带来的乐观偏差)
第 2 步:预训练权重(第二大的收益来源)
  - 优先顺序:与目标域接近的自监督骨干(DINOv2 / MAE 系)> CLIP 系(若涉及图文)> ImageNet 监督骨干
  - 对齐预处理(分辨率、归一化统计、通道顺序)
  - 记录骨干的来源与版本(可复现性)
第 3 步:训练策略
  - 先冻结骨干只训头 → 观察验证集 → 再考虑解冻后段
  - 学习率:头 1e-3、骨干 1e-4 起步;配合余弦退火 + warmup
  - 早停:以验证指标为准;保存最优权重而非最后一轮
  - 小数据下优先用 BatchNorm-free 骨干或调小 batch 时改 GroupNorm([3.3.3](sec33.md#sec-3.3.3))
  - 类别不平衡:用加权采样或 focal loss,不要用"准确率"当唯一指标
第 4 步:只在必要时才加复杂度
  - 加模块 / 改结构 / 自监督预训练 —— 每一项都需要用第 0 步的基线来证明收益
  - 每次只改一个变量(否则无法定位是哪个改动在起作用)
第 5 步:诚实评估
  - 分群指标([3.9 节](sec39.md)):检查不同子群体的表现差异,而不是只看总体平均
  - 报告多次运行的均值与方差(小数据下随机性极大)
  - 明确"没做什么"(未调参、未做数据清洗等),避免过度声称
本节的后半部分常见误解
  1. 「自监督一定优于监督预训练」:条件性结论。自监督的优势在标签稀缺与跨域通用性;在有充足同域标签时,监督预训练仍然很有竞争力。此外自监督骨干的下游性能对微调配方更敏感(因为它的表示没有对齐任何标签体系)。
  2. 「对比学习必须用大 batch」:SimCLR 需要,MoCo 用队列解耦了 batch 与负样本规模,BYOL / SimSiam 甚至不需要负样本。所以「大 batch 是硬约束」不成立——但大 batch + 强增强 + 长训练确实是 SimCLR 路线的主结果配置。
  3. 「BYOL 能 work 是因为某个 X」:要区分现象与机制。论文报告了结果并给出机制假说,但「为什么不用负样本也不崩塌」在文献中存在多种解释且尚无共识。引用时不要把它写成已确立的定理。
  4. 「投影头没用,直接在主表示上算损失就行」:SimCLR 明确报告投影头对下游线性评估有显著影响,且下游应使用投影前的表示。照搬实现时这一点常被漏掉。
  5. 「自监督预训练可以不做增强」:增强是自监督信号的唯一来源——没有「什么是同一张图的合理变换」这一假设,就没有正样本对。增强策略决定了模型学到什么不变性(例如不做颜色抖动,模型可能把颜色当作主要判别依据)。
  6. 「迁移学习不收敛就是数据问题」:先检查三件事——预处理是否与骨干匹配、学习率是否过大(骨干被破坏)、warmup 是否足够。这三条覆盖了大多数"微调不收敛"的情形。
即时自测 · 3.6

Q1 用小数据做图像分类,为什么「先冻结骨干只训头」比「一上来全网络微调」更稳?给出参数量的量级对比思路。

Q2 写出 InfoNCE 损失,并说明它在形式上等价于什么任务。τ\tau 的作用是什么?

Q3 SimCLR 与 MoCo 在「负样本来源」上的区别是什么?MoCo 为什么要用动量编码器?

Q4 BYOL 不用负样本,为什么不会立刻崩塌?请分别说出「可观测的现象」与「存在争议的机制解释」。

Q5 目标域数据分布与源域差异大(如自然图像 → 医学影像),除了微调还有哪些低成本手段?

参考要点

Q1 因为随机初始化的头会产生大而嘈杂的梯度,直接全网络微调会破坏骨干中已经学好的通用浅层特征。只训头把可训练参数压到 10410^4 量级(vs 骨干的 10710^7 量级,相差约 600600 倍),梯度只作用在小头上,骨干特征保持完整;等头学会读特征后,再用小学习率逐步解冻。这也是「两阶段训练」的标准做法。

Q2 L=−12N∑ilog⁡exp⁡(si,j(i))∑k≠iexp⁡(sik)\mathcal L=-\frac{1}{2N}\sum_i\log\frac{\exp(s_{i,j(i)})}{\sum_{k\neq i}\exp(s_{ik})},其中 sik=cos⁡(zi,zk)/τs_{ik}=\cos(\boldsymbol z_i,\boldsymbol z_k)/\tau。它与 softmax 交叉熵同形:把「找出 ii 的正样本」看作一个 2N−12N-1 类分类问题。τ\tau 控制 softmax 分布的锐度:τ\tau 小 → 分布尖锐、逼模型强分离、梯度大;τ\tau 大 → 分布平坦、梯度弱、判别性差。

Q3 SimCLR 的负样本来自当前 batch(2N−22N-2 个),因此负样本数量与 batch 大小绑定,需要大显存;MoCo 用队列跨 batch 累积负样本,与 batch 解耦。MoCo 用动量编码器的原因是:如果队列里的表示由快速变化的编码器产生,那么队列内新旧特征来自不同的映射,与当前特征比较时不可比(特征分布漂移)——动量更新让 key encoder 缓慢演化,保证队列内特征的一致性。

Q4 现象:只用「拉近」的损失存在平凡崩塌解(输出常数向量使损失为 0);BYOL / SimSiam / DINO 一类结构在实践中能稳定训练并取得良好下游性能。机制解释:候选包括预测器带来的不对称、stop-gradient 切断作弊路径、动量目标网络的慢变稳定信号、BatchNorm 的批统计约束;文献对哪一项起决定作用存在分歧,尚无共识,引用时不能写成已确立的定理。

Q5 ① 重估 BN / LN 的运行统计量:冻结全部参数,只用目标域无标签数据前向,重新累积统计量——最便宜且常用;② 测试时自适应:推理时动态调整归一化;③ 目标域自监督预训练(MAE / 对比学习)后再微调;④ 领域随机化增强(模拟目标域的成像特性,如噪声、模糊、对比度变化)。这四条都不需要目标域标签。

延伸阅读
  • SimCLR:Chen et al., A Simple Framework for Contrastive Learning of Visual Representations(2020,arXiv:2002.05709)。
  • MoCo:He et al., Momentum Contrast for Unsupervised Visual Representation Learning(2019,arXiv:1911.05722)。
  • InfoNCE 出处:van den Oord, Li & Vinyals, Representation Learning with Contrastive Predictive Coding(2018,arXiv:1807.03748)。
  • BYOL:Grill et al., Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning(2020,arXiv:2006.07733);SimSiam:Chen & He, Exploring Simple Siamese Representation Learning(2020,arXiv:2011.10566);对「不崩塌」的分析可继续读 Understanding Dimensional Collapse in Contrastive Self-supervised Learning(2021,arXiv:2110.09348)。
  • DINO:Caron et al., Emerging Properties in Self-Supervised Vision Transformers(2021,arXiv:2104.14294)。
  • CLIP:Radford et al., Learning Transferable Visual Models From Natural Language Supervision(2021,arXiv:2103.00020)。
  • 视觉自监督综述与基准:DINOv2: Learning Robust Visual Features without Supervision(2023,arXiv:2304.07193)——含无需微调的密集预测基准。

本节小结:迁移学习是工程默认起点——先冻结、再逐步解冻,骨干学习率比头小一个量级,预处理必须与骨干匹配;领域偏移下最便宜的手段是重估归一化统计量。自监督预训练把「监督信号」从标签换成数据自身的结构:InfoNCE(推导见 3.6.3)等价于在表示空间做 2N−12N-1 类分类,负样本规模与温度是它的两个关键旋钮;MoCo 用队列解耦 batch、BYOL / DINO 用预测器与动量目标去掉负样本(机制解释尚有争议);MAE 一类掩码建模则从「重建」路线进入自监督。下一节把骨干接到具体的视觉任务上:检测、分割,以及把分割变成「提示式」交互的视觉基础模型。