视觉表征与多模态
视觉表征
VIT
[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
核心思想:将图像划分为多个固定大小的 Patch,把每个 Patch 看作 NLP 中的一个 Token,通过 线性映射为固定维度的 Patch Embedding,再直接输入标准 Transformer Encoder
传统 CNN:
1 | Image |
ViT
1 | Image |
将二维图像转化成一维 Patch Token Sequence,把图像识别转化为序列建模问题
Patch Embedding
给定输入图像
Patch 数量:
Position Embedding
ViT 在 Patch Embedding 上加入 Position Embedding
原始 ViT 延续 BERT 的设计,在 Patch Token 前加入一个可学习的 [CLS] Token
默认使用可学习的一维位置编码
序列中的每个位置都有一个独立的、可学习的 $D$ 维位置向量
经过多层 Self-Attention 后,[CLS] Token 可以与所有 Patch Token 进行信息交互,最终其输出作为整张图像的表示,用于分类
ViT-B/16 完整流程
1 | Input Image |
现代 VIT
CLS Token 只是获得全局图像表示的一种方式,并不是 Transformer 的必要组成部分
一些后续视觉 Transformer 会直接对 Patch Tokens 进行 Global Average Pooling:
- 不需要额外学习 CLS token
- 训练更加稳定
- 与 CNN 的 Global Average Pooling 类似
局限
虽然 ViT 将 Transformer 引入视觉领域,但存在两个问题:
- Self-Attention 计算量高,随着图像分辨率提高,计算和显存开销增长很快
- 缺少 CNN 的层次化结构
因此后续提出Swin Transformer:通过窗口注意力和层次化结构,让 Transformer 更适合视觉任务
Swin Transformer
[2103.14030] Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
核心思想:通过三个核心设计解决VIT的问题
- Window Attention:降低 Self-Attention 计算量
- Shifted Window:实现不同 Window 之间的信息交互
- Patch Merging:建立层次化信息结构
Patch Embedding
输入图像
1 | Input |
每个 $4\times4\times3$ 的 Patch 被展平成一个长度为 48 的向量
ViT 强调全局的一维 Token sequence;Swin 则保留 Patch 的二维网格结构
Window Partition
Swin 不进行全局 Attention,而是划分局部窗口
1 | [B, 56, 56, 96] |
每张图有 64 个 window,每个 window 有 49 个 token,每个 token 是 96 维
把 Window 合并进 Batch 后就可以把每个 window 当成一个独立的小序列做 Self-Attention
W-MSA
W-MSA:Window Multi-head Self-Attention
1 | ┌───────┬───────┐ |
每个 Window 内部进行 Self-Attention,不同窗口之间不发生交互,使得计算量显著下降 ($O(M^2N)$),也因此需要 Shifted Window
SW-MSA
SW-MSA:Shifted Window Multi-head Self-Attention
下一层不继续使用相同窗口,而是将 Window Partition 平移,移动大小为 $\left\lfloor M/2\right\rfloor$
1 | 原窗口 |
实现跨 Window 信息交流
Swin Block
W-MSA 负责窗口内部建模,SW-MSA 负责跨窗口信息传播
连续两个 Block 分别使用 W-MSA 和 SW-MSA
1 | Swin Block L |
相对位置偏置
Swin 的 Attention 中加入了相对位置偏置 (Relative Position Bias)
Attention 可以写成:
对于视觉空间,这种相对关系非常自然
Patch Merging
ViT 基本保持同一尺度,而 Swin 逐渐降低空间尺寸,同时提升 channel
会在 Swin Block 后下采,下采采用拼接 + Linear 的实现方式
1 | 特征图 |
产生了 CNN 模式的特征金字塔
| ViT | Swin | |
|---|---|---|
| Token形式 | 一维序列 | 二维Feature Map |
| Attention | Global Attention | Window Attention |
| 复杂度 | $O(N^2)$ | $O(NM^2)$ |
| 空间结构 | 弱 | 强 |
| 多尺度 | 无 | 有 |
| Patch数量 | 固定 | 逐层减少 |
| 适合任务 | 分类 | 分类/检测/分割 |
ConvNeXt
核心思想:以经典 ResNet 为基础,引入 Transformer 时代的设计思想,对传统 ConvNet 进行现代化改造,使纯 CNN 达到与 Swin Transformer 相近的性能
与 ResNeXt 没有直接继承关系:
- ResNeXt:通过 Cardinality(多分支)增强 ResNet
- ConvNeXt:重新设计 CNN Block,使其适应现代训练方式
Depthwise Convolution
传统卷积同时完成:
- Spatial Mixing:融合邻域空间信息
- Channel Mixing:融合不同通道的信息
ConvNeXt 将两种操作显式拆开
- Depthwise Conv:每个 Channel 独立进行空间卷积,Channel 之间不发生信息融合
- 1 × 1 Conv:进行 Channel 之间的信息融合
从参数量上来看:
普通卷积
$$ Params=K^2C_{in}C_{out} $$Group Conv (分组 $G = Cardinality$)
$$ \mathrm{Params}=\frac{K^2C_{in}C_{out}}{G} $$Depthwise Conv 可以看作 $G=C_{\text{in}}$,并且通常 $C_{\text{out}}=C_{\text{in}}$
$$ Params=K^2C_{in} $$
相比普通卷积,Depthwise Conv 可以用较少的参数和计算量完成 Spatial Mixing
传统 ResNet Block 主要使用 $3\times3$ Conv,而 ConvNeXt 采用 $7\times7$ Depthwise Conv
使用更大的卷积核,以较低额外计算成本扩大空间感受野
Inverted Bottleneck
传统 ResNet Bottleneck
1 | Input C |
先降维 → Spatial Mixing → 再升维
ConvNeXt 在 Channel Mixing 部分采用类似 Transformer FFN 的 Inverted Bottleneck:
1 | Input C |
先升维 → 非线性变换 → 再降维
类比Transformer:
- $7\times7$ Depthwise Conv:负责 Spatial Mixing
- $1\times1$ Conv / Linear:构成类似 FFN 的 Channel Mixing
ConvNeXt-T Architecture
和 Swin 基本一致
| Stage | Feature Size | Channel | Block数量 |
|---|---|---|---|
| Stage 1 | 56×56 | 96 | 3 |
| Stage 2 | 28×28 | 192 | 3 |
| Stage 3 | 14×14 | 384 | 9 |
| Stage 4 | 7×7 | 768 | 3 |
视觉语言对齐
CLIP
[2103.00020] Learning Transferable Visual Models From Natural Language Supervision
CLIP:Contrastive Language-Image Pre-training
传统视觉分类模型通常学习:
1 | Image |
这类方法通常需要预先定义固定类别,并依赖人工标注的分类数据
核心思想:使用自然语言作为视觉监督信号,同时训练 Image Encoder 和 Text Encoder,将图像和文本映射到同一个多模态向量空间,通过对比学习使匹配的图文表示靠近、不匹配的图文表示远离,解决图像与文本如何进行语义对齐的问题
模型结构
CLIP 由两个 Encoder 构成:
1 | CLIP |
对比学习
训练数据由大量匹配的 (image, text) Pair 构成
一个 Batch 中
分别提取视觉和文本 Feature,进行 L2 归一化,两个 Embedding 的 Dot Product 就等价于 Cosine Similarity
训练目标就是让对角线相似度更高,非对角线相似度更低
对比损失
Similarity 在进入 Softmax 前还会经过缩放
训练时同时优化两个方向:
Image → Text
给定一张图片 $I_i$,在 batch 中所有文本里找到与它匹配的 $T_i$:
Text → Image
给定文本 $ T_i$,在所有图片中找到 $ I_i$:
最终
CLIP 同时优化,形成一个对称的 Contrastive Objective

Zero-shot 分类
CLIP 最重要的能力之一是:下游分类时不需要重新训练一个固定的 Linear Classifier,而是直接使用自然语言描述目标类别
假设一个数据集包含:
1 | dog |
传统分类器:
1 | Image Feature |
而 CLIP 可以直接构造:
1 | "a photo of a dog." |
分别经过 Text Encoder
1 | Text Prompt |
这些 Text Embedding 就可以看成 Classification Weight
Text Encoder 可以理解为根据自然语言动态生成 Linear Classifier 的权重
Prompt Engineering
如果直接将 dog 输入 Text Encoder,效果并不是最好
因为 CLIP 预训练时遇到的文本通常是自然语言描述,而不是孤立的类别名称
因此论文使用:
1 | "A photo of a {label}." |
作为一个效果较好的默认模板
Prompt 实际上是在利用自然语言更加准确地定义视觉类别
CLIP 与 LLM
Zero-shot:
两者共同的范式可以理解为:通过大规模预训练获得通用能力,在下游任务中通过自然语言指定任务,而不重新训练模型参数
| CLIP | LLM | |
|---|---|---|
| 输入 | Image + Text | Text |
| 预训练任务 | Image-Text Contrastive Learning | Next Token Prediction |
| 核心能力 | Visual-Language Alignment | Language Modeling |
| Zero-shot | Prompt 定义 Classification Class | Prompt 描述 Task |
| 推理方式 | Similarity Matching | Autoregressive Generation |
Few-shot:
CLIP:
1 | 少量标注图片 |
LLM 的 few-shot 不影响模型参数
| CLIP | LLM | |
|---|---|---|
| Example 的形式 | 标注图像 | Prompt 中的示例 |
| 是否更新 Backbone | 否 | 否 |
| 是否训练新参数 | 训练分类头 | 否 |
| Adaptation 方式 | Parameter Learning | In-Context Learning |
BLIP
在 CLIP 图文对齐思路的基础上,进一步统一了视觉语言理解(Understanding)和生成(Generation)两类任务
早期问题:Encoder-based 模型擅长图文检索等理解任务,但不容易直接用于文本生成;Encoder-Decoder 模型适合生成任务,但在图文检索方面表现受限
MED:让同一个预训练框架同时支持理解和生成
MED
与CLIP相比真正变化的是文本这一侧,可以切换三种模式:
| 模式 | 主要结构 | 作用 |
|---|---|---|
| Unimodal Encoder | Image Encoder + Text Encoder | 独立提取图文特征 |
| Image-grounded Text Encoder | Text Encoder + Cross-Attention | 融合图文特征,判断是否匹配 |
| Image-grounded Text Decoder | Text Decoder + Cross-Attention | 基于图像自回归生成文本 |
- Image Encoder:使用 ViT,将图像切分为 Patch 并编码,利用
[CLS]表示全局图像特征 - Text Encoder:使用 BERT 类结构,通过双向 Self-Attention 获取文本表示
- Image-grounded Text Encoder:在文本 Transformer 中加入 Cross-Attention,使文本能够关注图像特征
- Image-grounded Text Decoder:将双向 Self-Attention 替换为 Causal Self-Attention,根据图像逐 Token 生成文本
Text Encoder 和 Text Decoder 共享除 Self-Attention 外的参数,包括 Embedding、Cross-Attention 和 FFN
原因是理解任务需要双向上下文,而生成任务需要因果掩码,两者对 Self-Attention 的要求不同
训练目标
BLIP 联合优化两个理解任务目标和一个生成任务目标。
| Loss | 全称 | 核心作用 |
|---|---|---|
| ITC | Image-Text Contrastive Loss | 图文特征空间对齐,类似CLIP |
| ITM | Image-Text Matching Loss | 图文细粒度匹配 |
| LM | Language Modeling Loss | 根据图像生成文本 |
CapFilt
BLIP 不直接完全相信原始 Web Text,因为其中存在较多与图像内容不匹配的噪声文本
具体过程:
- 先利用原始数据预训练 MED
- 将预训练模型分别微调成 Captioner 和 Filter,使用 COCO 人工标注数据
- Captioner 为网络图像生成合成描述(每张图像生成一条)
- Filter 使用 ITM 判断图文是否匹配,过滤原始描述和生成描述中的噪声
- 将保留的图文对与人工标注数据合并,重新预训练一个模型
BLIP2
BLIP 已经通过 MED 统一了视觉语言理解与生成,但仍然需要训练较大规模的多模态模型,计算成本较高
BLIP-2 希望直接利用已经训练好的单模态模型:
- 预训练的视觉编码器:例如 ViT,已经具有较好的视觉理解能力
- 预训练的大语言模型:已经具有较好的语言理解和生成能力
视觉编码器和 LLM 分别在不同的模态上训练,二者的特征空间并不天然对齐
通过两阶段训练实现高效的视觉语言对齐,先学习图文表示对齐,再学习让 LLM 理解视觉特征
Q-Former
Q-Former 并不是简单的线性映射,让 32 个可学习的 Query 与整张图像的视觉特征交互
通过 Cross-Attention 与冻结视觉编码器的输出交互

每个 Query 随着训练进行,会学习如何从视觉特征中提取对图文任务有用的信息
论文给出的 ViT-L/14 视觉特征形状是 257 × 1024,而 Q-Former 输出为 32 × 768
因此 Q-Former 也起到 Information Bottleneck 的作用,将较长的视觉特征序列压缩成固定数量的视觉 Token
1 | Image → Image Encoder → Image Features |
1 | Image → Frozen Image Encoder |
关键区别在于:
- BLIP 主要由文本 Token 在跨模态融合过程中读取视觉特征
- BLIP-2 额外引入 32 个可学习 Query,主动从视觉特征中提取信息
两阶段预训练
第一阶段:Vision-Language Representation Learning
训练 Q-Former,让它学会从图像中提取与语言语义相关的视觉信息
第二阶段:Vision-to-Language Generative Learning
让 Q-Former 输出的视觉信息能够作为输入,被冻结的大语言模型理解并用于文本生成
- Q-Former 提取视觉特征
- FC 层将视觉特征映射到 LLM 的词嵌入维度
- 将投影后的视觉特征作为 Soft Visual Prompts,与文本输入一起送入 LLM
- 通过文本生成损失训练连接模块,LLM 本身保持冻结
这里的两种模式其实是针对两种不同架构的LLM
BLIP2的核心:可以保留预训练单模态模型的能力,仅训练较小的跨模态连接模块,实现视觉信息向语言模型的迁移
多模态大模型
LLaVA
通过简单的视觉连接结构和多模态指令数据,让大语言模型学会根据图像回答用户的问题
模型架构
与 BLIP-2 相比,LLaVA 的模型连接方式更加简单
三个核心模块:
- Vision Encoder:使用预训练的 CLIP ViT-L/14,提取图像 Patch 特征
- Projection Layer:一个可训练的线性映射层,将视觉特征转换到 LLM 的词嵌入空间
- LLM:使用 Vicuna,根据图像特征和文本指令自回归生成回答
BLIP-2 通过 Query 和 Cross-Attention 主动压缩并提取视觉信息;LLaVA 则直接保留视觉 Patch 特征,用简单线性层完成转换
多模态指令数据构建
核心贡献
普通图文数据一般是:
1 | Image: 一辆停在车库里的 SUV |
但真实用户可能会提出各种要求
如果训练数据几乎只有固定 Caption,那么模型缺少针对不同指令组织回答的监督信号
因此,需要构建:Image + Instruction → Response
而不仅仅是:Image → Caption
两阶段训练
LLaVA 同样采用两阶段训练,但与 BLIP-2 的训练方式不同
第一阶段:Feature Alignment(特征对齐)
在冻结视觉编码器和 LLM 的情况下,仅训练 Linear Projection,使视觉特征适应预训练 LLM
原论文将这个阶段理解为训练一个与冻结 LLM 兼容的 Visual Tokenizer
第二阶段:Visual Instruction Tuning(视觉指令微调)
不仅要让 LLM 接收视觉信息,还要让它根据不同用户指令利用这些视觉信息
与第一阶段不同:
- 视觉编码器仍然冻结
- Projection Layer 继续更新
- 解冻 LLM,让语言模型也参与训练
| 模型 | 核心设计 | 重点 |
|---|---|---|
| CLIP | Dual Encoder + Contrastive Learning | 图文语义对齐 |
| BLIP | MED + CapFilt | 统一理解与生成 |
| BLIP-2 | Frozen Encoder + Q-Former + Frozen LLM | 高效连接视觉编码器和 LLM |
| LLaVA | CLIP + Linear Projection + Vicuna | 多模态指令微调 |
Qwen2-VL
[2409.12191] Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution
BLIP 重点主要是如何将视觉特征与 LLM 连接,LLaVA 通过多模态指令微调实现视觉理解与问答
Qwen2-VL 进一步关注视觉信息本身的表示与建模问题:如何适应不同分辨率的图像、如何保留视觉 Token 的空间位置信息,以及如何统一处理图像与视频中的时空信息
引入了三个关键设计
动态分辨率
根据输入图像的原始分辨率,动态生成不同数量的 Visual Tokens,而不是将所有图片统一缩放到固定尺寸
传统固定分辨率的问题:
- 高分辨率图像需要下采样,导致文字、细节等信息丢失。
- 不同长宽比的图像需要统一缩放或 Padding,难以充分利用原始图像的空间信息
为了支持不同分辨率,Qwen2-VL 对 ViT 进行了两个重要修改
- 移除原来的绝对位置编码
- 使用 2D Rotary Position Embedding(2D-RoPE)表示图像中的二维空间位置
ViT 输出后,使用一个 MLP 对相邻的 $2\times2$ Visual Tokens 进行合并
加上视觉序列首尾的 <|vision_start|>、<|vision_end|>,共 66 个 Token
M-RoPE
将传统 RoPE 的一维位置表示扩展为时间、高度、宽度三个维度,实现文本、图像和视频的统一位置编码
- Temporal:时间维度 $t$
- Height:高度维度 $h$
- Width:宽度维度 $w$
| 输入类型 | Temporal | Height | Width |
|---|---|---|---|
| Text | 随 Token 变化 | 与 Temporal 相同 | 与 Temporal 相同 |
| Image | 固定不变 | 随图像行变化 | 随图像列变化 |
| Video | 随 Frame 变化 | 随图像行变化 | 随图像列变化 |
对于文本输入,三个维度使用相同的位置 ID,M-RoPE 在文本场景下等价于传统 1D-RoPE
对于图像,所有视觉 Token 的 Temporal ID 保持不变,每个 Token 都有独立的二维空间位置
对于视频,每一帧 Temporal ID 随 Frame 递增
这样可以在统一的序列中处理多种模态
当模型输入包含多种模态时,每个模态的位置编号从前一个模态的最大位置 ID 加 1 开始
图像视频的统一建模
将图像和视频放在统一的视觉处理框架中,训练过程中同时使用,使模型能够同时学习静态视觉理解与动态视频理解
引入深度为 2 的 3D Convolution,将相邻两帧中的对应空间区域编码为一个时空单元;对于静态图像,将其视为两张相同的帧,复用同一套处理方式
Patch 的空间大小为 14×14,结合时间深度 2,可以把输入单元理解为 2×14×14 的时空块
根据结构可推导压缩后的视觉 Token 数:
三阶段训练
与 LLaVA 的两阶段训练不同
| 阶段 | Vision Encoder | LLM | 训练目标 |
|---|---|---|---|
| Stage 1 | 训练 | 冻结 | 视觉语义学习 |
| Stage 2 | 训练 | 训练 | 多模态联合学习 |
| Stage 3 | 冻结 | 训练 | 多模态指令微调 |
Stage 1:使用大量 Image-Text Pairs,使 Vision Encoder 学习视觉语义信息
Stage 2:解冻全部模型参数,进行联合训练,主要增强视觉与语言之间的语义关联
Stage 3:使用多模态指令数据,使模型能够理解用户指令,并根据视觉信息生成符合要求的回答
多模态数据标识
使用特殊 Token 区分文本、图像以及不同的多模态任务
| 标记 | 作用 |
|---|---|
| `< | vision_start |
| `< | im_start |
| `< | object_ref_start |
| `< | box_start |
这样模型不仅能够描述图像中的物体,还可以将文本描述与具体的图像区域关联起来






