逐层、逐模块:兼顾两者才能最优地对 ViT 进行分布外探测 Layer by layer, module by module: Choose both for optimal OOD probing of ViT
系统揭示 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 没有残差聚合,对深度更敏感。
实验结果
本文有四组核心发现,全部基于 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 更稳妥的选择。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| 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 经验的研究者来说复现中等难度,对新手来说较难。
论文图表
12 列(11 个数据集 + 表头)的单行表格,每个单元格是 3 次不同种子运行的均值 ± 标准差。数据:Cifar10 99.02±0.02、Cifar100 92.74±0.05、Contrast 97.23±0.18、Gaussian Noise 87.14±1.16、Motion Blur 94.67±0.14、Snow 95.42±0.13、Speckle Noise 89.58±0.43、Clipart 78.50±0.49、Sketch 71.30±0.26、Flowers102 99.15±0.05、Pets 94.57±0.29。
这张表的数值范围(99.15% 到 71.30%)被用作 Fig. 1 中数据集按分布偏移强度排序的依据,是连接微调性能和分布偏移的核心桥梁。
Python 代码片段:导入 my_lib.ViT,实例化 ViT(name=“base”, n_classes=10),调用 print(model)。对应的 print 输出展示了 Transformer 类的完整嵌套结构:Embedding(含 PatchImages 卷积)、12 个 TransformerBlock(每个含 attn_norm/SelfAttention/ffn_norm/FeedForward)、Output(含 ClassificationLayer)。关键参数:Conv2d(3, 768, kernel_size=16, stride=16),qkv_mat 的 out_features=2304=3×768,fc1 的 out_features=3072=4×768,fc2 的 out_features=768。
代码级的实现细节,验证了作者确实跟踪到了 FFN 内部的 Act 位置(即 ffn.fc1 → GELU → ffn.fc2),让读者确信模块级分析的可行性。