一个大语言模型(LLM)的世界是由 token 构成的——一串离散的符号,每个都对应词表里的一项。它从不「看见」任何东西,它只是在预测下一个 token。那么,要让这样一个纯文本的大脑理解一张照片,核心难题只有一个:怎样把一张连续的、二维的图像,变成 LLM 能吞下的那种 token?
这个问题的不同答案,几乎决定了一个视觉语言模型的全部性格。这篇文章会从这个最根本的问题出发,先搭起所有 VLM 共享的通用骨架,再分别拆开 LLaVA 与 Qwen2-VL 的内部结构逐一对照,最后把镜头拉远,看看它们在整个多模态领域演化版图里各自站在哪里。读完你会发现,它们的差异不是细节之争,而是两种设计哲学的分野。
抛开细节,几乎每一个现代视觉语言模型都是同一个三明治结构:一个视觉编码器负责看,一个语言模型负责说,中间夹着一个连接器(connector)负责翻译。连接器是整个故事的关键——它把视觉世界的表示,翻译成语言世界的「方言」。
视觉编码器几乎都是 Vision Transformer(ViT)。它的第一步叫 patchify——把图像切成一个个固定大小的小方块(patch),每个 patch 被压成一个向量。一张图于是变成一串向量,正好对应 LLM 眼里的一串 token。patch 越小、图越大,token 就越多。
LLaVA(Large Language and Vision Assistant)是 2023 年奠定整个范式的作品。它的设计哲学可以用两个字概括:简单。视觉编码器用现成的 CLIP,连接器只是一个小小的多层感知机(MLP),其余全交给 LLM。正是这种极简,让它成为最适合入门、也最常被复现的基线。
这个数字不是魔法,而是直接算出来的。CLIP ViT-L/14 的 patch 边长是 14 像素,输入边长是 336:
# 每条边的 patch 数 336 ÷ 14 = 24 # 二维网格的 patch 总数 = 视觉 token 数 24 × 24 = 576 个 token
记住这个心算方法(边长 ÷ patch_size,再平方),后面看 Qwen2-VL 时你会用同样的方法,算出一个完全不同的、会浮动的数字。
LLaVA 的训练分两步,理解这两步对你做后训练(尤其是 SFT 阶段)非常重要,因为它决定了「哪些部件被冻结、哪些被更新」。
初代 LLaVA 的连接器只是一个线性层。LLaVA-1.5 做了三个朴素但有效的升级:把连接器换成 2 层 MLP、提高输入分辨率到 336、并加入大量学术 VQA 数据。再后来的 LLaVA-NeXT(1.6) 引入了 AnyRes——把高清大图切成几块分别过 ViT——这其实是在为「固定分辨率」这个原罪打补丁,也预示了下一代模型的方向。
如果说 LLaVA 的哲学是「把世界裁剪成我能处理的样子」,那 Qwen2-VL 的哲学正好相反:让模型去适应世界本来的样子。这个转变带来三项核心创新:动态分辨率、token 合并、以及多模态位置编码 M-RoPE。
让 ViT 接受任意分辨率,有一个隐藏的麻烦:传统 ViT 用的是绝对位置编码——它预设了「图就是 24×24 个 patch」,一旦 patch 数量会变,这套固定的位置表就失效了。Qwen2-VL 的解法是:删掉 ViT 里的绝对位置编码,换成 2D-RoPE(二维旋转位置编码),用相对的、可外推的方式表达「第几行第几列」,这样不管多少个 patch 都能正确编码空间位置。
动态分辨率有个副作用——大图会产生海量 token,把 LLM 的上下文撑爆。Qwen2-VL 在 ViT 之后接一个小 MLP,把相邻的 2×2 共 4 个 patch 压缩成 1 个 token,token 数直接砍掉 4 倍,再用 <|vision_start|> 和 <|vision_end|> 把这段视觉 token 包起来。
这是 Qwen2-VL 最优雅的一笔。普通 LLM 的位置编码(1D-RoPE)只有一个维度——「第几个 token」,这对一行文字够用,但对一张二维的图、一段三维的视频(高 × 宽 × 时间)就太贫乏了。M-RoPE(多模态旋转位置编码)把位置拆成三个分量:时间、高、宽,让同一套机制能同时表达三种模态的位置。
把两者放在一起,差异就清晰了。注意:这不是「谁更先进」的排名,而是两套针对不同优先级的取舍。LLaVA 押注简单与可复现,Qwen2-VL 押注保真与统一。
| 维度 | LLaVA / LLaVA-1.5 | Qwen2-VL |
|---|---|---|
| 分辨率处理 | 强制缩放到固定 336×336固定 | 保留原生分辨率,任意尺寸动态 |
| 视觉 token 数 | 恒定 576 个 | 随图浮动,从几十到数千 |
| ViT 位置编码 | CLIP 自带的绝对位置编码 | 改造为 2D-RoPE(支持任意尺寸) |
| LLM 位置编码 | 标准 1D-RoPE | M-RoPE(时间/高/宽 三分量) |
| 连接器 | 2 层 MLP | 2×2 合并的 MLP(同时压缩 token) |
| 视觉编码器 | 现成的 CLIP ViT-L/14,训练中冻结 | 自研 ~675M ViT,与 LLM 联合训练 |
| 视频支持 | 原生不支持(需外挂方案) | 原生支持,视频=带时间维的图像 |
| 擅长场景 | 通用图文问答、研究基线 | 高清文档/表格/长截图、多图、视频、Agent |
| 设计哲学 | 把世界裁剪成模型的样子 · 极简 | 让模型适应世界的样子 · 保真 |
LLaVA 与 Qwen2-VL 不是孤立的两个点,而是两条更大演化脉络上的坐标。理解这些脉络,你就能把任何一个新出的 VLM 快速归位。这里有两条主轴特别值得记住:连接器怎么设计,以及分辨率怎么处理。
「怎么把视觉特征接进 LLM」这件事,业界尝试过四类思路,各有取舍:
如果把「模型怎么对待图像尺寸」按时间排开,会看到一条清晰的进化路线——而 LLaVA 与 Qwen2-VL 正好是这条线上前后相邻的两代:
如果你后面要上 7B 版本,值得知道 Qwen2.5-VL 在 2-VL 基础上的几个增量:把视频的「固定采样」升级为动态帧率(dynamic FPS)采样、给 ViT 引入window attention 降低高分辨率下的计算量、并加入绝对时间编码让模型对「事件发生在视频第几秒」更敏感。方向很一致——沿着「原生、统一、高效」继续走,建立在你已理解的 2-VL 三大改造之上,不会推翻它们。
架构差异不只是知识点,它会实实在在地影响你训练时的每一个旋钮。如果你选 Qwen2-VL 做基座(这是个好选择),下面几条是你迟早会撞上的:
因为 token 数随分辨率浮动,你在训练框架里会看到一个 MAX_PIXELS(或 min/max pixels)参数——它本质是给「一张图最多产生多少 token」设上限。调大 = 看得更清但更吃显存,调小 = 省显存但可能糊掉文档细节。这是 LLaVA 时代不存在的旋钮,因为那时 token 数是写死的 576。
在 LLaVA 上,每条样本的视觉部分都是 576 token,长度可预测;在 Qwen2-VL 上,一条带高清大图的样本可能瞬间吃掉几千 token。做 batch、估算 max_length、排查 OOM 时,这个差异是头号嫌疑人。
如果你的偏好对齐任务涉及密集文字、细密图表或视频理解,Qwen2-VL 的原生高分辨率和视频支持会让你少打很多补丁。反过来,如果只是通用图文问答的研究基线,LLaVA-1.5 的简单和海量现成复现资料反而省心。
MAX_PIXELS(2×2 合并),理解为什么它能统一处理多图时你要懂 M-RoPE。架构不是背景,它是你每天要拧的旋钮。
LLaVA 用极致的简单证明了「投影 + 指令微调」这条路走得通,它是整个领域的地基,也是最好的入门教材。Qwen2-VL 则把复杂度从外部(缩放、切块)吸收进架构内部(动态分辨率、M-RoPE),换来了对真实世界更高的保真度和对图、文、视频的统一处理。
它们看起来对立,其实指向同一个方向——让模型越来越贴近世界本来的样子,而不是反过来。当你理解了「图像如何变成 token」这一个根问题,以及围绕它的两条主轴(连接器、分辨率),你就握住了读懂几乎任何一个新 VLM 的钥匙。
[1] Qwen2-VL · Enhancing Vision-Language Model's Perception of the World at Any Resolution — 2409.12191 · arxiv.org/abs/2409.12191
[2] Qwen2.5-VL Technical Report — 2502.13923 · arxiv.org/abs/2502.13923
[3] LLaVA · Visual Instruction Tuning (NeurIPS'23) — 2304.08485 · arxiv.org/abs/2304.08485
[4] LLaVA-1.5 · Improved Baselines with Visual Instruction Tuning — 2310.03744 · arxiv.org/abs/2310.03744
[5] CLIP · Learning Transferable Visual Models From Natural Language Supervision — 2103.00020 · arxiv.org/abs/2103.00020
[6] ViT · An Image is Worth 16x16 Words — 2010.11929 · arxiv.org/abs/2010.11929
[7] BLIP-2 (Q-Former) — 2301.12597 · arxiv.org/abs/2301.12597
[8] Flamingo (交叉注意力) — 2204.14198 · arxiv.org/abs/2204.14198
[9] NaViT · Patch n' Pack: Native Resolution ViT — 2307.06304 · arxiv.org/abs/2307.06304