多数视觉编码器(如ViT)采用固定分辨率训练范式,限制了对任意图像分辨率的处理。主要原因在于分块和位置编码的限制。
图像是2维的,CNN可以直接用于处理2维信息。但是如果用注意力机制处理图像,如果将2维图像中的每个点视为一个token,则计算量太大。比如一个224*224的图像,则需要224*224*dim的矩阵来表示这张图。因此出现分块操作,分块将一张图像的一部分像素表示成一个token。这样只需要(224/patch)*(224/patch)*dim来表示一张图像。但是这样需要人为设定分块大小,而且由于位置编码的存在会使得图像编码器要求图像分辨率固定。
1. 分块策略的底层约束
- Vision Transformers (ViTs) 的核心操作是将图像划分为固定尺寸的块(如16×16像素)。每个块被展平为向量后,需叠加可学习的位置编码(positional encoding)以保留空间信息。
- 训练阶段:模型的位置编码参数矩阵维度为 N t r a i n × d N_{train} \times d Ntrain×d( N t r a i n N_{train} Ntrain是训练时块数量, d d d是嵌入维度)。例如,若训练分辨率为224×224,块尺寸16×16,则块数 N t r a i n = 14 × 14 = 196 N_{train}=14×14=196 Ntrain=14×14=196,位置编码矩阵固定为196行。
- 推理阶段:若输入图像分辨率不同于训练值(如448×448),块数将变为 N t e s t = 28 × 28 = 784 N_{test}=28×28=784 Ntest=28×28=784。此时模型需处理4倍于训练时的位置编码索引,但原始位置编码矩阵仅有196行,导致索引越界。
2. 现有解决方案
-
图像缩放(Resizing):将任意分辨率图像缩放至固定尺寸(如224×224),虽能直接适配模型,但会导致高频细节丢失(如文字模糊、小物体失真)。这在医学影像、遥感等精细化任务中尤为致命。
-
位置编码插值(Interpolation):通过双线性插值将训练好的位置编码扩展到新分辨率(如将196个编码插值到784个)。但插值后的编码未在训练中见过,可能破坏空间关系的建模,使模型性能显著下降(典型实验显示分类准确率下降3-5%)。
-
相对位置编码(Dynamic Positional Encoding):采用相对位置编码或可学习插值机制。这类方法虽能缓解问题,但需重新设计模型架构,且增加训练复杂度(如DeiT-III需额外20%训练时间)。
-
连续位置编码:Meta的FLOATER提出可微分连续位置编码函数,通过神经网络动态生成任意长度的位置编码。在ImageNet-1k上,FLOATER在512×512分辨率微调后top-1准确率达85.2%,逼近原生训练模型(85.4%)。
-
混合分辨率训练:Google的FlexiViT在训练时随机采样块尺寸(12×12到20×20),使模型隐式学习尺度不变性。在COCO目标检测任务中,FlexiViT在640×640输入下mAP达54.1,超越固定块尺寸ViT的53.7。
-
位置编码解耦:如VoRA利用LLM的序列建模能力,将图像视为变长token序列,通过双向注意力隐式建模空间关系,完全摒弃显式位置编码。实验显示其在384×384分辨率下相比ViT节省23%内存。
3. 分块处理的隐藏代价
- 边缘效应(Edge Effects):当图像分辨率非块尺寸整数倍时,需进行填充(padding)或裁剪,导致边界信息损失。例如,处理512×512图像时若块尺寸为16×16,需填充至512×512(浪费0%像素)或裁剪至496×496(丢失3%边缘内容)。
- 计算效率损失:以Swin Transformer为例,其层级下采样设计依赖严格的窗口划分。输入分辨率变化时,需动态调整窗口大小,导致GPU并行计算效率下降(实测吞吐量降低15-30%)。
位置编码插值(Positional Encoding Interpolation)
核心思想
在推理阶段,对预训练的位置编码矩阵进行数学插值,使其适配输入图像的分辨率变化。
实现步骤
- 训练阶段:以固定分辨率(如224×224)训练ViT,生成位置编码矩阵 P t r a i n ∈ R N t r a i n × d P_{train} \in \mathbb{R}^{N_{train} \times d} Ptrain∈RNtrain×d,其中 N t r a i n = ( 224 / 16 ) 2 = 196 N_{train}= (224/16)^2=196 Ntrain=(224/16)2=196(块数), d d d为嵌入维度。
- 推理阶段:
- 输入图像分辨率变为 H × W H \times W H×W,分块后块数 N t e s t = ( H / p ) × ( W / p ) N_{test}=(H/p) \times (W/p) Ntest=(H/p)×(W/p),其中 p p p为块尺寸(如16)。
- 若 N t e s t > N t r a i n N_{test} > N_{train} Ntest>Ntrain,需将 P t r a i n P_{train} Ptrain 插值扩展至 P t e s t ∈ R N t e s t × d P_{test} \in \mathbb{R}^{N_{test} \times d} Ptest∈RNtest×d。
- 插值方法:
- 双线性插值:将原始位置编码视为2D网格(如14×14),上采样到目标分辨率(如28×28)。
- 傅里叶域插值:对位置编码进行傅里叶变换,在频域填充高频分量后逆变换回空间域。
动态位置编码(Dynamic Positional Encoding)
核心思想
设计位置编码生成机制,使其能够动态适应任意输入分辨率,无需依赖固定插值。
主要变体
2.1 相对位置编码(Relative Positional Encoding)
- 原理:编码块之间的相对距离而非绝对位置。
- 对于块 i i i 和 j j j,位置编码 P i , j = f ( ∣ x i − x j ∣ , ∣ y i − y j ∣ ) P_{i,j}=f(|x_i-x_j|, |y_i-y_j|) Pi,j=f(∣xi−xj∣,∣yi−yj∣),其中 f f f 为可学习函数。
- 代表工作:
- Swin Transformer:采用可学习的相对位置偏置矩阵,窗口内计算局部相对位置。
- Offset Encoding:为每个注意力头添加可学习的偏移量参数。
2.2 连续位置编码(Continuous Positional Encoding)
- 原理:使用神经网络生成任意长度的位置编码。
- 输入归一化后的坐标 ( x , y ) ∈ [ 0 , 1 ] 2 (x,y) \in [0,1]^2 (x,y)∈[0,1]2,输出对应位置编码 P ( x , y ) = M L P ( x , y ) P(x,y)=MLP(x,y) P(x,y)=MLP(x,y)。
- 代表工作:
- FLOATER(Meta, 2023):用隐式神经表示(INR)建模位置编码函数,支持任意分辨率。
- DynamicViT(Google, 2022):轻量级CNN预测位置编码权重。