跳转至

Vision-TTT: Efficient and Expressive Visual Representation Learning with Test-Time Training

会议: ECCV 2026
论文: ECCV 2026
代码: https://github.com/imKQv/Vision-TTT
领域: 自监督/表示学习
关键词: 测试时训练; 线性复杂度视觉主干; 视觉序列建模; 隐状态梯度更新; 高分辨率效率

一句话总结

本文把 NLP 里的测试时训练(Test-Time Training, TTT)搬进视觉,把一张图的 token 序列当成一个数据集、用自监督重建的梯度下降在线更新每个 head 的隐状态,并用「双数据集策略 + Conv2d 数据集预处理」把只会单向建模的 TTT 改造成有 2D 感受野的视觉主干,ImageNet 上 Vittt-T/S/B 达 77.7/81.8/82.7 Top-1,1280×1280 分辨率下比 DeiT-T 省 79.4% FLOPs、快 4.72×、省 88.9% 显存。

研究背景与动机

视觉表示学习长期在「表达力」和「效率」之间做取舍。CNN 能高效地堆出空间层级,但卷积核是静态的,学完就固定,性能很难随规模继续往上走;Vision Transformer 用小方块自注意力做视觉序列建模,在大规模实验上证明了更好的可扩展性,如今已是学术和工业的默认骨干。代价是自注意力的复杂度随 token 数平方增长——224×224 输入只有 196 个 token 时还能接受,一旦进入高分辨率(1280×1280 就是 6400 个 token)推理,算力和显存会同时爆炸。于是社区转向 RNN 式的线性复杂度序列模型:Vision Mamba 系用选择性扫描的状态空间模型(SSM)配合二维扫描路径,Vision-RWKV 引入时间衰减,ViG 用门控线性注意力。它们都把复杂度压回了线性,但隐状态的更新规则是预设的——SSM 靠一个结构化(通常是对角稀疏)的衰减矩阵做乘性遗忘,线性注意力靠固定的核函数把历史累加成矩阵乘积。也就是说,这些模型的"记忆"在训练前就被公式定死了,无法针对当前这张图的内容自适应。

TTT 提供了另一条路:它把一条 token 序列 X=[x₁,…,x_T] 直接当成一个数据集,维护一个隐状态 W,每读入一个 token 就用一个自监督任务算梯度、对 W 做一步梯度下降,再把 W 作用到当前 token 上产生输出。这样隐状态不是被预设规则改写的,而是被梯度改写——学到什么、忘掉什么,由当前数据自己决定;作者也正是用这个梯度幅值画出梯度幅值图(Gradient Magnitude Map),把它当作类似注意力图那样的一种"视觉解释工具"。但 vanilla TTT 是为语言设计的:它是单向的因果序列模型,隐含了时间上的先后依赖,直接搬到图像上会丢掉二维空间局部性——相邻 patch 的关系被硬拉成一条一维链,全局建模能力反而退化。

本文的核心 idea 是把 TTT 从"一维语言序列模型"改造成"二维视觉学习器":保留"隐状态由自监督梯度在线更新"这一能提供强表达力的机制,同时通过双数据集策略恢复双向性、用深度可分离卷积对数据集本身做 2D 增广,并借助多头 + 小批量梯度下降把顺序计算变成 GPU 友好的小矩阵乘法,最终在同一个骨干里同时拿到线性复杂度与全局感受野。

方法详解

整体框架

Vision-TTT 是一个非层级(plain)的视觉主干,整体走三段:① Patchification——图像切成 16×16 的 patch,线性投影成 token 序列并加位置编码;② Vision-TTT Encoder——L 个混合 block 串联,每个 block 是一个 Vittt block(残差)接一个 SwiGLU MLP(残差),都采用 pre-LN;③ Task Adapters——分类时对最后一层输出做 LayerNorm + 均值池化 + 线性分类头,下游检测/分割时冻结主干、只训练特征适配器与任务头。真正新颖的全在 Vittt block 内部:它不再像自注意力那样用"query 与所有 key 做相似度加权"来聚合信息,而是把这一层的 token 序列看成一个小数据集,用一个自监督重建任务在上面做若干步小批量梯度下降,把序列语义压进一个 per-head 的小矩阵隐状态 W,再用更新后的 W 去"查询"当前 token 得到输出。换句话说,TTT 层是一个权重随输入在线改变的线性层,训练和推理时都在改(这正是 "test-time training" 的字面含义)。

%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
    A["输入图像"] --> B["Patchification<br/>切块 + 位置编码"]
    B --> C["把 token 序列当数据集<br/>自监督重建驱动梯度更新"]
    C --> D["双数据集策略<br/>前向 / 后向两路并行"]
    D --> E["Conv2d 数据集预处理<br/>深度可分离卷积注入 2D 局部性"]
    E --> F["多头隐状态 + 小批量梯度下降<br/>小矩阵乘法对齐 Tensor Core"]
    F --> G["SwiGLU MLP + 任务适配头"]
    G --> H["分类 / 检测 / 分割"]

关键设计

1. 把 token 序列当成数据集:让隐状态被自监督重建的梯度在线更新

这是全文的地基。给定视觉序列 X=[x₁,…,x_T],先像注意力那样线性投影出 key / query / value 三份视图:X^K=θ_K X、X^Q=θ_Q X、X^V=θ_V X。接着设一个刻意保持简单的自监督任务——用 key 视图重建 value 视图,损失就是 L2 重建误差:

\[\ell(\mathrm{W}_{t-1};x_t)=\lVert \mathrm{W}_{t-1}x_t^{K}-x_t^{V}\rVert^{2}\]

于是 (X^K, X^V) 的 token 对被当作"训练集",X^V 是标签视图、X^K 是输入视图,而 X^Q 是"测试集":输出 token 由更新后的隐状态查询 query 视图得到,\(z_t=\mathrm{W}_t x_t^{Q}\)。这里被训练的东西不是整个网络,而是每个 head 一个 d×d 的隐状态矩阵 W——它扮演一个联想记忆的角色:把序列里已经见过的 (key, value) 关系在线写进去,再用更新过的记忆去读取当前 token。和 SSM / 线性注意力最本质的区别藏在这个重建任务里:SSM 的隐状态演化是 h_t=Ā_{t:s}B̄s x_s 这样的乘性衰减,线性注意力的因果形式是 s_t=Σφ(K_s)V_sᵀ 的外积累加,而 TTT 的更新里显式出现了减法式差异项 (V_s − WK_s 相当于一串相对位置锚点,天然保留局部性,因此 TTT 不只是"换了个梯度视角",而是一个位置感知的视觉学习器。}K_s)——模型只把"当前 token 与全局记忆之间还差多少"写进状态。作者在文中的解释是:这一串 W_{s−1

把重建损失对 W_{t−1} 求导就得到该时刻的梯度 \(G_t = 2(\mathrm{W}_{t-1}x_t^{K}-x_t^{V})(x_t^{K})^{\mathsf T}\),它的大小直接反映这个 token 里有多少"新信息"没被记忆解释掉。作者把 G_t 按 patch 位置可视化出来(原文 Fig. 3、Fig. 9),发现语义显著的区域梯度更大、训练后分布更清晰,于是宣称 Gradient Magnitude Map 是 Vision-TTT 自带的、patch 级别的可解释性工具——和 ViT 的注意力图、Vision Mamba 的激活图对标。

2. 双数据集策略:用前向 / 后向两路数据集补上 2D 双向性

上面的更新是严格因果的:第 t 个 token 只能看到它前面的 token。对文本这是合理的归纳偏置,对图像则意味着信息流被强行压成一条链,右侧和下方的 patch 无法影响左上的 patch。作者的做法很直接——既然 TTT 的"数据集"是由 token 对构成的,那就再构造一份反方向的数据集 (X'^K, X'^V)={(x'^K_t, x'^V_t)}, t=T,…,1,让同一个自监督任务在正向(Z_forth)和反向(Z_back)两条路上同时跑,各自维护自己的隐状态,最后把反向路的输出翻转回来、与正向路门控融合:

\[\mathrm{Z}_{\text{Dual}}=\sigma(\texttt{Linear}(X_{\text{Conv2d}}))\odot\bigl(\mathrm{Z}_{\text{forth}}\ \|\ \texttt{flip}(\mathrm{Z}_{\text{back}})\bigr)\]

这里的门控沿用 vanilla TTT block 的写法(用输入自己算一个 sigmoid 门去调制输出),因此换成双向后仍然是逐通道的软选择,而不是简单的相加。这一步是从双向 RNN 借鉴来的思路,但放在 TTT 语境下它有额外的好处:负向路相当于把二维图像的两条扫描方向都覆盖了,消融里它带来 +1.9% 分类精度、+1.1% APb、+1.0% APm、+1.5% mIoU,是设计路线上单点增益最大的一环——代价是 FPS 掉 38.2%,所以要靠下面的小批量设计把效率找回来。

3. Conv2d 数据集预处理:把 2D 局部性注入数据集本身

光有两个方向还不够。原始 TTT block 在把 token 送进自监督任务之前只做了一次 Conv1d 预处理(X_Conv1d),这等于承认输入是一条一维序列,patch 之间没有邻域概念,相邻但不在扫描顺序上挨着的像素(比如上一行末尾和下一行开头)根本碰不到。本文把这一步换成深度可分离卷积(depth-wise Conv2d):X_Conv2d = DWConv(X),先把 patch 序列按二维网格重排、做一次局部卷积再展开,于是送进数据集的不再是"孤立的 token",而是"带邻域上下文的 token"。选择深度可分离卷积而不是普通卷积是为了控制参数:整个改动只引入 0.02M / 0.04M / 0.08M 参数(对应 T/S/B),而性能在各项指标上再涨 0.1%~0.2%。单看数字不大,但 ERF(有效感受野)图说明了它的结构性作用:vanilla TTT 的中心像素感受野是条带状 / 扇形的,"+ Dual" 版本变成了覆盖整图但有方向偏差的样子,只有再加上 Conv2d 预处理,中心像素的 ERF 才变成全局且径向对称的圆斑,和 DeiT、Vim 的全局覆盖形态对齐。也就是说,前两个设计决定"能看多远",这一步决定"看得是否各向同性"。

4. 多头隐状态 + 小批量梯度下降:把小矩阵乘法压到 Tensor Core 上

vanilla TTT 有一个工程上的硬伤:每个 token 一步梯度下降,第 t 步必须等第 t−1 步算完,纯串行,GPU 的并行度根本用不上。作者做了两处改造。其一是多头化:把原本 D×D 的隐状态拆成 nh 个 d×d(D=nh×d),每个 head 独立维护自己的记忆,既减少单块矩阵的规模也让并行度上来。其二是把梯度下降的粒度从 1 改成 16:不再逐 token 更新,而是把序列切成大小 b=16 的小批量,批内仍然保持因果形式(批内第 t 步是 W₀ 减去前 t 个梯度之和,\(\mathrm{W}_t=\mathrm{W}_0-\eta\sum_{s=1}^{t}G_s\)),批间则一次性并行。b=16 不是随便挑的:16×16 正好是 Tensor Core 做小矩阵乘法的原生粒度,作者用 Triton 手写了前向 / 反向 kernel,并沿用 Mamba 那套 kernel fusion + 重计算,把显存占用从理论上的多项和压到 O(BTD)。这一步直接决定了"efficient"能不能兑现——把理论上的线性复杂度变成实测的线性吞吐。原文给出的复杂度对比是 Ω(ViT)=4TD²+2T²D、Ω(Vim)=6TD²+18T(2D)N、Ω(Vittt)=6TD²+6TDd+4bTD(b=16、d=64、N=16 为 Mamba 的状态扩张因子):ViT 对序列长度是平方项,Vim 和 Vittt 都是线性项。代价是 Vittt 的常数系数里多了与 embedding 维度 D 相关的一项,这解释了为什么 Vittt-S/B 的理论 FLOPs 会略高于 Vim-S/B;但实测速度上 Vittt 全面领先,原因是 Vim 的选择性扫描跑在 CUDA Core 上,而 Vittt 的小矩阵乘法直接吃 Tensor Core。

一个完整示例

以 Vittt-T 处理一张 224×224 图像为例。切成 16×16 的 patch 得到 196 个 token,经过嵌入与位置编码后进入第一个 Vittt block。这个 block 内部,196 个 token 先被深度可分离卷积做一次 2D 增广,然后投影成 K/Q/V 三份;数据集被复制成两份——正向的 (X^K,X^V) 和反向的 (X'^K,X'^V),两条路各自带着自己的初值 W₀ 开始更新。由于 b=16,每条路要走 ⌈196/16⌉=13 步小批量梯度下降,整张图在这一层一共发生约 26 次记忆写入。每个 head 的记忆只有 64×64 大小,读完这 196 个 token 后,隐状态里装的就是这张图"压缩后的语义"。最后两路输出翻转、门控融合,过 SwiGLU MLP,交给下一个 block。对比之下,同期基线 ViT3 在整条序列上只做一步梯度下降(在数学上等价于门控线性注意力),而 Vittt 做的是 T/b 步——这正是它在检测、分割这类需要长序列适应性的任务上拉开差距的来源。

损失函数 / 训练策略

模型内部的自监督损失是前面那个 L2 重建项,它不需要额外标注,在训练和推理时都持续作用。外层的监督训练沿用 DeiT 与 Swin 的训练配方(原文附录 D 给出完整超参):ImageNet-1K 预训练时接均值池化 + 线性分类头,用交叉熵监督。下游适配遵循前作的做法——COCO2017 检测 / 实例分割上,用 ViT-Adapter + Mask R-CNN 头,输入分辨率放大到 1333×800;ADE20K 语义分割上用 UperNet 头,图像裁到 512×512;两者都冻结编码器骨干,只训练特征提取器与任务头。此外,隐状态的初值 W₀ 有两种处理方式(训练前一次性初始化,或设为可学习参数参与监督训练),这个选择在消融里被单独考察,见下文。

实验关键数据

主实验

ImageNet-1K 分类(224² 输入,与线性复杂度 / TTT 类基线对比):

方法 #Param. FLOPs Top-1 (%)
DeiT-T 6M 1.3G 72.2
VRWKV-T 6M 1.2G 75.1
Vim-T 7M 1.5G 76.1
ViT3-T 6M 1.2G 76.5
Vittt-T 7M 1.4G 77.7
DeiT-S 22M 4.6G 79.8
Vim-S 26M 5.2G 80.3
ViT3-S 24M 4.8G 81.6
Vittt-S 26M 5.3G 81.8
DeiT-B 86M 17.6G 81.8
VRWKV-B 94M 18.2G 82.0
Vim-B 98M 18.8G 81.9
ViT3-B 90M 18.0G 82.6
Vittt-B 102M 20.3G 82.7

同规模下 Vittt-T/S 比 Vim-T/S 高 +1.6% / +1.5%,Vittt-B 比 DeiT-B、VRWKV-B、Vim-B 高 +0.7%~+0.9%,并且三个尺寸都压过同为 TTT 路线的 ViT3。注意 ViT3 的参数与 FLOPs 普遍更低,Vittt-B 的 20.3G 也是这一档里最高的,因此这是"同规模但不同开销"的对比,不是等 FLOPs 对比。(与 RegNet / ConvNeXt / Swin / VMamba 等层级式方法的完整对比见原文 Tab. 2。)

下游密集预测(COCO2017 检测报告 APb / APm,FLOPs 按 1333×800;ADE20K 分割报告 mIoU,FLOPs 按 512×512):

方法 #Param. 检测 FLOPs APb APm 分割 FLOPs mIoU
ViT-T 8M 147.1G 41.6 37.9 20.9G 42.6
Vim-T 9M 76.7G 41.8 38.2 18.4G 43.4
ViT3-T 8M 69.2G 42.0 38.3 16.7G 43.6
Vittt-T 9M 74.3G 42.9 38.7 17.8G 44.3
Vim-S 32M 203.6G 44.9 40.2 49.7G 47.0
ViT3-S 30M 195.6G 45.4 40.7 47.7G 47.6
Vittt-S 32M 206.3G 46.3 41.4 50.3G 48.4
Vim-B 111M 611.5G 46.6 41.6 149.2G 48.9
VRWKV-B 107M 599.0G 46.8 41.7 146.0G 49.2
ViT3-B 103M 597.1G 47.4 42.1 145.7G 49.4
Vittt-B 115M 646.7G 48.6 43.0 157.7G 50.3

Vittt-T 比 Vim-T 高 +1.1 APb / +0.5 APm / +0.9 mIoU,Vittt-S 对 Vim-S 的优势扩大到 +1.4 / +1.2 / +1.4,Vittt-B 对 VRWKV-B 仍有 +2.0 / +1.3 / +1.1。值得注意的是 ViT3 在分类上已经追平 Vittt,到了密集预测却明显掉队,作者把原因归到它的梯度下降步数太少——任务序列从 512×512(1024 token)拉长到 1333×800(4200 token)时 Vittt 的优势不减,说明多步自适应在长序列上更值钱。

效率(1280×1280 分辨率,batch 64,L40S):Vittt-T/S/B 相对 DeiT-T/S/B 分别省 79.4% / 66.3% / 48.9% FLOPs,吞吐高 4.72× / 4.23× / 3.88×,显存省约 89.0%。FLOPs 随分辨率线性增长的曲线与理论复杂度分析吻合;而对 Vim 来说,Vittt-T 的 FLOPs 更低、Vittt-S/B 略高(常数系数更大),但三者实测 FPS 全部反超。

消融实验

设计路线(Vittt-T,逐项叠加;FPS 为 batch 64 下实测):

配置 #Param. FLOPs FPS Top-1 APb APm mIoU
TTT layer 5.87M 1.14G 3607 74.2 40.4 36.8 41.5
+ 共享 Q/K 5.43M 1.07G 3892 74.0 40.1 36.5 41.2
+ Gating 5.89M 1.15G 3565 75.2 41.2 37.1 42.0
+ Conv1d(vanilla TTT) 5.90M 1.16G 3346 75.6 41.6 37.6 42.6
+ 双数据集策略 6.96M 1.42G 2068 77.5 42.7 38.6 44.1
+ Conv2d 数据集预处理(完整) 6.98M 1.44G 2029 77.7 42.9 38.7 44.3

分类特征提取方式(Vittt-T):

策略 #Param. FLOPs Top-1 APb APm mIoU
HeadClassTok 6.98M 1.44G 76.6 41.6 37.8 43.0
MidClassTok 6.98M 1.44G 76.8 41.7 37.9 43.0
DoubleClassTok 6.98M 1.45G 75.4 41.2 37.2 42.5
MaxPool 6.98M 1.44G 77.2 42.2 38.4 43.8
MeanPool 6.98M 1.44G 77.7 42.9 38.7 44.3

超参:小批量 b 从 4(49 步梯度下降)增到 196(只做一次批梯度下降)时,Top-1 先急降后微升,最差点出现在中间的 b=64(既没有足够的更新步数、也拿不到足够全局的梯度视角);b=16 所在的 4~16 区间是精度与效率的甜点区。隐状态初值方面,完全不可学习的 Vittt-W0⁰ 最差,给前向 / 后向两路共享一份可学习初值的 Vittt-W1⁰ 较好,给两路各配一份的 Vittt-W2⁰ 最好,说明让两路数据集各有一套初值能减少相互干扰。

关键发现

  • 单项增益最大的是双数据集策略(+1.9% Top-1、+1.5 mIoU),代价也最大(FPS 从 3346 掉到 2068,-38.2%);Conv2d 预处理的增益只有 +0.1~0.2,但它负责把 ERF 从有方向偏差变得全局径向对称,是"形态"而非"点数"上的贡献。
  • 共享 Q/K 投影基本不掉点(74.2 → 74.0)却省下 0.44M 参数,是个几乎免费的设计;Gating 与 Conv1d 一起把 vanilla TTT 的精度抬了 1.6%,同时牺牲 14.1% 吞吐。
  • 分类头用池化显著优于 class token 方案,均值池化最好——作者认为这与 TTT 的"梯度驱动的表示"更契合(表示是整条序列的压缩记忆,而不是某一个位置的特征)。
  • 密集预测上多步梯度下降的价值被放大:分类上 ViT3 与 Vittt 平手,检测 / 分割上 Vittt 明显领先,且序列越长优势越稳。

亮点与洞察

  • 把"隐状态由梯度而非固定规则更新"当成视觉归纳偏置来卖,是这篇最"啊哈"的地方:SSM 的记忆衰减矩阵、线性注意力的核函数都是训练前定死的,而 TTT 每读一个 token 就问一句"我预测错了多少",把残差写进记忆。这个思路在视觉里近乎空白,本文是第一篇把它做成通用视觉主干的。
  • 用 b=16 这样一个超参同时解决三件事——增加梯度步数、保持 GPU 并行度、对齐 Tensor Core 的 16×16 粒度——是很工程化但很关键的设计;它把"线性复杂度"从理论推导变成实测吞吐,也是相对 vanilla TTT 的实打实改进。
  • 梯度幅值图(GMM)作为可解释性工具可以迁移:任何以自监督损失梯度更新状态的模型(TTT 系、记忆网络、部分元学习模型)都能画出类似的 token 重要性图,用来做弱监督定位或数据筛选。
  • 双数据集策略是一个通用的"把单向序列模型双向化"的套路:只要有构造第二份数据集的能力,就能给一维因果模型补上双向性,且不必改动内部更新规则。迁移到视频 / 点云 / 长文档时可以直接复用。

局限与展望

  • 主干仍是监督式 ImageNet 预训练,没有回答"在大规模自监督预训练(MAE / DINOv2 那一档)下是否还成立"。而 ViT 的统治力很大程度上来自这个范式,这是本文规模论证上最大的缺口。
  • 模型只做到 T/S/B 三档,没有更大规模的点,也没有与 ViT-L/H 的对照;表里的 "ViT-L/16 76.5" 是低分辨率下的旧配方,不足以说明可扩展性。
  • 效率与精度的取舍被设计路线强绑定:双数据集带来的 38.2% FPS 损失是用精度换的,论文没有给出更精细的折中方案(比如只在一部分层用后向路)。
  • 对 b=64 这个"最差区间"的解释(既缺步数又缺全局视角)偏定性,没有理论刻画,也没有解释为什么 b 增大到 196 后精度又回升——这块的实验证据比结论弱。
  • 下游只做了 COCO 检测与 ADE20K 分割,且都是冻结主干 + 轻量适配器,没有验证在需要端到端微调的任务(如视频、3D)上的表现;GMM 与 ERF 也都停留在可视化,缺量化指标和下游任务验证。

相关工作与启发

  • vs ViT / DeiT:它们用 softmax 自注意力在全序列上做相似度加权,复杂度 O(T²),高分辨率下算力和显存同时爆炸;本文用"梯度更新隐状态"替代注意力,复杂度线性,1280×1280 下对 DeiT-T 省 79.4% FLOPs、省约 89% 显存。代价是 224² 小分辨率下 DeiT 的吞吐略高,Vittt 的优势要等到分辨率上去才显现。
  • vs Vim / VMamba(SSM 系):同为线性复杂度的 RNN 式模型,但 SSM 靠结构化衰减矩阵做乘性遗忘、隐状态演化规则预设;TTT 用减法式差异项 (V_t − W_{t−1}K_t) 把"预测残差"写成相对位置锚点,且隐状态容量是完整的 d×d 矩阵而非对角结构。工程上 Vittt 吃 Tensor Core 而 Vim 的选择性扫描跑 CUDA Core,所以 FLOPs 相近时 Vittt 更快。
  • vs ViT3:最直接的对手,同样把 TTT 引入视觉,但只做一步梯度下降,数学上等价于门控线性注意力。本文观察到"序列感知的多步(T/b 步)更新"才是表达力的来源——分类上两者接近,一旦进入长序列的密集预测,多步自适应的优势就显现出来,Vittt-B 领先 ViT3-B +1.2 APb 与 +0.9 mIoU。
  • vs vanilla TTT [Sun et al., 2024]:本文保留了它的核心形式(自监督 L2 重建 + 输出规则 z_t=W_t x_t^Q),但指出它的一维因果设计不适配二维视觉;双数据集 + Conv2d 预处理正是为了把数据集本身"二维化",ERF 从条带 / 扇形变成全局径向是最直观的证据。

评分

  • 新颖性: ⭐⭐⭐⭐☆ 把 TTT 首次做成通用视觉主干,并用双数据集 + Conv2d 预处理补上 2D 归纳偏置,方向清晰;但"把序列模型搬进视觉"本身是常见范式迁移,核心更新式仍沿用 NLP 的 TTT。
  • 实验充分度: ⭐⭐⭐⭐☆ ImageNet + COCO + ADE20K + 多分辨率效率分析 + 四组消融覆盖完整,FPS/FLOPs/显存都给了实测;缺大规模自监督预训练与更大模型两档。
  • 写作质量: ⭐⭐⭐⭐☆ 设计路线(Tab. 4 + ERF 图)讲得很清楚,"从 TTT layer 到 Vittt block"逐步加法的叙事有说服力;复杂度与内核细节推到附录,正文部分关键实现说明略简。
  • 价值: ⭐⭐⭐⭐☆ 为"线性复杂度视觉主干"提供了一条新的技术路线,工程实现(Triton 内核 + Tensor Core 对齐)可直接复用;若能在自监督大规模预训练下验证,价值会更高。