概述
Large Language Model (LLM) 和 Vision Language Model (VLM) 是当前 AI 领域最重要的两类模型。本文将先从 Transformer 架构出发,深入讲解 multi-head attention 机制,再过渡到 VLM 的设计思路和关键技术。
Transformer 架构
从 RNN 到 Transformer
在 Transformer 出现之前,序列建模主要依赖 RNN (Recurrent Neural Network) 及其变体 LSTM、GRU。RNN 的核心问题是串行计算:每个时间步的隐藏状态依赖前一步的输出,无法并行化,训练效率极低。此外,RNN 面临严重的 long-range dependency 问题——当序列长度增加时,梯度消失/爆炸使得模型难以捕捉远距离的 token 之间的依赖关系。
2017 年,Vaswani 等人提出了 “Attention Is All You Need”,彻底抛弃了循环结构,仅依赖 attention 机制实现序列建模。Transformer 的核心贡献在于:
- 并行计算:所有 token 同时输入,消除了时间步的依赖
- 长程依赖:self-attention 让每个 token 直接关注所有其他 token,路径长度为 O(1)
- 可扩展性:得益于并行化和可堆叠的层结构,模型可以扩展到数十亿参数
Encoder-Decoder vs Decoder-only
原始 Transformer 是 encoder-decoder 结构:
- Encoder:将输入序列映射为连续表示(contextualized representation)。每层包含 self-attention + FFN,每个位置都能看到整个输入序列(bidirectional attention)
- Decoder:基于 encoder 输出和已生成的 token 逐步生成新 token。每层包含 masked self-attention + cross-attention (attend to encoder) + FFN
现代 LLM 主要分为三类架构:
| 架构 | 代表模型 | 特点 |
|---|---|---|
| Encoder-Decoder | T5, BART | 适合 seq2seq 任务(翻译、摘要) |
| Encoder-only | BERT | 双向理解,适合分类、NER |
| Decoder-only | GPT系列, LLaMA, Qwen | 自回归生成,当前主流 |
Decoder-only 架构成为主流的原因:它统一了理解和生成任务,scaling law 表现最优,且推理时只需简单的 autoregressive decoding。
Input Embedding & Positional Encoding
Transformer 不包含任何循环或卷积结构,因此必须显式地注入位置信息。
Token Embedding:将每个离散 token 映射为 d_model 维的连续向量。通常使用 learned embedding table。
Positional Encoding:原始 Transformer 使用固定频率的 sin/cos 函数:
$$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right), \quad PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$这种编码的优点是:可以外推到训练时未见过的序列长度。现代 LLM(如 LLaMA)更多使用 RoPE (Rotary Position Embedding),它直接在 attention 计算中融入相对位置信息,而非加在 embedding 上。
Self-Attention 机制
Self-attention 是 Transformer 最核心的组件。对于输入序列中的每个 token,self-attention 计算它与所有其他 token 的关联强度,然后加权聚合信息。
具体来说,每个 token 通过线性变换得到三个向量:Query (Q)、Key (K)、Value (V)。Attention 的计算过程是:
- 每个 token 的 Q 与所有 token 的 K 做点积,得到 attention score
- 通过 softmax 归一化为概率分布
- 用这个分布对 V 进行加权求和
公式形式:
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$其中 d_k 是 key 向量的维度。除以 sqrt(d_k) 是为了防止点积结果过大导致 softmax 梯度饱和。
Feed-Forward Network (FFN)
每个 attention 层之后连接一个 position-wise FFN。它是一个两层的 MLP:
$$ \text{FFN}(x) = W_2 \cdot \sigma(W_1 x + b_1) + b_2 $$其中 sigma 是激活函数(ReLU / GELU / SwiGLU)。FFN 的作用是:在 attention 完成 token 间的信息交换后,对每个 token 独立地进行非线性变换,增强模型的表达能力。
现代 LLM 中,FFN 的 hidden dimension 通常是 d_model 的 3-4 倍(例如 LLaMA 的 4096 -> 11008),因此 FFN 占据了模型参数的大头(约 2/3)。
Layer Normalization & Residual Connection
Transformer 依赖两个关键设计来稳定训练:
Residual Connection(残差连接):每个子层(attention 或 FFN)的输出加上其输入:
$$ \text{output} = x + \text{Sublayer}(x) $$这使得梯度可以无损地流过深层网络,解决了深层网络的退化问题。
Layer Normalization:在 d_model 维度上做归一化,均值为 0、方差为 1:
$$ \text{LayerNorm}(x) = \gamma \cdot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta $$原始 Transformer 使用 post-norm(子层之后做 norm),而现代 LLM(GPT-2 之后)更倾向于 pre-norm(子层之前做 norm),训练更稳定。
Multi-Head Attention
Scaled Dot-Product Attention
前文已经给出了 attention 的基本公式。这里深入理解每个组件的含义:
- Query (Q):当前 token “想找什么” 的表示。例如,“苹果” 这个 token 的 Q 可能关注 “颜色”、“味道” 等属性
- Key (K):每个 token “有什么” 的表示。例如,“红色” 的 K 可能标记自己是一种颜色属性
- Value (V):每个 token “提供什么信息”。如果 Key 与 Query 匹配,对应的 Value 就被加权加入到输出中
Q 和 K 的点积衡量了 query 和 key 之间的相似度。softmax 将其转换为概率分布,表示每个 token 对当前 token 的重要性权重。
为什么要除以 sqrt(d_k)?
假设 Q 和 K 的元素都是独立标准正态分布(均值为 0,方差为 1),则 QK^T 中每个元素的方差是 d_k。当 d_k 很大时,点积的绝对值会很大,导致 softmax 进入梯度极小的饱和区域(接近 one-hot 分布)。除以 sqrt(d_k) 将方差重新缩放为 1,使 softmax 保持在梯度敏感的 region。
Multi-Head Attention
单头 attention 的限制在于:所有信息被压缩到一个 attention 分布中,模型只能关注一种关系模式。例如,在句子 “那只狗追猫,因为它跑得很快” 中,“它” 可能指代 “狗”(跑得快),也可能指代 “猫”(在被追所以跑)。单一 attention 无法同时捕捉这两种可能的指代关系。
Multi-Head Attention 通过并行运行多个独立的 attention 计算来解决这一问题:
$$ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h) W_O $$其中每个 head 独立计算:
$$ \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) $$每个 head 的 Q、K、V 维度缩小为 d_k = d_model / h(h 是 head 数量),使得总计算量与单头一致。
不同 head 在实践中会学习到不同的模式:
- 某些 head 关注语法关系(主语-谓语)
- 某些 head 关注 positional proximity(相邻 token)
- 某些 head 关注语义相似性
- 某些 head 关注跨越长距离的指代关系
例如,在 “The cat sat on the mat because it was comfortable” 中,一个 head 可能把 “it” 指向 “mat”(mat 是舒适的),另一个 head 把 “it” 指向 “cat”(cat 坐在上面很舒适)。
Masked (Causal) Attention
在 decoder-only 模型中,生成第 i 个 token 时只能看到前面的 token(1 到 i-1),不能看到未来的 token。这通过 causal mask 实现:
在 softmax 之前,将未来位置的 attention score 设为 -inf,使得 softmax 后这些位置的权重为 0:
$$ \text{MaskedAttention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right)V $$其中 M 是一个上三角矩阵,上三角部分为 -inf,下三角为 0:
$$ M_{ij} = \begin{cases} 0 & i \geq j \\ -\infty & i < j \end{cases} $$这保证了 autoregressive generation 的因果性:每个 token 只能 attend 到自己和之前的 token。
From LLM to VLM
- Language: $L\times 1$ tensors
- Image: $H\times W\times C$ tensors
- Tokenize image into patches $P\times P\times C$ where $H/P \times W/P = N$ patches
- Flatten patches into $N\times (P^2 \cdot C)$ tokens
- Vision Encoder (ViT/ResNet) maps $N\times (P^2 \cdot C)$ tokens to $N\times d_{model}$ embeddings
- Put into LLM as visual tokens
- Output Text.
- OCR: Same to VLM, but the image should be divided into text regions, and each region is processed by VLM to extract text features, which are then fed into LLM for further processing.
- Video: $T\times H\times W\times C$ tensors
Reference: Qwen3-VL
Text-only LLM 的局限
虽然 LLM 在文本理解和生成上表现出色,但现实世界的信息是多模态的:
- 图片包含的信息远超过文字描述:“A picture is worth a thousand words”
- 视频、音频、表格等非文本数据无法被纯文本模型处理
- 很多任务天然需要视觉理解:看图问答、图文生成、视觉推理
纯文本 LLM 通过 prompt “描述这个图片” 无法真正理解图像——它没有 visual grounding。
多模态的动机
VLM 的设计目标是:让模型同时理解视觉信息和文本信息,并能进行跨模态的推理和生成。
核心应用场景:
- Image Captioning:给图片生成文字描述
- Visual Question Answering (VQA):根据图片回答问题
- OCR-Free Document Understanding:直接理解扫描文档、图表、公式
- Multi-turn Visual Dialogue:基于图片进行多轮对话
早期探索:Contrastive Learning
在 VLM 成熟之前,CLIP (Contrastive Language-Image Pre-training) 奠定了视觉-语言对齐的基础:
- 使用大规模的 image-text pairs(4亿对)
- 分别用 image encoder(ViT/ResNet)和 text encoder(Transformer)将图像和文本映射到同一 embedding space
- 通过 contrastive loss 拉近匹配的 image-text pair,推远不匹配的 pair
- 学到的 embedding 具有 zero-shot 能力:可以直接用于图像分类、检索
ALIGN 是 Google 的类似工作,使用更大规模(10亿对)但更 noisy 的数据,验证了 scaling 的有效性。
但 CLIP 的问题在于:它只是一个 alignment model,不具备生成能力——它不能基于图像生成文本回复。
实例解读:Qwen3-VL 源码设计
上文讨论了 VLM 的理论框架,这里通过 HuggingFace Transformers 中 modeling_qwen3_vl.py 的源码来观察一个生产级 VLM 的实际实现。以下分析基于 Qwen3-VL 的 HuggingFace 实现,涵盖 vision encoder、decoder、multimodal fusion 三大模块。
整体模块划分
modeling_qwen3_vl.py 定义了以下几个核心类,层次分明:
| 类名 | 角色 | 输入模态 |
|---|---|---|
Qwen3VLVisionModel | Vision encoder | image, video |
Qwen3VLTextModel | Text decoder | text (+ deepstack visual features) |
Qwen3VLModel | 融合器:串联 vision + text | image, video, text |
Qwen3VLForConditionalGeneration | 顶层生成模型(+ lm_head) | 全部 |
Vision Encoder:从图像到 visual tokens
Qwen3VLVisionPatchEmbed 使用 Conv3d 做 patch embedding。视频比图像多一个 temporal 维度,所以 kernel size 是 (temporal_patch_size, patch_size, patch_size) 的三维卷积。对单张图片而言 temporal_patch_size=1,等价于 2D Conv。
Qwen3VLVisionRotaryEmbedding 为 visual tokens 提供 2D 位置编码。与 LLM 的 1D RoPE 不同,vision 的 position ids 是二维的(grid_thw 中的 height 和 width 坐标),编码了 patches 在图像平面内的空间位置。
Qwen3VLVisionBlock 是 vision encoder 的基本层,结构与 LLM decoder layer 对称:
hidden_states + self.attn(norm1(hidden_states))
+ self.mlp(norm2(hidden_states))
即 pre-norm + residual connection。其中 Qwen3VLVisionAttention 支持三种 attention backend(eager、sdpa、flash_attn),通过 ALL_ATTENTION_FUNCTIONS 接口统一调度。
Qwen3VLVisionPatchMerger 位于 vision encoder 的输出端,负责将 dense visual tokens 压缩为 LLM 可接受的 embedding。
DeepStack 是 Qwen3-VL 的一个重要设计:在 vision encoder 的多个中间层(由 deepstack_visual_indexes 指定)额外输出 feature maps,通过独立的 deepstack_merger_list 映射后,在 text decoder 的前几层注入到 hidden states 中。这种设计来自 DeepStack 论文,让 LLM 的低层直接获取多尺度的视觉信息,而不必完全依赖最后一层的压缩表示。
Text Decoder:标准 LLM + multimodal RoPE
Qwen3VLTextDecoderLayer 实现了标准的 decoder-only Transformer layer:
hidden_states = norm + self_attn + residual
hidden_states = norm + mlp + residual
值得注意的是 Qwen3VLTextAttention 在 QKV projection 之后对 Q 和 K 额外执行了 head-wise RMSNorm:
| |
这种 QK Normalization 在训练时稳定了 attention logits 的分布,是 Qwen 系列的一个特色。
Qwen3VLTextRotaryEmbedding 实现了 M-RoPE (Multimodal RoPE)。传统 RoPE 使用 1D position ids,但视觉 token 需要三维位置编码(temporal T、height H、width W)。M-RoPE 的 inv_freq 被扩展为 3 路:
| |
apply_interleaved_mrope 方法将三组 position frequency 按 mrope_section(如 [24, 20, 20])交错排列,使不同维度对应不同的 frequency range,最终每个 head 同时编码了空间和时序位置信息。
Fusion:视觉特征注入 LLM
Qwen3VLModel.forward() 是核心融合逻辑:
Input: pixel_values + input_ids
|
v
1. Vision Encoding (self.visual)
patch_embed -> Transformer blocks -> patch_merger
-> image_embeds (pooler_output) + deepstack features
|
2. Embedding Replacement (masked_scatter)
用 image_embeds 替换 input_ids 中的 <image> placeholder token
|
3. DeepStack Injection
visual_pos_masks 定位 visual tokens 的位置
将 deepstack features 逐层加到 text decoder 的 hidden states 上
|
4. 3D Position Encoding
compute_3d_position_ids() 根据 grid_thw 生成 (3, batch, seq_len) 的 M-RoPE 位置
|
5. Text Decoder (self.language_model)
处理 fused embeddings,生成输出 hidden states
|
6. lm_head 映射为 logits(在 Qwen3VLForConditionalGeneration 中)
Embedding replacement 的关键代码:
| |
masked_scatter 将 inputs_embeds 中 <image> token 对应的位置替换为 image_embeds。视觉特征的维度由 grid_thw 决定——grid_thw 记录了每张图片的 (T, H, W) 在 patch embedding 后的网格尺寸,通过 prod(-1) // spatial_merge_size**2 计算出 visual token 总数。
DeepStack 的注入逻辑在 Qwen3VLTextModel._deepstack_process() 中:
| |
这是一次 additive injection:从 vision encoder 中间层提取的特征直接加到 text decoder 对应层的 visual token 位置上,不改变 attention 的 causal mask,也不引入额外的 cross-attention。
Generation 特殊处理
Qwen3VLForConditionalGeneration 重载了多个 generation 相关方法:
prepare_inputs_for_generation:在is_first_iteration=False(即已有 past_key_values)时,将pixel_values和pixel_values_videos置为 None,避免重复编码视觉特征_prepare_position_ids_for_generation:先生成 3D position ids,再与 text position ids 拼接为(4, batch, seq_len)(4 对应 text + T + H + W 四路)_expand_inputs_for_generation:当 batch expansion(如 beam search)时,需要同时扩展pixel_values和grid_thw,且图像和视频的扩展方式不同——图像/视频 token 数由grid_thw的 T、H、W 乘积决定,不能简单地重复整个 tensor
设计总结
Qwen3-VL 的代码设计体现了以下几个关键模式:
- Modular 分层:Vision encoder、Text decoder、Fusion 三层的职责清晰分离,各自独立测试和复用
- DeepStack 多尺度融合:不依赖 single-pass 的最后一层视觉表示,而是将多层视觉特征渐进式注入 LLM,有效缓解信息丢失
- M-RoPE 统一位置编码:使用 3D position ids 同时编码文本、图像和视频的空间/时序位置,避免为不同模态设计独立的位置编码方案
- Kernelized Attention:通过
ALL_ATTENTION_FUNCTIONS接口和use_kernel_func_from_hub装饰器,灵活切换 eager / sdpa / flash_attn 三种 attention 实现,无需修改模型结构 - Generation 兼容:通过重载 HuggingFace 的
GenerationMixin钩子,保证多模态模型在 beam search、contrastive search 等 generation 策略下的正确行为
VLM 架构设计
典型 Pipeline
现代 VLM 遵循一个统一的 pipeline:
Image --> Vision Encoder --> Connector --> LLM --> Text Output
^
|
Text Input
三个核心组件:
- Vision Encoder:将图像编码为 visual features
- Connector:将 visual features 映射到 LLM 的 embedding space(对齐)
- LLM:接收融合后的 visual + text embedding,生成回复
Vision Encoder
ViT (Vision Transformer) 是目前最主流的 vision encoder。它将图像分割为固定大小的 patches(如 14x14 pixels),将每个 patch 线性投影为 token embedding,然后通过标准的 Transformer encoder 处理:
Image (224x224) --> 16x16 patches --> 196 tokens --> Transformer --> [CLS] token as image representation
ViT 的优势在于:和 LLM 共享 Transformer 架构,天然适合跨模态融合。
ResNet 是更传统的 CNN 架构,效率高但特征不如 ViT 丰富。一些 VLM 混合使用两者(如 InternVL 使用 ViT + 额外的卷积下采样层)。
Connector 设计
Connector 是 VLM 的核心创新所在,它决定了 visual features 如何与 LLM 的世界模型融合。
1. MLP Projector (LLaVA 系列)
最简洁的方案。将 vision encoder 输出的 visual tokens 通过一个轻量 MLP 映射到 LLM 的 embedding space:
Visual Tokens --> Linear --> GELU --> Linear --> LLM Embedding Space
优点:简单、高效、训练速度快 代表模型:LLaVA, LLaVA-NeXT, Qwen-VL
LLaVA 的核心公式:
$$ H_v = W \cdot \text{ViT}(I) + b \quad \text{(projector)} $$$$ H = [H_v, H_q] \quad \text{(concat visual tokens + text tokens)} $$$$ \text{Response} = \text{LLM}(H) $$2. Q-Former (BLIP-2)
更复杂的方案。使用一个轻量 Transformer(Q-Former)来 queries visual features,从中提取与文本最相关的信息:
- Q-Former 包含一组 learnable queries(如 32 个)
- 这些 queries 通过 cross-attention 从 vision encoder 的输出中提取信息
- 输出的 queries 再通过 MLP 映射到 LLM 输入空间
Q-Former 的优点是:压缩了视觉信息(32 tokens vs ViT 的 256+ tokens),计算效率高,且能过滤掉不相关的视觉信息。
代表模型:BLIP-2, InstructBLIP
3. Resampler
类似于 Q-Former,使用一组 learnable queries 对 visual features 进行 resample,输出固定数量的 visual tokens。常见于 Flamingo 和 OpenFlamingo 等工作。
Training Stages
VLM 的训练通常分为两个阶段:
Stage 1: Vision-Language Alignment Pre-training
目标:让 connector 学会将 visual features 映射到恰当的 LLM embedding space
数据:大规模 image-caption pairs (来自 LAION, CC3M/12M, SBU Captions)
训练方式:
- 冻结 vision encoder 和 LLM,只训练 connector
- 使用 language modeling loss(predict next token)
- LLaVA 使用简单的 captioning 任务
Stage 2: Instruction Tuning
目标:赋予模型遵循视觉指令的能力
数据:高质量的 visual instruction data(VQA pairs, multi-turn conversations)
训练方式:
- 冻结 vision encoder,训练 connector + LLM(全参数或 LoRA)
- 使用 multi-turn conversation format
数据构建:LLaVA 使用 GPT-4 generate 高质量的 visual instruction data,包括:
- Conversation:多轮对话
- Detailed description:详细描述
- Complex reasoning:复杂推理
代表性 VLM
| 模型 | Vision Encoder | Connector | LLM Base | 特点 |
|---|---|---|---|---|
| LLaVA | ViT-L/14 | MLP Projector | Vicuna/LLaMA | 简洁高效,开源标杆 |
| BLIP-2 | ViT-g/14 | Q-Former | OPT/FlanT5 | 信息压缩,训练高效 |
| Qwen-VL | ViT-bigG | MLP + Resampler | Qwen-7B | 中英双语,OCR 强 |
| InternVL | InternViT-6B | Dynamic Resampler | InternLM | 超大 vision encoder |
| CogVLM | ViT | QKV-Matrix | LLaMA | Deep fusion(cross-attention 在每一层) |
当前挑战与趋势
High-Resolution:当前 VLM 大多使用低分辨率图像(224x224),丢失了 OCR、文档理解所需的细节。LLaVA-NeXT 和 Qwen-VL 通过 any-resolution / dynamic resolution 策略支持高分辨率
Multi-Image & Video:扩展到多图和视频输入,需要处理更长的 visual token 序列
Hallucination:VLM 容易产生 visual hallucination,描述不存在于图像中的物体。Grounding 和 fine-grained alignment 是 active research area
Efficiency:Visual tokens 数量远多于 text tokens(如 256 tokens 一张图),推理时计算量大。Token compression、adaptive token selection 是热门方向
Native Multimodality:GPT-4V、Gemini 等模型预示着未来趋势——从设计之初就统一的 multimodal architecture,而非简单的 vision encoder + LLM 拼接
总结
从 Transformer 的 self-attention 机制到 multi-head attention 的并行模式,LLM 奠定了现代 AI 的基石。VLM 在此基础上,通过 vision encoder + connector + LLM 的三段式架构,将视觉理解能力注入语言模型。随着高分辨率支持、hallucination 缓解和 native multimodal 架构的发展,VLM 正快速向通用视觉助手演进。
Image Generation
Diffusion Models by SDE
Preliminary: Stochastic Differential Equations, please refer to the Category: SDE for more details.
Finite-Time Convergence Analysis of ODE-based Generative Models for Stochastic Interpolants