← 返回 2026-03-09

逐层、逐模块:兼顾两者才能最优地对 ViT 进行分布外探测 Layer by layer, module by module: Choose both for optimal OOD probing of ViT

Ambroise Odonnat, Vasilii Feofanov, Laetitia Chapel, Romain Tavenard, Ievgen Redko 📅 2026-03-05 👍 0 2026-07-13 08:35
分布外泛化 模型可解释性 线性探测 表征学习 视觉 Transformer 迁移学习

系统揭示 ViT 在 OOD 探测中应选 FFN 激活层而非块输出。

前置知识

Vision Transformer (ViT)

Vision Transformer 是 Dosovitskiy 等人在 2021 年提出的将 Transformer 架构应用于图像分类的模型。它把输入图像切成固定大小(典型为 $16 \times 16$)的方块 patch,把每个 patch 线性投影为一个 token,再加上一维可学习的分类 token (CLS) 和位置编码后送入标准的 Transformer 编码器。每个编码器块由多头自注意力 (MHA)、前馈网络 (FFN) 和残差连接组成,并通过两个层归一化 (LayerNorm) 控制信号尺度。ViT 通常先在大规模数据(如 ImageNet-21k)上预训练,再通过微调或冻结特征抽取的方式适配下游任务。

本文研究对象就是 ViT 的内部表征,全文的实验都建立在对一个 86M 参数的 ViT-Base 模型进行逐层、逐模块探测之上。如果不熟悉 ViT 的内部结构(特别是 FFN、LayerNorm、注意力等模块),就无法理解作者提出的“该探测哪个模块”的精细分析框架。

线性探测 (Linear Probing)

线性探测是一种评估预训练表征质量的常用方法:在冻结的预训练编码器之上只训练一个线性分类器(本文用 L-BFGS 求解的逻辑回归),通过测试准确率来衡量某一层表征的可分性强弱。给定 CLS token 的池化向量 $h \in \mathbb{R}^d$,分类器最小化 $\mathcal{L} = -\sum_i \log p(y_i | W^\top h_i + b)$。线性探测的优势在于它把“表征质量”和“优化器/正则化选择”解耦,因此不同层之间的性能差异可以直接归因于表征本身的优劣。

全文所有结论都基于线性探测这一协议。无论是“中间层比最终层好”还是“Act 模块比 RC2 好”,都是线性探测实验得出的。理解这一协议对正确解读作者的结论至关重要。

分布外 (Out-of-Distribution, OOD) 泛化

分布外泛化指模型在测试数据分布与训练/预训练分布不同时的鲁棒性。这里的“分布”可能涉及输入特征的协变量偏移 (covariate shift)、标签偏移 (label shift) 或概念偏移 (concept shift)。在视觉任务中,常见的 OOD 场景包括图像损坏(如噪声、模糊、对比度变化)、跨域迁移(如草图、剪贴画)以及类别集合变化等。本文使用 Cifar10-C 的 5 种损坏、DomainNet 的 Clipart/Sketch 子集作为强 OOD 数据,与 ImageNet 预训练数据差异显著。

本文的核心论点是:探测策略应当取决于分布偏移的强度——强 OOD 下中间层最优,弱 OOD(接近 ID)下最终层最优。不理解 OOD 与 ID 的区别,就无法理解作者提出的两条实践建议。

Transformer 块内部组件 (Module)

一个标准的 Transformer 编码器块按顺序包含 8 个可追踪的“操作点”:LN1(注意力前的 LayerNorm)、MHA(多头自注意力输出)、RC1(注意力残差和)、LN2(FFN 前的 LayerNorm)、FC1(FFN 第一层把维度从 $d$ 升到 $4d$)、Act(GeLU 激活)、FC2(FFN 第二层把维度降回 $d$)、RC2(FFN 残差和,即块的最终输出)。其中 MHA、FC1、FC2 是带可学习参数的模块,LN1/LN2 是归一化,RC1/RC2 是残差相加,Act 是非线性激活函数。传统做法通常探测 RC2(块的最终输出),本文则精细比较了这 8 个操作点的探测性能。

本文最关键的贡献是“模块级别”的分析,即不止看哪一层,而要看在同一层内的哪个组件之后做探测。如果不清楚这些模块的功能和位置,就无法理解为什么 Act 和 FC2 表现出截然相反的特性。

研究动机

现有的 ViT 线性探测实践存在一个被广泛忽视的偏差:几乎所有研究(DINOv2、CLIP、AIM 等)都默认探测 transformer 块的最终输出(RC2),即认为“层越深、越接近分类头,表征越好”。然而近年有研究(Skean 等 2025)发现,LLM 的中间层反而比最终层表现更好,但该结论在视觉模态上似乎并不成立——Skean 等人仅在 ImageNet(属于 ViT 预训练数据范围内)上做了实验,因此是 in-distribution (ID) 设定。更令人困惑的是,Bolya 等 2025 的 Perception Encoder 和 Uselis & Oh 2025 的 Intermediate Layer Classifiers 都给出了相反的结论,使整个领域莫衷一是。根本问题在于:我们既不知道 ViT 中间层是否真的比最终层好,也不知道“为什么”会这样,更不知道在 transformer 块内部到底该探测哪个具体组件才是最优的。

本文的目标是本文旨在系统回答三个问题:(1) ViT 的中间层和最终层,到底哪个更适合做线性探测?这个答案是否会随着预训练-下游数据之间的分布偏移强度而变化?(2) 如果中间层更好,那么在 transformer 块的内部,哪个具体的“模块位置”(LN1、MHA、RC1、LN2、FC1、Act、FC2、RC2)最适合作为探测点?(3) 这种层-模块的联合选择,能否给出一个统一、可解释的实践指南,使研究者在无法事先判断 ID/OOD 设定时也能做出稳妥的选择。

与已有工作不同的是,现有研究的切入点存在三个空白:第一,几乎所有先前工作只在 ID 设定下比较层间表现,没有把分布偏移作为独立变量来分析;第二,模块级别的分析在视觉 Transformer 领域完全空白,先前工作只对 LLM 做过“中间层更好”的观察,而 ViT 的块内结构(特别是 FFN 的两段式投影)有自己独特的信号传播规律;第三,先前工作要么只看层(忽略了模块),要么只看到 RC2(忽略了模块),没有把“层 × 模块”联合起来做二维分析。本文的核心切入角度就是把“层”和“模块”作为两个独立的、互补的设计维度进行联合扫描,并在 11 个差异巨大的分类基准上评估,从而得出既实用又可解释的结论。

核心方法

本文采用经典的“线性探测 + 多层多模块扫描”实验范式来回答上述问题。直觉上,如果一个表征足够“好”,那么仅用一个线性分类器就能在下游任务上取得高精度;不同层、不同模块的表征质量差异可以直接通过线性探测准确率来度量。技术上,作者选用一个 86M 参数的 ViT-Base 模型(在 ImageNet-21k 上预训练),把它沿两个维度“切开展开”:在层维度上,遍历所有 12 个 transformer 块;在模块维度上,在每个块内跟踪 LN1、MHA、RC1、LN2、FC1、Act、FC2、RC2 共 8 个操作点。对每个 (层, 模块) 组合,作者提取 CLS token 的池化向量,训练一个 L-BFGS 逻辑回归分类器,并在 11 个分类基准(Cifar10/100、Cifar10-C 的 5 种损坏、DomainNet 的 Clipart/Sketch、Flowers102、Pets)上报告测试准确率。最终把数据集按“分布偏移强度”排序(以“完全微调”准确率为代理指标),观察层/模块表现随偏移强度的变化趋势,从而把“现象”和“原因”联系起来。

本文的核心创新有两点。第一,把“分布偏移强度”作为显式变量引入到层选择的讨论中,揭示出“层性能退化”不是模态或预训练目标的产物,而是分布偏移的产物——这从根本上修正了 Skean 等人“自回归是驱动因素”的结论。第二,把分析粒度从“层”下沉到“模块”,精细比较了 8 个内部操作点的探测性能,并发现 FFN 中的 GeLU 激活(Act)在强 OOD 下最优、LN2 在弱 OOD 下最优,而传统默认的 RC2 在大多数数据集上都是次优的。这与最近“transformer 块中各模块对微调贡献不均”的研究(Odonnat 等 2026、Zhao 等 2024)形成呼应,从“微调视角”扩展到“探测视角”,得出“块内最优探测点 ≠ 块输出”这一反直觉但稳健的实践建议。

方法步骤详情

方法分为四步。第一步是模型与数据准备:选用 ViT-Base(86M 参数,在 ImageNet-21k 上预训练),输入图像 resize 到 $224 \times 224$,按 Dosovitskiy 等人 2021 和 Kolesnikov 等人 2020 的协议做预处理(训练用随机裁剪 + 水平翻转,测试用中心裁剪,按 ImageNet 均值 $[0.485, 0.456, 0.406]$ / 标准差 $[0.229, 0.224, 0.225]$ 归一化)。第二步是“逐层逐模块”特征提取:把模型前向计算展开,在每个 transformer 块的 8 个操作点(LN1、MHA、RC1、LN2、FC1、Act、FC2、RC2)之后提取 CLS token 的特征向量;对 12 个块 × 8 个模块共得到 96 个表征。第三步是线性探测:对每个表征,在下游训练集上拟合一个带 L-BFGS 求解器的多分类逻辑回归,在独立测试集上报告 top-1 准确率;为保证公平,所有实验使用相同的随机种子和数据划分。第四步是对照分析:在 ID 设定下(如下游数据与预训练分布接近)观察哪个层最好;在 OOD 设定下观察哪个模块最好;并以“完全微调”准确率作为分布偏移强度的代理指标,把数据集从弱偏移(Flowers102,99.15%)到强偏移(Sketch,71.30%)排序,观察层/模块表现如何随偏移变化。

技术新颖性

本文的技术新颖性主要体现在分析框架上,而非算法创新。具体而言:(1) 提出了“层 × 模块”二维扫描框架,把传统线性探测从 12 个点扩展到 96 个点,提供了远超现有研究的细粒度视图。(2) 引入“完全微调准确率”作为分布偏移的代理指标,避免了依赖难以直接测量的“分布距离”度量,使结论具有可操作性。(3) 给出了基于“Act / FC2 维度差”的信号传播解释:FC1 把 token 维度从 $d$ 提升到 $4d$、Act 过滤噪声、FC2 又压回 $d$——这意味着在更高维空间运行的 FC1 和 Act 有利于特征解缠,而 FC2 的压缩会损害线性可分性;同时借鉴 Geva 等 2021 的“FFN 是 key-value 记忆”视角,把 FC1/Act 解释为捕获语义、FC2 解释为对 token 的分布输出,从而为模块间性能差异提供了机制层面的解释。(4) 把“块内最优探测点”这一反直觉发现与“残差流信息聚合”理论联系起来——残差连接 RC1、RC2 累积了历史信息,因此性能曲线更平坦;而 Act/FC2 没有残差聚合,对深度更敏感。

Transformer block. 每个 transformer 块的内部结构图。
Fig. 2: Transformer block. 每个 transformer 块的内部结构图。

实验结果

本文有四组核心发现,全部基于 96 个 (层, 模块) 组合 × 11 个数据集的扫描结果。第一组发现是关于“分布偏移对层性能的影响”:如图 1 所示,在弱 OOD(如 Flowers102,分布偏移小、完全微调准确率 99.15%)上,最终层表现最好;在强 OOD(如 Speckle Noise,89.58%;Sketch,71.30%)上,最终层性能急剧下降,而中间层保持稳健。这说明 Skean 等人“中间层更好只在自回归模型中成立”的结论是错的——真正驱动因素是分布偏移强度,而非预训练目标。第二组发现是关于“模块间的性能差异”:表 1 显示,在 12 个 (数据集, 模块) 组合中,Act(FFN 中的 GeLU 激活输出)的胜率最高,而 FC2(FFN 第二层投影输出)的胜率最低(在 10/12 个数据集上垫底)。例如在 Cifar10 上,FC1=92.28、RC2=92.07、Act=85.30、FC2=89.98;在 Sketch(最强 OOD)上,Act=34.90、RC2=32.99、FC2=28.45,差距尤为显著。第三组发现是关于“模块-深度联合表现”:图 3 表明 Act 在中间层最优、在最终层急剧下降;而 LN2 和 RC2(带残差流的模块)表现更稳定、更平坦;FC2 在所有深度上都最差。这与“残差流累积信息”、“FFN 在更高维空间运行”的解释一致。第四组发现是关于“标准探测的次优性”:RC2(传统默认)在 11 个数据集中只有 1 个(Flowers102)是最优的,在其余 10 个数据集上都被 Act 或 LN2 超过,差距在强 OOD 数据集上可达 5-10 个百分点。综合而言,作者给出两条实践建议:(a) 强 OOD 下探测中间层的 Act 或 FC1 输入;(b) 弱 OOD 或偏移难以判断时,探测 LN2 是比 RC2 更稳妥的选择。

Module by module. For each module, we report the best linear probing accuracy over the layers.
Table 1: Module by module. For each module, we report the best linear probing accuracy over the layers.
Finetuning hyperparameters. 微调超参数表。
Table 2: Finetuning hyperparameters. 微调超参数表。
Layer by layer. Evolution of the linear probing performance across each layer of an 86M ViT pretrained on ImageNet.
Fig. 1: Layer by layer. Evolution of the linear probing performance across each layer of an 86M ViT pretrained on ImageNet.
Layer by layer, module by module. Evolution of the linear probing performance of transformer modules across the layers of an 86M ViT pretrained on ImageNet.
Fig. 3: Layer by layer, module by module. Evolution of the linear probing performance of transformer modules across the layers of an 86M ViT pretrained on ImageNet.
Layer by layer. 在所有 11 个数据集上的 Fig. 1 扩展版本。
Fig. 5: Layer by layer. 在所有 11 个数据集上的 Fig. 1 扩展版本。
Layer by layer, module by module. 在所有 11 个数据集上的 Fig. 3 扩展版本。
Fig. 6: Layer by layer, module by module. 在所有 11 个数据集上的 Fig. 3 扩展版本。
查看结构化数据
任务指标本文基线提升
Cifar10 线性探测(最佳模块) top-1 准确率 (%) 92.28 (FC1) 92.07 (标准 RC2) +0.21
Cifar100 线性探测(最佳模块) top-1 准确率 (%) 69.97 (LN2) 69.63 (标准 RC2) +0.34
Cifar10-C Contrast 线性探测(最佳模块) top-1 准确率 (%) 80.20 (Act) 77.95 (标准 RC2) +2.25
Cifar10-C Gaussian Noise 线性探测(最佳模块) top-1 准确率 (%) 61.85 (Act) 58.20 (标准 RC2) +3.65
Cifar10-C Motion Blur 线性探测(最佳模块) top-1 准确率 (%) 71.15 (Act) 67.75 (标准 RC2) +3.40
Cifar10-C Snow 线性探测(最佳模块) top-1 准确率 (%) 69.30 (Act) 67.70 (标准 RC2) +1.60
Cifar10-C Speckle Noise 线性探测(最佳模块) top-1 准确率 (%) 63.35 (Act) 59.80 (标准 RC2) +3.55
DomainNet Clipart 线性探测(最佳模块) top-1 准确率 (%) 49.34 (Act) 48.33 (标准 RC2) +1.01
DomainNet Sketch 线性探测(最佳模块) top-1 准确率 (%) 34.90 (Act) 32.99 (标准 RC2) +1.91
Flowers102 线性探测(最佳模块) top-1 准确率 (%) 96.62 (LN2/RC2 并列) 96.62 (标准 RC2) 0.00 (弱偏移下模块选择不敏感)
Pets 线性探测(最佳模块) top-1 准确率 (%) 89.51 (LN2) 89.18 (标准 RC2) +0.33
全微调准确率(分布偏移强度的代理指标) top-1 准确率 (%) Flowers102 99.15 / Sketch 71.30(跨度 27.85 个百分点) ImageNet 全微调约 85% 作为参考基线 提供了从弱偏移到强偏移的连续排序

局限与改进

作者明确承认的局限性包括:(1) 实验只使用单一模型(86M 参数的 ViT-Base),没有验证结论在更大模型(ViT-Large、ViT-Huge)或不同架构(Swin、ConvNeXt)上的可推广性;(2) 仅在 ImageNet-21k 预训练的 ViT 上做了实验,没有对比 DINOv2、CLIP、MAE 等不同自监督/监督预训练目标下的行为差异;(3) 把“完全微调准确率”作为分布偏移的代理指标,这虽然方便,但并非真正的分布距离度量(如 MMD、FID),可能遗漏某些偏移类型;(4) 实验只覆盖图像分类任务,没有验证本文结论在目标检测、语义分割等其他任务上是否成立。我自己观察到的额外局限包括:(a) 11 个基准虽然多样,但缺少医学、遥感、自动驾驶等真实 OOD 场景;(b) 线性探测协议虽然标准化,但实践中常用的还有 k-NN、Mahalanobis OOD 检测等,本文结论是否适用未经验证;(c) Act 在某些 ID 数据集(如 Cifar10=85.30、Flowers102=91.64、Pets=83.46)上反而比 RC2 差很多,这意味着选错模块可能带来较大损失,论文没有给出“如何判断该用哪个模块”的自动判据。

独立分析的弱点

独立分析本文的弱点主要有三点。第一,实验的“模型-预训练”组合单一,结论的可推广性存疑:86M ViT 在 ImageNet-21k 上预训练是 DINOv2 时代之前的标准配置,但 2024-2026 年的前沿模型(如 DINOv3、Perception Encoder)规模更大、训练数据更多、预训练目标也不同,“中间层优于最终层”的临界点是否会变化、Act 是否仍是最佳模块都需要重新验证;改进方向是在 3-5 个不同规模/不同预训练目标的 ViT 上重复实验,并报告均值±方差。第二,“完全微调准确率作为偏移代理”虽然操作上方便,但本文承认它无法刻画所有类型的分布偏移;改进方向是引入 Fréchet Inception Distance (FID)、Kullback-Leibler 散度等显式分布距离度量,把“分布偏移强度”这一变量从离散排序变成连续度量,从而能拟合“层性能 vs 偏移强度”曲线。第三,Act 在 ID 数据集上明显劣于 RC2(Cifar10 上 Act=85.30 vs RC2=92.07,差距 6.77 个百分点),这意味着“用 Act 探测”是有条件的;改进方向是训练一个轻量级的偏移检测器(基于最大 softmax 概率、能量分数或梯度范数),在推理时自动选择模块——本文只给出了静态的“强 OOD 用 Act、弱 OOD 用 LN2”二元建议,没有给出动态判据。

未来方向

作者在第 5 节“讨论”中提出了三个未来方向:(1) 用信息论、几何、不变性度量在模块级别扩展 Skean 等人 2025 的分析,揭示 Act/FC2 与 LN2/RC2 在互信息、表征半径、不变性子空间上的差异;(2) 探索自动化的层-模块选择策略,例如基于无监督准确率估计(MANO、Xie 等 2024/2025)在推理时动态选择最佳探测点。基于本文的成果还可以延伸出几个方向:(a) 把“逐层逐模块探测”框架扩展到其他模态的 Transformer(BERT、Whisper、TimeGPT),验证“中间层 + 特定模块”的组合是否在不同模态下都成立;(b) 研究模块级探测对 few-shot、prompt tuning、LoRA 等参数高效微调方法的影响——既然不同模块对偏移的鲁棒性不同,那么 adapter 应该插入到 Act/FC1 而不是 RC2 之后;(c) 探索模块级探测在 OOD 检测(区分 ID/OOD 样本本身)中的应用——如果 Act 在 ID 和 OOD 上的表征差异比 RC2 更大,那么基于 Act 表征训练的能量分数/Mahalanobis 距离可能比基于 RC2 的更鲁棒;(d) 把研究从 ViT 扩展到混合架构(如 Swin Transformer 的窗口注意力、ConvNeXt 的卷积块),验证结论是否依赖纯注意力结构。

复现评估

复现评估总体上良好但存在一些门槛。优点:(1) 使用的 ViT-Base 86M 是公开的标准化架构,可以直接用 HuggingFace Transformers (2025) 加载;(2) 数据集都是公开基准(Cifar10/100 来自 torchvision,Cifar10-C 来自 Hendrycks & Dietterich 2019,DomainNet 来自 Peng 等 2019,Flowers102 来自 torchvision,Pets 来自 torchvision),无需付费;(3) 预处理协议完全遵循 Dosovitskiy 等 2021 和 Kolesnikov 等 2020 的标准做法;(4) 训练协议在表 2 中详尽列出,包括优化器(SGD,动量 0.9,无权重衰减,余弦学习率衰减)、批量大小(512)、梯度裁剪(norm 1)、每个数据集的学习率网格(4 个候选值)和训练步数(4k-20k);(5) 报告了 3 个不同种子的均值和标准差。缺点:(1) 作者没有声明开源代码仓库,附录 A 仅给出 ViT-Base 架构的代码片段,且特意把包名改成了“my_lib”以保持匿名,说明截至投稿时代码未公开,复现需要自行实现;(2) 没有明确说明预训练权重的具体来源(是 ImageNet-21k 上 from scratch 还是某个已发布的 checkpoint),这会影响复现的精确度;(3) 完全微调每个数据集需要 3-4 个学习率 × 3 个种子 = 9-12 次训练,加上 96 个 (层, 模块) 组合的线性探测 × 11 个数据集 = 1056 次训练,总计算量较大,按 SGD + batch size 512 估算,单次实验在单张 A100 上需要数小时到数天;(4) 部分数据集(Cifar10-C 的某些损坏类型)需要从原作者网站下载,DomainNet 的下载也需要额外步骤。总体而言,对有 PyTorch 经验的研究者来说复现中等难度,对新手来说较难。