Conv Stem (卷积主干): FastViTHD 的起点是一个卷积主干,它负责对输入图像进行初步的特征提取和下采样。与一些Vision Transformer直接将图像块送入Transformer层不同,FastViTHD采用卷积操作(特别是大卷积核)来捕捉图像的低级纹理和局部模式。这种设计借鉴了卷积神经网络(CNNs)在早期视觉处理中的成熟优势,相比于直接使用自注意力机制处理原始像素或小图像块,卷积在计算上更高效,内存访问更友好,为后续更复杂的特征处理奠定了坚实基础。
RepMixer Block (重参数化混合器块): 这是FastViTHD中的一个核心创新组件,旨在高效地聚合中层特征。RepMixer采用了结构重参数化技术。简单来说,在模型训练阶段,RepMixer Block会使用一个更复杂、包含更多参数的结构("过参数化"),这有助于模型更好地学习和拟合训练数据,从而提升潜在的性能上限。然而,在训练完成后、进行推理部署之前,这个复杂的结构可以通过数学等效变换,被合并("重参数化")成一个更简单、计算量更小的结构。这样一来,FastVLM既能享受到复杂模型在训练时的强大拟合能力,又能在推理时获得简单模型的速度优势,从而巧妙地平衡了性能与延迟。
graph TD
subgraph RepMixer_Block_运作原理 ["RepMixer Block 运作原理"]
direction TB
subgraph Train_Time ["训练阶段 (Train-Time)"]
T_Input["输入特征"] --> T_Complex["复杂结构
(多分支, 更多参数
提升学习能力)"]
T_Complex --> T_Output["输出特征"]
end
subgraph Inference_Time ["推理阶段 (Inference-Time)"]
I_Input["输入特征"] --> I_Simple["等效的简化结构
(单分支, 更少参数
加速推理)"]
I_Simple --> I_Output["输出特征"]
end
T_Complex -- "结构重参数化
(数学等效变换)" --> I_Simple
end
Linear Attention (线性注意力层): 为了有效处理高分辨率图像产生的大量视觉标记(tokens),FastViTHD引入了线性注意力机制。传统的自注意力机制(如标准Transformer中的)其计算复杂度和内存需求与输入序列长度(即视觉标记数量N)的平方成正比(O(N²))。当N非常大时,这种二次复杂度会成为严重的性能瓶颈。线性注意力通过改变注意力分数的计算方式(例如,通过核函数技巧或低秩近似),将复杂度降低到与序列长度N成线性关系(O(N))。这意味着即使视觉标记数量显著增加,计算成本的增长也相对温和。这使得FastVLM能够在处理高分辨率图像时,依然保持较低的计算开销,对于全局上下文信息的建模至关重要。
graph TD
subgraph Traditional_Self_Attention ["传统自注意力 (Traditional Self-Attention)"]
LA_Input["输入序列 (N Tokens)"] --> LA_Calc["计算复杂度 O(N²)"]
LA_Calc --> LA_Output["注意力输出"]
style LA_Calc fill:#fdd,stroke:#c00,stroke-width:2px
end
subgraph Linear_Attention_FastVLM ["线性注意力 (Linear Attention - FastVLM)"]
LB_Input["输入序列 (N Tokens)"] --> LB_Calc["计算复杂度 O(N)
(核函数/低秩近似)"]
LB_Calc --> LB_Output["注意力输出"]
style LB_Calc fill:#dfd,stroke:#0c0,stroke-width:2px
end
LA_Input --> Desc1["内存/计算开销随Token数平方增长"]
LB_Input --> Desc2["内存/计算开销随Token数线性增长
高效处理大量Tokens"]
Token Pooling (标记池化): 在视觉信息流经编码器的过程中,FastViTHD还采用了一种动态的标记池化策略来进一步控制和减少视觉标记的数量。与一些需要复杂剪枝算法或可学习模块来决定哪些标记应被保留或丢弃的方案不同,FastVLM的标记池化机制设计得更为直接:它通常与输入图像的分辨率变化相协调。例如,在编码器的不同阶段,随着特征图空间尺寸的减小(通过卷积或池化操作),标记的数量也相应地、成比例地减少。这种直接依赖分辨率进行标记缩放的方法,避免了引入额外的计算开销和设计复杂度,使得视觉标记的管理更为高效和简洁。
graph TD
subgraph Complex_Pruning_Other_Models ["复杂剪枝/学习模块 (Other Models)"]
TP_A_Input["视觉Tokens"] --> TP_A_Module{"额外剪枝/学习模块
(决定保留哪些Tokens)"}
TP_A_Module --> TP_A_Output["减少的Tokens"]
style TP_A_Module fill:#fdd,stroke:#c00,stroke-width:2px
end
subgraph FastVLM_Token_Pooling ["FastVLM Token Pooling"]
TP_B_Input["视觉Tokens"] --> TP_B_Mechanism["与输入分辨率变化协调
(e.g., 特征图下采样)"]
TP_B_Mechanism --> TP_B_Output["按比例减少的Tokens
(无额外复杂模块)"]
style TP_B_Mechanism fill:#dfd,stroke:#0c0,stroke-width:2px
end
TP_A_Input --> TP_Desc1["引入额外计算/设计复杂度"]
TP_B_Input --> TP_Desc2["简化设计,高效管理Tokens"]
(FastViTHD 简化架构图已在上方"FastVLM 概述"部分展示。)