Browse this library

Chinese source article

4.1.1 · 经典 TTT 与自监督适应

从 Sun 2020 的 Y 形网络到 TENT, MEMO, TTT++ 与 TTT-MAE: 每种方法在推理阶段更新哪部分参数, 用什么无标签信号, 在 CIFAR-10-C 和 ImageNet-C 上换来多少误差下降, 又在什么条件下失效.

View original Markdown ↗

1. TTT 的出发点与 Sun 2020 的 Y 形网络

问题: 训练分布之外的一张图. 一个在 CIFAR-10 上训到 91% 精度的分类器, 拿到一张加了高斯噪声的飞机图. 噪声没有改变「这是一架飞机」, 但改变了第一层卷积看到的像素统计, 浅层特征偏离了训练时见过的范围, 后面的分类头接收到的是一个它没见过的输入. 对这种情况, 常规做法有两条: 训练阶段把可能的 corruption 都加进数据增强; 或者收集目标域数据做域自适应. 前者要预先猜中偏移类型, 后者要在部署前拿到一批目标域数据. TTT 的出发点是第三条路: 偏移已经体现在这张测试图本身, 那就让模型在给出预测之前, 先在这张图上学一下. 问题在于测试图没有标签, 能用来学习的只有图像自身能产生的监督信号. 本文围绕下面五个问题展开:

  1. 没有标签, 推理阶段用什么损失, 更新哪些参数?
  2. 无标签损失下降, 为什么主任务的误差也会下降, 什么时候不会?
  3. 一次只看一张图和一次看一个批, 方法上差在哪里?
  4. 训练阶段要不要为推理阶段的更新做准备?
  5. 这些更新的代价和失效方式是什么?

为了后文对照, 先约定记号. 测试输入为 xx, 主任务标签为 yy (推理阶段不可见). 网络参数分成三块: 共享特征提取器 θe\theta_e, 主任务头 θm\theta_m, 自监督头 θs\theta_s. 主任务损失记 lml_m, 自监督损失记 lsl_s.

结构. Sun, Wang, Liu, Miller, Efros & Hardt (2020) 把网络切成 Y 形. 底部是共享的前 κ\kappa 层 θe\theta_e, 在第 κ\kappa 层之后分叉: 一支是分类头 θm\theta_m, 一支是旋转预测头 θs\theta_s. CIFAR 实验用 ResNet-26, 分叉点放在第 2 组残差块之后; ImageNet 实验用 ResNet-18, 分叉点在第 3 组之后. 旋转预测是 Gidaris 等 (2018) 提出的自监督任务: 把图像旋转 0, 90, 180, 270 度之一, 让网络判断转了多少, 是一个 4 分类问题. 它的标签由图像自己生成, 推理阶段也能算.

训练阶段. 训练阶段同时优化两个损失, 共享层吃两份梯度:

min⁡θe,θm,θs1n∑i=1nlm(xi,yi;θm,θe)+ls(xi;θs,θe)(1)\min_{\theta_e, \theta_m, \theta_s} \frac{1}{n}\sum_{i=1}^{n} l_m(x_i, y_i; \theta_m, \theta_e) + l_s(x_i; \theta_s, \theta_e) \tag{1}

式 (1) 里 nn 是训练样本数. 论文把这一步叫联合训练 (joint training). 它本身就是一种多任务学习, 所以论文的对照组除了普通基线, 还有一个「只联合训练, 推理阶段不更新」的版本, 用来分离「多任务训练带来的鲁棒性」和「推理阶段更新带来的收益」.

推理阶段. 拿到测试图 xx 后, 只用自监督损失更新共享层:

min⁡θels(x;θs,θe)(2)\min_{\theta_e} l_s(x; \theta_s, \theta_e) \tag{2}

更新后的 θe\theta_e 记为 θe(x)\theta_e(x), 再用 θm\theta_m 和 θe(x)\theta_e(x) 对 xx 做分类. θs\theta_s 和 θm\theta_m 在推理阶段都不动. 一次适应所涉及的参数、样本和状态如下:

问题 Sun 2020 TTT
更新参数 共享层 θe\theta_e 接收旋转损失的梯度, 自监督头 θs\theta_s 只提供损失
损失样本 同一张测试图的 4 个旋转版本 (再加随机裁剪等增强) 组成一个批
状态生命周期 标准版: 每张图从训练好的 θe\theta_e 出发, 走 10 步 SGD, 预测完丢弃; 在线版: 每张图走 1 步, 从上一张图更新后的 θe(xt−1)\theta_e(x_{t-1}) 出发
历史信息 标准版不积累样本间更新; 在线版延续参数, 但不回看旧样本

标准版的超参数是学习率 0.001, 10 步 SGD, 不用动量和权重衰减. 论文把 BN 换成了 Group Normalization: 单张图的增强批太小, BN 统计量不可靠, 在线版在 BN 下会失败; 用 BN 的结果放在附录, 需要配合难例挖掘.

CIFAR-10-C 上的误差. CIFAR-10-C 是 Hendrycks & Dietterich (2019) 给 CIFAR-10 测试集加的 15 类 corruption, 每类 5 个严重等级. 下表的数字是论文 Table A2 第 5 级 15 类误差的平均值 (由原表逐类求平均得到):

方法 CIFAR-10-C 第 5 级平均误差 (%) 原始测试集误差 (%)
基线 (只训主任务) 34.6 8.9
联合训练 33.3 8.1
TTT (标准版) 31.0 7.9
TTT-Online 20.4 8.2

基线到联合训练的 1.3 个点来自训练阶段增加的自监督任务, 与推理阶段更新无关; 联合训练到标准 TTT 的 2.3 个点才对应单张图上的 10 步更新. 在线版把收益放大到 12.9 个点, 因为测试流来自同一种 corruption, 前面样本积累的更新也能服务后续样本, 相当于逐步完成无监督域自适应. 论文还把 TTT-Online 和需要提前拿到整个目标域的 UDA-SS 比较, 15 类里有 13 类 TTT-Online 更好. 原始测试集一列说明另一件事: 在没有偏移的数据上, TTT 不会把精度拉低 (7.9 和 8.2 都在联合训练 8.1 附近). ImageNet-C 上 (ResNet-18, 论文 Table A3, 精度), 以高斯噪声第 5 级为例: 基线 1.3%, 联合训练 2.1%, 标准 TTT 3.1%, TTT-Online 26.3%. 原始验证集上四者为 68.9, 69.1, 69.0, 68.8. 第 5 级高斯噪声几乎把基线打到随机水平, 单张图走 10 步只能挽回 1 个点, 积累了整条流的在线版挽回了 24 个点.

论文还测了两种自然偏移. 视频帧数据集 VID-Robust 上精度依次为 62.7, 63.5, 63.8, 64.3 (基线, 联合训练, TTT, TTT-Online); CIFAR-10.1 上误差为基线 17.4, 联合训练 16.7, TTT 15.9. 自然偏移上的收益比合成 corruption 小一个数量级.

1.1. 自监督梯度为什么能帮主任务

推理阶段只降了 lsl_s, 主任务 lml_m 凭什么也下降? Sun 等的定理 1 给出一个充分条件. 设 lml_m 和 lsl_s 对参数 θ\theta 都是凸的, β\beta-光滑, 梯度范数处处不超过 GG. 取步长 η=ϵ/(βG2)\eta = \epsilon / (\beta G^2), 若

⟨∇lm(x,y;θ),∇ls(x;θ)⟩>ϵ(3)\langle \nabla l_m(x, y; \theta), \nabla l_s(x; \theta) \rangle > \epsilon \tag{3}

则沿 −∇ls-\nabla l_s 走一步后 lm(x,y;θ(x))<lm(x,y;θ)l_m(x, y; \theta(x)) < l_m(x, y; \theta). 式 (3) 的含义很直接: 一阶近似下, lml_m 的变化量约为 −η⟨∇lm,∇ls⟩-\eta \langle \nabla l_m, \nabla l_s \rangle, 内积为正, 主任务损失就降. 光滑性和步长条件保证二阶项不会把一阶收益吃掉.

两层线性网络手算. 论文给了一个两层线性的例子, 这里把它算到数. 设输入 x∈R2x \in \mathbb{R}^2, 共享层是矩阵 AA, 主任务输出 y^=v⊤Ax\hat{y} = v^\top A x, 自监督输出 y^s=w⊤Ax\hat{y}_s = w^\top A x, 两个损失都用平方误差:

lm=12(y−v⊤Ax)2,ls=12(ys−w⊤Ax)2(4)l_m = \tfrac{1}{2}(y - v^\top A x)^2, \qquad l_s = \tfrac{1}{2}(y_s - w^\top A x)^2 \tag{4}

对 AA 求梯度. 记主任务残差 em=y−v⊤Axe_m = y - v^\top A x, 自监督残差 es=ys−w⊤Axe_s = y_s - w^\top A x, 得到

∇Alm=−em vx⊤,∇Als=−es wx⊤(5)\nabla_A l_m = -e_m\, v x^\top, \qquad \nabla_A l_s = -e_s\, w x^\top \tag{5}

两个梯度矩阵的 Frobenius 内积是

⟨∇Alm,∇Als⟩=emes (v⊤w) (x⊤x)(6)\langle \nabla_A l_m, \nabla_A l_s \rangle = e_m e_s\, (v^\top w)\, (x^\top x) \tag{6}

x⊤x>0x^\top x > 0 恒成立, 所以内积的符号由 emes(v⊤w)e_m e_s (v^\top w) 决定: 两个残差同号, 并且两个头的方向夹角小于 90 度 (v⊤w>0v^\top w > 0), 自监督更新就会帮主任务. 这和论文给出的条件一致. 代入数字. 取 x=(1,0)⊤x = (1, 0)^\top, A=IA = I, v=(1,0)⊤v = (1, 0)^\top, 主任务真值 y=2y = 2. 此时 v⊤Ax=1v^\top A x = 1, em=1e_m = 1, lm=0.5l_m = 0.5. 第一种情况, w=(1,1)⊤w = (1, 1)^\top, 自监督目标 ys=3y_s = 3. 则 w⊤Ax=1w^\top A x = 1, es=2e_s = 2, v⊤w=1v^\top w = 1, 式 (6) 为 1×2×1×1=2>01 \times 2 \times 1 \times 1 = 2 > 0. 取步长 η=0.1\eta = 0.1, 沿 −∇Als-\nabla_A l_s 更新:

A′=A+η es wx⊤=I+0.2(1010)=(1.200.21)A' = A + \eta\, e_s\, w x^\top = I + 0.2 \begin{pmatrix} 1 & 0 \\ 1 & 0 \end{pmatrix} = \begin{pmatrix} 1.2 & 0 \\ 0.2 & 1 \end{pmatrix}

主任务输出变成 v⊤A′x=1.2v^\top A' x = 1.2, lm=12(0.8)2=0.32l_m = \tfrac{1}{2}(0.8)^2 = 0.32, 从 0.5 降到 0.32. 第二种情况, w=(−1,1)⊤w = (-1, 1)^\top, ys=1y_s = 1. 则 w⊤Ax=−1w^\top A x = -1, es=2e_s = 2, 但 v⊤w=−1v^\top w = -1, 式 (6) 为 −2<0-2 < 0. 同样走一步:

A′=I+0.2(−1010)=(0.800.21)A' = I + 0.2 \begin{pmatrix} -1 & 0 \\ 1 & 0 \end{pmatrix} = \begin{pmatrix} 0.8 & 0 \\ 0.2 & 1 \end{pmatrix}

主任务输出变成 0.8, lm=12(1.2)2=0.72l_m = \tfrac{1}{2}(1.2)^2 = 0.72, 从 0.5 升到 0.72. 自监督损失一样在下降 (ese_s 从 2 变成 1.6), 主任务却变差了. 这个例子说明 TTT 的收益取决于自监督任务和主任务在共享层上的梯度是否对齐, 而对齐与否由数据和任务共同决定, 推理阶段无法直接检验 (检验要用 yy).

经验上的对齐. 论文在 75 个测试集 (15 类 corruption × 5 个等级) 上, 把每个测试集的平均梯度内积和 TTT 带来的改进画在一起, 相关系数为 0.93 (标准版) 和 0.89 (在线版). 这个相关性是统计意义上的, 对单张图仍然可能出现第二种情况. 一个具体的失效例子来自论文对类别的分析: airplane 类几乎没有收益. 论文给的原因是这类图常带黑边, 旋转方向从黑边的位置就能读出来, 旋转任务不需要看懂物体本身, 它在这类图上提供的梯度和分类无关.

不动主干的熵方法: BN 适配, TENT 与 MEMO. 只换统计量: BN 适配. 在讨论需要反向传播的方法之前, 先看一条更便宜的基线. BN 层在训练时用滑动平均累积均值 μs\mu_s 和方差 σs2\sigma_s^2, 推理阶段用这两个固定值归一化. 偏移改变了激活的分布, 训练域的统计量就不再匹配. Schneider, Rusak, Eck, Bringmann, Brendel & Bethge (2020) 直接用目标批的统计量 μt,σt2\mu_t, \sigma_t^2 去替换或混合:

μˉ=NN+nμs+nN+nμt,σˉ2=NN+nσs2+nN+nσt2(7)\bar{\mu} = \frac{N}{N+n}\mu_s + \frac{n}{N+n}\mu_t, \qquad \bar{\sigma}^2 = \frac{N}{N+n}\sigma_s^2 + \frac{n}{N+n}\sigma_t^2 \tag{7}

nn 是目标批大小, NN 是给训练域统计量的「伪样本数」, 控制先验的分量. N=0N = 0 时完全用目标批统计量. 这一步不更新任何权重, 只改归一化时用的两个数. ResNet-50 在 ImageNet-C 上 mCE 从 76.7 降到 62.2; 在用 DeepAugment + AugMix 训练过的更鲁棒的 ResNet-50 上, 从 53.6 降到 45.4. 它说明合成 corruption 带来的偏移, 很大一部分体现在激活的一阶, 二阶统计量上. BN 适配要求推理阶段有批. 批越小, μt,σt2\mu_t, \sigma_t^2 的估计方差越大; 批里如果只有一两个类别, 估出来的统计量反映的是类别构成, 不是域偏移. 后面 4.2 会讲到这一点在非独立同分布的流上变成主要失效来源.

TENT: 用预测熵更新 BN 仿射参数. ### 1.2. 损失和参数

TENT (Wang, Shelhamer, Liu, Olshausen & Darrell, 2021) 不需要训练阶段的辅助任务, 直接拿一个普通训练好的模型. 推理阶段的损失是模型预测分布的 Shannon 熵:

H(y^)=−∑cp(y^c)log⁡p(y^c)(8)H(\hat{y}) = -\sum_{c} p(\hat{y}_c) \log p(\hat{y}_c) \tag{8}

cc 遍历类别, p(y^c)p(\hat{y}_c) 是 softmax 输出. 熵低意味着预测更确定. TENT 的论证是: 在 corruption 基准上, 预测熵和误差高度相关, 降熵可以作为降误差的代理. 更新的参数只有 BN 层. 统计量 μ,σ\mu, \sigma 用目标批重新估计 (相当于式 (7) 取 N=0N = 0), 仿射参数 γ,β\gamma, \beta 用式 (8) 的梯度更新. 这两类参数加起来不到模型参数的 1%. 只更新这一小部分, 一方面降低了每步的计算, 一方面限制了模型能被熵损失改动的范围. 熵最小化有一个平凡解: 把所有输入都预测成同一类, 熵为 0. TENT 依赖批来避开它, 批内样本的类别不同, 统计量和梯度在批上平均, 单个样本推不动全体. 这也是 TENT 和 Sun 2020 的一个区别: TENT 是批级别的方法, 不能直接用在单张图上.

TENT 的更新范围与状态. | 问题 | TENT | | --- | --- | | 更新参数 | BN 统计量 (重估) 和 BN 仿射参数 γ,β\gamma, \beta (梯度更新) | | 损失样本 | 当前测试批内的所有样本, 损失在批上平均 | | 状态生命周期 | online 设定: 每个批走 1 步, 参数延续到下一个批; offline 设定: 先在全部目标数据上适应, 再统一预测 | | 历史信息 | 不保留训练数据和旧批, 统计量由当前批重新估计 |

ImageNet 实验用批大小 64, SGD 加动量, 学习率 0.00025; 其他数据集用批大小 128, Adam, 学习率 0.001.

和 TTT, BN 适配, 伪标签的对比. 论文 Table 2 给出 CIFAR-10-C 和 CIFAR-100-C 第 5 级的平均误差 (%):

方法 训练阶段要改造吗 CIFAR-10-C CIFAR-100-C
Source (不适应) 否 40.8 67.2
RG (对抗/增强训练的鲁棒模型) 是 18.3 38.9
UDA-SS (域自适应, 要提前拿到目标域) 是 16.7 47.0
TTT 是 17.5 45.0
BN (只换统计量) 否 17.3 42.6
PL (伪标签) 否 15.7 41.2
Tent 否 14.3 37.3

这张表里 TTT 一行的 17.5 和上一节 Sun 2020 Table A2 的数字 (标准版 31.0, 在线版 20.4) 对不上, 两篇论文的训练设置不同, 跨论文的数字不能直接比. 能比的是同一张表里的差: 从「只换统计量」的 17.3 到 Tent 的 14.3, 3 个点来自熵梯度对 γ,β\gamma, \beta 的更新. ImageNet-C 上 Tent 的 mCE 为 44.0 (online) 和 42.3 (offline), 对照方法 ANT 50.2, BN 49.9, AugMix 51.7, ANT+SIN 47.4. TENT 也有明确的失败例子. 在 MNIST → SVHN 这类数字域迁移上, 源模型误差 71.3, Tent 之后反而升到 79.8. 源域和目标域差得太远时, 源模型在目标域上的高置信预测本身大多是错的, 降熵只是让错误更确定.

MEMO: 单个测试点上的边缘熵. TENT 要批, Sun 2020 要在训练阶段加辅助头. MEMO (Zhang, Levine & Finn, 2022) 针对的是两者都不满足的情况: 测试点一个一个来, 模型是现成的. 做法分两步. 对测试点 xx 采样 BB 个随机增强 x1,…,xB\tilde{x}_1, \dots, \tilde{x}_B, 计算增强平均后的边缘分布:

pˉ(y∣x)=1B∑i=1Bp(y∣x~i)(9)\bar{p}(y \mid x) = \frac{1}{B} \sum_{i=1}^{B} p(y \mid \tilde{x}_i) \tag{9}

然后最小化它的熵:

ℓMEMO(θ;x)=H(pˉ(⋅∣x))=−∑ypˉ(y∣x)log⁡pˉ(y∣x)(10)\ell_{\text{MEMO}}(\theta; x) = H\big(\bar{p}(\cdot \mid x)\big) = -\sum_{y} \bar{p}(y \mid x) \log \bar{p}(y \mid x) \tag{10}

式 (10) 要压低的是平均分布的熵. 想让它低, 要同时满足两件事: 每个增强版本的预测都要确定, 不同增强版本之间的预测要一致. 只满足前者 (每个增强都很确定但各不相同), 平均分布仍然是分散的, 熵仍然高. 所以式 (10) 自带了对「把单张图推向任意一类」的约束, 不需要批. 论文的消融比较了三种损失: 边缘熵, 增强对之间的交叉熵, 每个增强的条件熵平均, 边缘熵最好. MEMO 更新全部参数, 预测完复位到原始参数, 每个测试点相互独立 (episodic).

单点设置下的误差. CIFAR-10-C 上 (ResNet-26, 各 corruption 平均误差), 基线 22.5, 只做增强平均预测 (TTA) 19.9, MEMO 19.6; 同一设置下 TTT 从自身联合训练的 22.8 降到 21.5. ImageNet-C 上 ResNet-50 的 mCE 从 76.7 降到 69.9, 单点 BN 适配为 71.4; Tent online 为 54.4, 但 Tent 用的是批. 在更鲁棒的 RVT*-small 上 mCE 从 49.4 降到 40.6, ImageNet-R 误差从 63.9 降到 58.8, ImageNet-A 从 100 降到 99.1. ImageNet-A 一行说明 MEMO 对自然对抗样本几乎无效: 这些图本身是挑出来让 ResNet-50 出错的, 增强一致性帮不上忙.

换自监督任务: TTT++ 与 TTT-MAE. ## 2. TTT++: 给自监督更新加特征约束

TTT++ (Liu 等, 2021) 先做了一件反向的事: 构造了一个 toy 例子, 说明强分布偏移下 TTT 会降低精度. 原因是自监督更新没有约束, 它会在共享特征空间里任意移动, 只要能降 lsl_s. 偏移小的时候, 降 lsl_s 的方向恰好也降 lml_m; 偏移大的时候, 两个方向可以完全不同, 和上一节手算的第二种情况一致. TTT++ 的修正是三段式. 训练结束后, 在训练集上计算共享编码器输出 zz 的均值 μz\mu_z 和协方差 Σz\Sigma_z, 存下来 (离线特征摘要, 不存训练样本本身). 推理阶段, 从一个测试 mini-batch 估计 μz′,Σz′\mu'_z, \Sigma'_z, 加一个对齐损失:

Lf=∥μz−μz′∥22+∥Σz−Σz′∥F2(11)\mathcal{L}_{f} = \lVert \mu_z - \mu'_z \rVert_2^2 + \lVert \Sigma_z - \Sigma'_z \rVert_F^2 \tag{11}

ResNet-50 编码器输出 2048 维, 二阶矩估计不稳, 所以 TTT++ 在编码器输出和自监督头输出 (128 维) 两处各做一次对齐, 总损失为

LTTT++=Ls+λzLf,z+λsLf,s(12)\mathcal{L}_{\text{TTT++}} = \mathcal{L}_s + \lambda_z \mathcal{L}_{f,z} + \lambda_s \mathcal{L}_{f,s} \tag{12}

λz,λs\lambda_z, \lambda_s 是权重. 小批估计协方差方差大, TTT++ 维护一个装最近若干批特征的队列 (batch-queue decoupling), 用队列里的全部特征估计矩. 自监督任务也从旋转预测换成了对比学习. 论文 Table 1 (ResNet-50, 测试批大小 256) 的平均误差 (%):

方法 CIFAR-10-C CIFAR-100-C CIFAR-10.1
不适应 29.1 61.2 12.1
TTT (旋转) 14.3 40.4 11.0
TENT 12.6 36.3 13.4
TTT++ 9.8 34.1 9.5

CIFAR-10.1 一列里 TENT 的 13.4 比不适应的 12.1 还差. 论文的解释是 BN 类方法默认不同样本, 不同空间位置以相似方式偏移, 合成 corruption 满足这一点, CIFAR-10.1 这种自然偏移不满足. TTT++ 的特征对齐约束的是编码器输出的分布, 不依赖这个假设.

TTT-MAE: 换一个更强的自监督任务. TTT-MAE (Gandelsman, Sun, Chen & Efros, 2022) 回答的是另一个问题: 如果自监督任务和主任务对齐得更好, 收益会不会更大? 它把旋转预测换成了 He 等 (2022) 的掩码自编码 (MAE): 遮掉 75% 的 patch, 让编码器加解码器重建被遮掉的像素. 模型是 MAE 预训练 800 epoch 的 ViT-L 编码器. 训练分类头时编码器冻结, 头用一个 ViT-Base, 论文叫 ViT probing. 推理阶段对每张测试图, 用不同随机掩码组成批 (批大小 128), 更新编码器和解码器, 走 20 步 SGD, 动量 0.9, 权重衰减 0.2, 学习率 5e-3, 每张图结束后复位. 两个设计选择有实验支撑. 第一, 训练分类头时若连编码器一起微调, 推理阶段再做 TTT 的效果差, 所以论文选了冻结编码器的 ViT probing. 第二, 优化器用 AdamW 时需要早停, 步数多了精度会掉; 用 SGD 时 20 步内精度持续上升.

ImageNet-C 第 5 级 15 类平均精度 (按论文 Table 2 逐类求平均): ViT probing 基线 32.1, TTT-MAE 43.3. 论文 Table 1 还对比了旋转任务: 对旋转不变的类别 (从任何角度看都差不多的物体), TTT-Rot 会伤精度, TTT-MAE 不会. 这正是上一节 airplane 现象的反面: 重建任务对每一类图都有非平凡的梯度.

熵适应的梯度到底在推什么. TENT 和 MEMO 都写成熵最小化,但梯度作用对象不同。先把最简单的二分类算清楚。设模型对一条测试样本输出两个 logits z=(z1,z2)z=(z_1,z_2),softmax 概率为 p=(p1,p2)p=(p_1,p_2),预测熵为

H(p)=−p1log⁡p1−p2log⁡p2.(13)H(p)=-p_1\log p_1-p_2\log p_2. \tag{13}

softmax 对 logit 的导数为 ∂pi/∂zj=pi(1[i=j]−pj)\partial p_i/\partial z_j=p_i(\mathbf 1[i=j]-p_j)。将式 (13) …10762 tokens truncated…代理目标. 含 fast weights 不代表正在做分布适应;TENT 用普通参数执行一步梯度,也已经属于 TTA. 第 5 章关注序列内可写记忆的表达能力与长上下文,第 4 章关注无标签目标域上的风险变化. 阅读时把「适应对象」与「状态生命周期」固定下来,就不会因 Test-Time Training 这个共同名称混淆两条路线.

四个判断问题. 判断一篇工作属于哪条线,可以问:更新状态服务分布适应还是序列记忆;信号来自增强、熵、重建还是 next-token;状态在样本、batch、会话或序列哪个边界复位;一个用户能否影响另一个用户状态. 前三问确定学习问题,第四问确定安全边界. 混合系统需要分别报告两层更新的消融. 关闭外层 TTA 检查序列记忆收益,关闭内层 TTT layer 检查分布适应收益,再观察交互. 只报全部开启的终点分数,无法知道两层是互补还是相互干扰.

5.2. 从实验结果到可部署结论

代理目标的接受域. 一个代理目标的有效性应写成条件命题. 熵最小化依赖初始边界大致正确、目标样本聚类结构存在;增强边缘化依赖变换保持标签;旋转、对比和重建依赖辅助梯度与主任务相关. 实验需要估计这些条件在哪些分布范围内成立,普适代理并不符合现有证据.

可以为每个目标域记录四个量:适应前错误率 e0e_0、代理损失变化 ΔLs\Delta L_s、主任务变化 ΔRt\Delta R_t 与梯度内积估计 qq. 把样本或 batch 按 qq、初始熵、增强一致性分桶,观察收益率. 若低熵高一致桶稳定改善、高熵低一致桶经常恶化,就能形成输入选择规则. 规则在开发域学习,密封域验证;直接在测试标签上寻找阈值会高估泛化.

选择样本更新会改变目标分布. 只更新低熵样本,模型主要适应容易区域,困难少数类可能长期没有梯度;只选增强一致样本,又可能偏爱纹理稳定类别. 报告各真实类别、难度和域的入选率,检查过滤器是否把某群体系统排除. 无标签部署看不到真实类别,可以在研究评测中揭示偏差,再设计更稳健的选择信号.

拒绝更新本身是一种决策. 若代理信号不可靠,保持源模型可能优于冒险适应. 可以把更新规则写成门控:m(x)∈{0,1}m(x)\in{0,1},实际梯度为 m(x)gsm(x)g_s. 门控质量由四格结果评估:该更新且更新、该更新却跳过、不该更新却更新、正确跳过. 「该不该」由独立标签分析定义,只用于评估门控,部署仍依赖可观察特征. 门控阈值的代价不对称. 错误更新可能破坏当前及后续请求,漏掉一次有益更新通常只损失局部收益. episodic 单样本中影响范围小,可以更积极;continual 状态中影响范围大,阈值应更保守. 同一可靠性分数不能脱离生命周期直接复用.

预算对齐与收益分解. TTT、TENT、MEMO 和 TTT-MAE 每个样本消耗的前向、反向与增强数量差异很大. 公平比较至少给三种视角:按方法论文的推荐配方比较可达效果;固定反向次数比较优化效率;固定墙钟或能量比较部署效率. 某方法在推荐配方最好,却在等延迟下落后,两个结论都可以成立. 设源推理成本为 CfC_f,一次反向约为 CbC_b,增强数为 KK,适应步数为 SS. 粗略成本可写成

Ctta≈KSCf+SCb+Cpred.(33)C_{tta}\approx KSC_f+SC_b+C_{pred}. \tag{33}

实际成本还含数据增强、参数复制、优化器和编译开销,公式用于暴露倍率来源. TENT 以自然 batch 摊销一次更新,MEMO 为每个样本生成大量增强,标准 TTT 每样本多步且复位. 只报每 batch 时间而 batch 大小不同,会掩盖单请求成本. 收益也要拆成源模型改进、训练期联合任务和测试期更新. 设普通源模型成绩为 A0A_0,加入辅助训练但不适应为 AjointA_{joint},测试更新后为 AttaA_{tta}. 联合训练贡献 Ajoint−A0A_{joint}-A_0,测试更新增量 Atta−AjointA_{tta}-A_{joint}. 若论文只比较 AttaA_{tta} 与 A0A_0,会把更好源表示一并算给 TTA. BN 方法还要拆统计重估与梯度. 设源统计成绩 AsA_s、目标 batch 统计为 AbA_b、再优化仿射为 AeA_e. Ab−AsA_b-A_s 是统计适配,Ae−AbA_e-A_b 才接近熵梯度增量. 二者存在交互,顺序消融无法给严格因果分解,还需四格实验:源/目标统计与冻结/更新仿射的全部组合.

内存开销包括临时激活、优化器状态、源参数副本与增强 batch. episodic 方法为复位保存一份源权重,函数式实现可能减少复制却增加图管理. 资源表记录峰值显存和常驻状态,避免把源副本排除在外. 手机或边缘设备上,能否反向传播往往比准确率差一点更决定可用性.

统计协议与独立单位. corruption 类型、严重度、模型种子、测试顺序和增强种子是不同随机层级. 对固定 checkpoint 重复增强,只估计适应随机性;换训练 seed 才覆盖源模型变化;换 corruption 才覆盖偏移类型. 将所有图片当独立重复会夸大证据,因为它们共享模型和域. 主结果可在每个「训练种子—corruption—严重度」单元计算适应前后配对差,再按预先权重聚合. corruption 数量不多时直接列出每项差值与最差项. 平均 mCE 提升可能来自少数噪声类型,天气、模糊或数字化偏移仍退化. episodic 方法对测试顺序理论上不敏感,换序测试是实现不变量;continual 方法必须在多种顺序上重复,顺序本身是实验因素. 将 continual 方法在最有利顺序的结果与 episodic 方法任意顺序比较,无法说明生命周期优势.

置信区间要配对. 同一源模型、同一图片的适应前后预测天然相关,对逐样本差或运行级差做配对 bootstrap 比两个独立比例更有效. 训练级主张仍以独立 checkpoint 为单位,图片 bootstrap 不能替代多训练种子. 超参数搜索也进入统计边界. 为每个 corruption 选择最佳学习率、步数和增强,相当于使用域标签与验证反馈. 部署若拿不到域身份,主结果应使用统一配置或只依赖可观察信号的在线规则. oracle per-domain 配方可以报告,但名称要明确.

故障与安全验收. TTA 把推理从纯函数变成状态转移,故障面随之扩大. 反向出现 NaN、显存不足、增强解码失败、batch 太小或输入为空时,系统需要定义输出:回退源模型、沿用适应前预测、跳过更新或拒绝请求. 错误处理路径也应测试,不能让半完成更新留在共享状态. episodic 实现可使用事务式语义:保存源状态,计算候选更新,通过数值与行为检查后用于当前预测,随后完整撤销. 若候选含非有限值、参数位移越界或输出塌缩,直接使用源预测. continual 实现则需版本化状态与可回滚 checkpoint,4.2 会进一步讨论.

安全哨兵可以监控预测边缘分布、平均熵、参数位移、BN 方差、梯度范数和源锚点输出. 单一信号容易误判:真实单类流也会让边缘熵下降,强 corruption 会让梯度变大. 多信号与持续时间结合,才较适合触发降步长、停止或恢复. 攻击评测应覆盖三条路径. 输入本身造成误分类是普通对抗攻击;输入诱导代理梯度朝攻击目标移动是适应攻击;恶意样本通过共享 batch 或持续状态影响其他输入是传播攻击. 三者的攻击预算、受害范围和防御不同. 只在适应前 adversarial examples 上测试,无法覆盖更新机制新增的攻击面.

隐私风险也来自状态. 某用户输入通过梯度写进共享参数,后续查询可能探测其影响. episodic 完整复位能缩小跨请求泄漏,batch 内仍有交互;continual TTA 需要租户隔离、状态过期和删除机制. 方法评测若把所有测试图片视为同一可信数据流,结论不能直接外推到多用户服务.

可证伪的最终验收. 一套完整验收从冻结源模型与开发规则开始. 对密封偏移运行无适应、训练期联合基线、统计适配、代理更新与等成本负对照. 保存逐步代理 loss、参数状态、逐样本预测、资源和失败. 标签只在运行结束后计算主任务指标. 「代理目标有效」要求正确代理显著超过打乱或随机方向;「梯度对齐解释收益」要求对齐量能预测一步风险变化,并在干预方向后同步变化;「增强边缘化有效」要求它超过逐增强条件熵且破坏分组会削弱收益;「可更新子空间更安全」要求在匹配目标收益时源域退化更小.

「episodic 隔离成立」要求换序、重复样本和不同前序输入不改变当前结果;「TENT 的梯度有额外价值」要求统计加仿射超过只换统计;「方法可部署」还要求延迟、显存、故障回退和安全门槛通过. 任一机制条件失败,相关主张收缩到观察到的范围. 可以预先设置接受表:未见偏移平均改善的区间下界高于零;任何关键偏移退化不超过阈值;干净源域保持;错误置信度与安全风险不越界;等延迟比较仍有收益;失败率与回退延迟可接受. 平均提升无法抵消硬门槛失败.

代理失败样本也要保留. 对每个「熵下降但分类变错」「重建改善但分类退化」「增强之间达成错误共识」的样本,记录原图、增强、概率轨迹与梯度诊断. 这些反例能检验下一种筛选或锚定方法,避免研究只围绕平均表格循环. 这套证据同时说明经典 TTA 与第 5 章的分界. 此处验收围绕目标分布、源任务风险与跨输入状态;第 5 章围绕单序列的记忆、预测与容量. 两边都使用内循环时,仍要分别通过各自的反例和状态生命周期检查.

还可以用一个二维玩具问题检验整条推理链. 令两类源数据分别围绕 (−1,0)(-1,0) 与 (1,0)(1,0) 分布,源分类边界为纵轴;目标偏移将两类共同沿纵方向平移,这种协变量偏移不改变最优分类方向. 若代理任务推动编码器消除纵向平移,主任务会改善. 若目标域把两类沿横轴互换,源预测高置信错误,熵最小化只会扩大错误间隔. 两个数据集规模、类别先验和初始熵可以匹配,唯一差异是代理梯度与真正边界的关系. 方法在前者成功、后者失败,正好验证适用条件.

对旋转 TTT,可再构造「方向与类别相关」和「方向与类别无关」两版数据. 第一版中,物体朝向携带类别结构,旋转更新容易改善共享表示;第二版给每类随机方向,旋转头仍能从局部纹理完成任务,却不帮助分类. 同样的辅助准确率配上不同的主任务变化,能反驳「自监督任务越容易学,TTA 越有效」这种过强结论. 真正重要的是梯度耦合.

TENT 的一步更新也能做样本级归因. 对 batch 中每个样本计算熵梯度 gig_i,总体梯度为均值. 删除样本 ii 后,更新变化约为 (gi−gˉ)/(B−1)(g_i-\bar g)/(B-1). 逐个删除代价高时可用该一阶近似估计影响,找到少数主导样本. 再检查它们是高置信正确、高置信错误、异常值还是某个集中类别. 这比只看 batch 平均熵更容易解释一次更新为何成功或失败.

样本影响还会经过 BN 统计产生间接路径. 一个极端值同时改变均值、方差和熵梯度,影响可能远大于其 1/B1/B 权重. 可在固定统计与重估统计两种模式下做 leave-one-out,对比直接梯度影响与统计影响. 如果攻击样本主要通过统计路径起作用,限制仿射梯度没有解决根因;稳健统计或样本隔离更有针对性. MEMO 的共识可以分解为「单视图确定性」和「视图间一致性」. Jensen 差

J=H(pˉ)−1K∑k=1KH(pk)(34)J=H(\bar p)-\frac1K\sum_{k=1}^{K}H(p_k) \tag{34}

等于各视图分布相对平均分布的平均 KL,也就是 Jensen–Shannon 散度. JJ 高表示视图分歧大,平均条件熵高表示各视图自身也不确定. 两种情况需要的处理不同:前者检查增强是否保持语义,后者说明源模型在每个视图上都缺乏把握. 只用边缘熵把二者合在一起,会丢掉诊断信息.

手算两个情形. 三个视图分别为 (0.9,0.1),(0.1,0.9),(0.5,0.5)(0.9,0.1),(0.1,0.9),(0.5,0.5) 时,平均预测恰好均匀,边缘熵达到最大,分歧与单视图不确定同时存在. 若三个视图全为 (0.5,0.5)(0.5,0.5),边缘熵同样最大,JJ 却为零. 第一种需要处理增强不一致,第二种需要获得更有辨识力的表示. 相同 MEMO loss 对应两种机制,报告 JJ 能区分它们. 自监督更新的训练模式也影响结果. 推理时将网络置于 train mode,dropout 开启、BN 更新;置于 eval mode,又可能阻止所需统计变化. 实现应逐模块设置状态,明确 dropout、BN 和随机深度各自行为. 仅写 model.train() 或 model.eval() 无法表达 TENT 这类混合需求. 同一 checkpoint 在不同模式下的差异要在无梯度基线中先测清楚.

优化器状态是另一个隐含超参数. episodic 单步 SGD 没有跨样本矩;使用 Adam 时,即使参数每次复位,若矩不复位,历史输入仍影响当前步. 完整复位 Adam 会让每个 episode 都处于偏置校正初期,更新幅度又与持续 Adam 不同. 论文应写明优化器、矩生命周期与偏置校正,不能只写学习率.

梯度裁剪会改变等范数对照. 若真实代理梯度经常超过阈值、随机梯度很少超过,裁剪后两者实际步长不同. 记录裁剪前后范数和触发率,对照使用相同的裁剪规则. 混合精度的 loss scaling 发生溢出时,某一步可能被跳过;把跳步当成零更新并记录,否则运行间更新次数并不相等.

多步 episodic 适应还面临「同一数据重复优化」. 十步都看相同增强集合,容易过拟合这组随机视图;每步重采样增强,目标更接近期望,却增加随机方差. 两种做法需要区分. 可固定总增强数,比较重复使用与分步新采样,判断收益来自更多优化步还是更多独立视图. 对 TTT-MAE,同一 mask 重复多步也可能只记住被遮位置. 每步新采 mask 能覆盖更多 patch,计算量相同而监督多样性更高. 记录 mask seed 与覆盖率,才能复现实际目标. 若测试图很小、若干步已经覆盖全部位置,再增加步数主要是在同一像素上重复拟合.

源模型选择会改变 TTA 难度. 更强预训练通常提高初始准确率,也可能让预测更校准、表示更稳健,留给适应的空间变小. 比较不同方法应共享底座;研究方法随底座规模的趋势时,报告绝对成绩、相对源增益与源退化. 在弱底座上提升十点,不代表在强底座上仍有相同价值.

预训练数据还可能覆盖 corruption 风格或测试图. 此时「测试时适应」收益建立在已经熟悉的表示上. 使用合成新扰动、时间上更晚的数据和近重复审计,能降低污染风险. 无法审计的大模型只应声称在该底座上的适应表现,不把结果解释成从未见分布上的普遍学习能力. 类别数也影响熵尺度. 均匀分布最大熵为 log⁡C\log C,在十类和千类任务上直接用相同绝对阈值没有可比性. 可归一化为 H(p)/log⁡CH(p)/\log C,但相同归一化熵仍可能对应不同 top-1 margin. 选择样本时同时观察最大概率、第一二名间隔与校准,阈值在不同类别数上重新验证.

开放集输入是经典闭集 TTA 的另一条边界. 一个不属于任何源类别的样本也会被熵最小化推向某个已知类,置信度上升后更难拒绝. 测试流混入未知类时,应报告未知检测、已知类准确率与错误吸收率. 只在闭集 corruption 上验证的 TENT 配方不能自动用于开放世界.

标签空间发生变化时,旋转或重建仍可优化,共享表示却未必支持新类. TTA 通常假设主任务标签空间和决策语义不变,改变的是输入分布. 新类别持续到来属于类别增量学习,需要扩展输出与监督或聚类机制. 把开放集失败归为「适应不够」会混淆问题定义.

回到部署决策,报告应给出代理目标的工作区间:源模型初始质量、偏移类型、batch 条件、更新子空间、状态生命周期、计算预算和安全隔离. 这些条件都能由前面的反例与消融检验. 条件越明确,方法越容易被正确使用,也越容易在新分布上知道何时停手.

部署前还应进行一次「零收益演练」:选择源模型已经接近饱和的干净集,按正式配置执行完整适应. 理想结果是门控跳过多数更新,或更新后性能、校准和资源都保持在容差内. 若方法必须在所有输入上更新,即使目标域没有可修正偏移也会消耗计算并承担退化风险. 这项测试检验系统是否具有保持原状的能力.

再进行「错误代理演练」:人为使用破坏标签的增强、错配 MAE 目标或被翻转的高置信伪标签. 监控与回退应在主任务大幅崩溃前触发. 若系统在代理 loss 顺利下降时毫无警报,说明监控只追随优化目标,无法识别目标与任务脱钩. 可部署 TTA 需要对成功更新敏感,也要对看似优化成功的错误方向敏感. 版本升级后,这两项演练与密封偏移集一起重跑. 编译器、归一化实现、增强库或 tokenizer 的变化都可能改变梯度路径. 旧版本通过的学习率和阈值不能自动继承. 将适应配置、底座 revision 和推理栈绑定,才有可能复现同一工作区间.

运行日志还要保存每个样本实际采用的更新步数、入选原因、回退原因和状态版本. 聚合准确率只能说明结果,无法判断门控是否按设计工作. 逐样本决策记录使错误预测能追到具体代理信号,也能检查某类输入是否长期被跳过. 若隐私限制禁止保存原始输入,可保存受控标识、统计摘要与访问审计,在授权环境完成复核.

参考文献