文章链接:https://arxiv.org/pdf/2409.12191
发布时间:2024.09
Copyright (c) Wang-Luning. All Rights Reserved.
Qwen2-VL包括了2B、7B、72B三个版本(vision encoder都是675M,主要是LLM backbone的大小不同)。
Qwen2-VL提供了统一的视频和图像理解框架,能够混合输入图像和视频数据进行理解。架构上总体遵循了Qwen-VL的设计(adapter由cross-attention改成了linear)其主要创新点包括:
原生动态分辨率(Naive Dynamic Resolution)
普通的ViT只能接收固定分辨率的图像(如448*448),这就要求输入图片要处理成单一固定的分辨率,这样处理后图像通常会出现失真,尤其是宽高比差距较大的突破会造成图片扭曲,导致模型对于图像信息难以精确理解:

为了解决这个问题,将ViT中的绝对位置编码改为2D-RoPE来捕捉2D位置信息,并在图片resize时保持其原始宽高比,每个图片会被处理成变长的visual token序列。
然而,相比于原始ViT将所有图片都处理成定长的visual token序列,从而非常容易直接组成batch,不需要padding处理,这里使用的动态分辨率会使得不同图片的visual token序列长度不同。一个直观的想法是模仿文本数据那样对较短的序列做padding,然后把不同图片的序列做成一个batch,但这样效率会比较低。因此,采用NaViT(Native Resolution ViT)的策略,将不同图片的visual tokens打包成一个单一的序列,并在内部通过设置attention mask来避免不同图片之间的相互干扰,然后再使得这些序列长度尽可能一致,从而将多个序列打成一个batch。
另外,为了减小序列长度,提升效率,还会使用一个MLP层(也即adapter)将相邻的2*2 tokens压缩成1个token,然后再输入LLM。
例如,一共有5张图片I1,⋯,I5,它们的长度分别为2,3,4,5,6,设模型设置batch size=2,则可以分别将3个较短的图片pack到一个序列S1={I1,I2,I3}中,2个较长的图片pack到另一个序列S2={I4,I5}中,使得两个序列长度接近,然后再通过少量padding将两个序列长度对齐:
多模态RoPE(M-RoPE)
注:Qwen2-VL的ViT中也由2D绝对位置编码改为了2D RoPE,目的是更好地感知图像,但和本部分无关,本部分讲的是LLM backbone中使用的3D RoPE。(ViT没有使用3D RoPE,或许是因为ViT参数量较小难以处理好video,video主要依赖LLM处理)
由于模型(LLM)需要处理text(1D)、image(2D)、video(3D),因此将LLM中的RoPE分解成temporal、height、width三个部分。video被当成一系列frames组成的序列,而frame内部的image patch tokens(visual tokens)则按照2D RoPE来捕获位置信息。这样相当于每个visual token都具有3d位置坐标(x,y,z)。text只有一个维度,因此3个维度的位置ID保持一致,实际上退化为1D RoPE(x,x,x),image只有两个维度,退化为2D RoPE,其temporal位置值始终保持固定(x,y,c),video有三个维度(x,y,z)。
在具体实现上,对于输入的一个维数为d的visual token,将其切成3段,每段长度为d/3,第1段用x的1D RoPE矩阵Rx,第2段用y的1D RoPE矩阵Ry,第3段用z的1D RoPE矩阵Rz,分别处理后再连接起来,得到的就是3D RoPE的结果(如下图右侧所示)。
当输入为多个模态混合时,每个模态的起始position ID是前面的模态的3D位置ID中最大的ID分量+1得到。如下图中序列一开始是一段视频,其中最大的分量是宽度(3),因此后边跟着的text的首token的位置ID就成了(4,4,4)。如果这个text序列后又跟着一个video序列的话,则其各个维度的position id初始值都是12+1=13,也即各个patch的id为(0+13,0+13,0+13),(0+13,0+13,1+13),⋯

统一的Image和Video理解框架:
本模型能够将images和video进行混合输入。为了尽可能保存video到信息,每秒采样2 frames,并使用3D convolution来对video inputs做特征抽取,来在不增加序列长度的情况下处理更多的video frames。为了确保一致性,每个image被看成2个相同的frames(也即对图像做个复制操作,变成一个时序为2的帧序列)。为了训练高效性,动态地调整每个video frame的分辨率,使得每个video的总token数量不超过16384
Qwen2-VL采用了和Qwen-VL一致的三阶段训练方式,大幅提升了数据质量和数据规模。
附:2D RoPE
上图为原博客的2D RoPE实现方式,也即
而实际上在Qwen2-VL的MRoPE中,做法和标准3D RoPE那种交错的形式不太一样,其是直接把3个维度的位置信息分别施加给了表征向量顺序分块的3个连续段,而不是交错的。以2D为例,设表征向量为
这种做法也沿用到了Qwen2.5-VL中。但Qwen3-VL指出这种顺序分块划分的方式(例如按照时间、高度、宽度顺序分块:[T,T,T,...,H,H,H,...,W,W,W])会导致时间信息全部分布在高频维度上(RoPE的特点是低维高频高维低频,也即[T,H,W,T,H,W,...]),使得位置编码更鲁棒。