1 前言
接上文多模态模型如何处理任意分辨率输入——Tiling与Packing技术详解和补充公式推导,本文继续讨论另一个很重要的问题:当图片/视频被处理成动态长度的视觉 token 后,位置编码应该怎么设计。
对于常规的多模态模型而言(不妨只考虑图文多模态),图片经过图片encoder,connector后得到图片特征,随后与文本特征共同输入到decoder中,模态间特征充分“融合”后得到输出。
任意分辨率的VLM(visual-language model)的架构,根据视觉特征的“融合”方式,主要可以分为2大类
- 采用cross-attention的方式交互。代表模型有视觉版本LLama3,flamingo,nougat等。这个形式图片特征通过cross-attention层交互,LLM decoder侧的位置编码与沿用语言模型。
- 图片特征与文本特征在输入层进行拼接,采用Self-Attention层交互。此时可以将图片特征视为visual token,此时的多模态模型可以视作为decoder-only的多模态模型。

两种架构不同的task精度各有千秋。但从部署的角度来看,当前部署生态和推理优化仍更偏向 decoder-only,cross-attention 支持和优化复杂度更高,目前推理引擎如vLLM的主要适配decoder-only模型的高效推理,并未对cross-attention的架构做优化。可见这个ISSUE:
文本主要探讨的是decoder-only多模态模型的位置编码设计。
2 多模态输入处理链路
先不考虑batch,以单个多模态输入为视角。以一个简单的VQA问题为例,假定多模态输入如下,

其输入有2种模态:(文本,图片),其输出只有文本模态。(即是一个text+image → text问题)。在teacher forcing的训练策略下,其输入可以表示为
- 这张图片中的卡通形象是什么
- 图片
- 皮卡丘
我们来画一下架构图

从上图不难发现,多模态的输入处理链路很简单,主要分为2步
(一)tokenize
输入文本通过训练好的tokenizer进行分词,在用word embedding层将分词映射为其表示的embedding,如下
text1的embedding
text2的embedding
- 分别表示text1和text2的token数目
- 上标表示表示这个embedding为文本embedding
- 表示decoder的特征维度
图片tokenize
图片通过image tokenizer,将图片转为图片embedding。为了和文本的维度对齐,会将图片特征由2D 网格展平为 1D 序列,并通过projector对齐到
- 表示输入图片一共有多少token。
- 上标表示表示这个embedding为图片embedding
- 表示decoder的特征维度
image tokenizer目前的主流做法是,如QwenVL。也有一些encoder-free的做法,直接用作为image tokenizer如Fuyu8B,Falcon Perception,google最新提出的Gemma4等。不论什么做法,最终的目的都是将图片转为1D序列。
(2)多模态特征拼接
这一步很简单,根据输入的顺序来对不同模态的embedding进行拼接
最终进入 LLM 的 embedding 可以写成:
3 多模态位置编码设计
经过上述处理后,已经将多模态的输入都统一成1D的序列,解决了不同模态如何输入到同一个LLM的问题。我们知道对于Transformer而言,self-attention对输入序列满足置换等变性(Permutation Equivariance),无法感知token得绝对位置/相对位置。因此LLM模型中会额外对输入序列引入位置编码,来使self-attention的计算能感知到位置信息。
对于LLM的CausalTransformer而言self-attention的计算会额外引入causal mask,causal mask也会打破self-attention的置换等变性,从而为模型提供隐式的位置线索(NoPE对此现象做了系统研究)。但目前主流的LLM还是会加入显式位置编码,从归纳偏置(inductive bias)的角度看,位置编码为模型提供了序列结构的先验知识,能够降低位置关系的学习难度。同时,大量实验结果也表明,额外添加位置编码不论从训练效率还是从模型性能而言都有一定的提升。
目前的LLM大多以RoPE(Rotary Position Embedding)及其各种变体。
对于RoPE的相关详细知识,文本不会深入探讨,感兴趣的读者,可以参考阅读笔者之前的相关博客
3.1 Vanilla 1D RoPE
我们知道,self-attention的核心需要通过的点乘来计算相关度。RoPE的位置编码的作用是让引入了位置编码的向量点乘后蕴含相对位置编码关系,即
- 是位置索引。
根据前文的描述,现有的多模态架构,图片、文本经过各自的tokenizer后会沿着序列维度拼接成1个1D得多模态序列,既然其输入的维度与标准的LLM一致,那么是否能直接沿用LLM的位置编码设计呢?
答案是可以,这种位置编码方式一般称作Vanilla 1D RoPE。
为什么深入理解这个问题,我们系统探究下image-tokenize的过程,即图片是怎么从一个的矩阵变成1D的序列

从上图可见,图片从像素空间变为1D序列主要通过patchify和flatten两个操作,vision transformer和projector只会改变图片token的表征,不会改变顺序。
下图具体展现了flatten后(按照raster scan的方式),图片token对应(width,height)的位置信息。(视频的话还有个temporal的轴)。

从上图不难得出
对于采用raster scan方式展平成1D的图片而言,展平后的1D位置与在原始宽高坐标系的位置,满足如下关系
根据上式,我们可以计算其中两个视觉token的相对位置
从中可见,两个图片token的位置差与3个因素有关
- 高度相对位移:
- 宽度相对位移:
- 宽度方向的网格大小:
对于任意分辨率的多模态模型而言,输入的image width是动态的,这将导致宽度方向的网格大小是可变的。因此,同样的2D相对位置关系,在flatten后,可能对应不同的1维相对位置。
举个例子

红、蓝所代表的patch(上下相邻),其在2D网格的相对位移为
但在1D序列的位置差为(根据式7)
总结一下Vanilla 1D RoPE:
优点 | 缺点 |
实现简单 | 对于不同分辨率的图片而言,在2D网格同样的相对位置关系,映射到1D后,不是一个稳定的相对位移。模型需要额外的学到这种pattern。 |
如果是decoder迁移已有的LLM,位置编码与原本完全兼容,能较大限度保留LLM的原有能力。 | 如果多模态的输入图片分辨率很大,亦或涉及到多图输入或者视频输入(也可以当做多图处理,需要设计一下temporal维度的变化),位置编码的增长速度会很快。 |
3.2 从1D-RoPE到3D RoPE
3.2.1 3D RoPE算法原理
针对 Vanilla 1D RoPE的缺点。目前的多模态模型大多采用3D-RoPE的形式(如qwen-VL,falcon-perception等)。一般至少遵循以下2个设计原则:
- 在文本位置的位置编码能够兼容1D-RoPE,从而尽量保留原有LLM的能力。
- 在图片/视频位置的编码能够保留其几何相对位置结构。
从理论层面,很容易将1D-RoPE扩展到3D-RoPE。
最直觉且有效的做法,直接将的特征向量划分为3个子向量,分别编码1D-RoPE。
假定为在序列位置处的query,其3D的坐标是
- 分别表示作用在三个子空间上的RoPE旋转矩阵。
同样假定为在序列位置处的key,其3D坐标为,他们的点乘计算如下:
- 是旋转矩阵的一个性质。
通过将,的特征向量划分3个子向量,并分别对这3个子空间编码位置为的一维RoPE,使其点乘后的结果显式依赖三个方向的相对位移,这就是3D-RoPE的核心算法思想。从中不难看出,对于3D-RoPE而言,sequence仍然是一维的,但position id可以是3维的
3.2.2 如何分配频率
在上面的理论推导中,我们有一个默认的假设:将query/key通道前1/3的特征用于编码,中间1/3的特征编码,后1/3的特征编码,不妨表示为:
注意,即使通道数无需强制被3整除,比如通道数为10,可以认为划分分配的section[3,3,4]
这样的分配每个轴只拿到某一段连续的频谱,可能限制其只能感知到某个尺度的位置关系,在《Revisiting Multimodal Positional Encoding in Vision-Language Models》中提出了2种RoPE的变体来解决full-frequency utilization问题。
MRoPE-I
其一是交替编码,这样每个轴都能在完整频谱上均匀采样到高、中、低频,形如:
RoPE是按照2维pair旋转的,故是这种chunk为2的交替循环方式。
MHRoPE
其二是不同的attention head的query,key只编码1个轴的信息。比如说1-2的head编码,3-5的head编码,6-8的head编码。
3.2.3 如何分配3D-Position ID
对于一个多模态序列而言,其输入到LLM中是1维,但我们可以给每一个index 赋予一个3维的位置信息。通常的设计原则有:
- 纯文本输入时,能够退化为1D-RoPE,从而尽量保留预训练LLM的先验
- 在图片/视频位置的编码能够保留其几何相对位置结构
- 多个文本/视觉块交错时,position id 不会产生混淆,能正常接续。
这个问题的解决方案有很多,笔者这里陈列一些方案,为了便于理解,以前文的多模态VQA的例子具体说明

方案1: 独立考虑和
若预训练的LLM本身时partial-RoPE,一半编码时序信息,一半没有时序信息。那么保留原有时序RoPE子空间不变,用LLM中原本未参与RoPE的位置子空间来承载空间坐标编码,如falcon-perception的做法。
方案2: 联合考虑,以qwen-vl的mrope为例
在qwen-VL及大多多模态模型中,将文本token的位置设置在对角线轴,即
- 为位置处的文本token
显然,当为纯文本输入时,3D position id退化为原本的1D position id。
下面来看多模态序列交错时的位置编码排布方式:

从上图可见,前面文本共有 6 个 token,它们的位置为:
接下来进入图片 token。图片可以看作帧数为1的视频,因此每个图片 token 的局部几何坐标可以写成:
其中 分别表示该token在图片网格中的行坐标和列坐标。
标准 MRoPE 不会直接使用局部坐标 ,而是会给三个轴都加上一个全局 offset :
这里的表示当前视觉块在全局position id空间中的起点。它通常取为前面所有token已经使用过的最大position id加1:
因此图片块的 offset 为
再根据式15,就可以算出所有图片的3D坐标(可见前面的示意图)
这样做有两个好处:
- 图片内部的局部几何结构仍然被保留下来。比如水平相邻 token 的相对位置是 (0,0,1),垂直相邻 token 的相对位置是 (0,1,0)。
- 图片token的position id被整体平移到文本之后,避免和前面的文本token发生位置重叠。
图片块结束后,后续文本 token 继续沿对角线方向排列。同样为了不发生位置重叠,需要加入offset,即从当前视觉块最大 position id加1作为起始。
当然还有很多别的方案,此处不再赘述,核心思想都类似。
小结
本文相对系统的介绍了多模态位置编码的设计。如果疏漏错误之处,欢迎指出~
- 作者:莫叶何竹🍀
- 链接:http://www.myhz0606.com/article/vllm_any_resolution_pos
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章






