视觉表征

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
2
3
4
5
6
7
Image
↓
Convolution
↓
Feature Map
↓
Classification

ViT

1
2
3
4
5
6
7
8
9
10
11
Image
↓
Patchify
↓
Patch Embedding
↓
[CLS] + Position Embedding
↓
Transformer Encoder
↓
Classification

将二维图像转化成一维 Patch Token Sequence,把图像识别转化为序列建模问题

Patch Embedding

给定输入图像

$$ x\in\mathbb{R}^{H\times W\times C} $$
把图片切成 $P\times P$ 的互不重叠图像块 (`non-overlapping patches`)

Patch 数量:

$$ N=\frac{HW}{P^2}=\frac{H}{P}\frac{W}{P} $$
对于 ViT-B/16:
$$ H = W = 224, P = 16 \rightarrow N = 196 $$
把每个 Patch 展平成一个向量
$$ {x}_p\in\mathbb{R}^{N\times(P^2C)} $$
通过线性投影对 Patch 维度进行压缩,固定到 $D$,,再输入 Transformer
$$ {z_i} = x_i {E}\qquad {E}\in\mathbb{R}^{(P^2C)\times D} $$
每个 Patch 就对应 Transformer 中的一个 token
$$ z \in \mathbb{R}^{N\times D} $$

Position Embedding

ViT 在 Patch Embedding 上加入 Position Embedding

原始 ViT 延续 BERT 的设计,在 Patch Token 前加入一个可学习的 [CLS] Token

$$ z_0=[x_{cls};x_1E;x_2E;...;x_NE]+E_{pos} \qquad E_{pos}\in\mathbb R^{(N+1)\times D} $$

默认使用可学习的一维位置编码

序列中的每个位置都有一个独立的、可学习的 $D$ 维位置向量

经过多层 Self-Attention 后,[CLS] Token 可以与所有 Patch Token 进行信息交互,最终其输出作为整张图像的表示,用于分类

ViT-B/16 完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Input Image
[B, 3, 224, 224]

↓ Patchify: 16×16

196 Patches
Each: [3,16,16]

↓ Flatten

[B, 196, 768]

↓ Linear Projection
D = 768

[B, 196, 768]

↓ Add CLS Token

[B, 197, 768]

↓ Add Position Embedding

[B, 197, 768]

↓ Transformer Encoder × 12

[B, 197, 768]

↓ Take CLS Token

[B, 768]

↓ Classification Head

[B, num_classes]

现代 VIT

CLS Token 只是获得全局图像表示的一种方式,并不是 Transformer 的必要组成部分

一些后续视觉 Transformer 会直接对 Patch Tokens 进行 Global Average Pooling:

$$ z=\frac1N\sum_{i=1}^{N}z_i $$
优势:
  • 不需要额外学习 CLS token
  • 训练更加稳定
  • 与 CNN 的 Global Average Pooling 类似

局限

虽然 ViT 将 Transformer 引入视觉领域,但存在两个问题:

  1. Self-Attention 计算量高,随着图像分辨率提高,计算和显存开销增长很快
  2. 缺少 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

输入图像

$$ {x}\in\mathbb{R}^{H\times W\times C} $$
Swin 原论文使用 $P=4$
$$ H\times W\rightarrow\frac H4\times\frac W4 $$
1
2
3
4
5
6
7
8
9
10
11
Input
[B, 3, 224, 224]

↓ Patchify 4×4

[B, 56, 56, 48]

↓ Linear Projection
48 → 96

[B, 56, 56, 96]

每个 $4\times4\times3$ 的 Patch 被展平成一个长度为 48 的向量

ViT 强调全局的一维 Token sequence;Swin 则保留 Patch 的二维网格结构

Window Partition

Swin 不进行全局 Attention,而是划分局部窗口

$$ M = 7 $$
每个 Window有 $7\times 7 = 49$ 个 token
1
2
3
4
5
6
7
8
9
10
11
12
13
[B, 56, 56, 96]

↓ Window Partition 7×7

[B,8,8,7,7,96]

↓ Window Flatten

[B, 64, 49, 96]

↓ 把 Window 合并到 Batch

[B×64, 49, 96]

每张图有 64 个 window,每个 window 有 49 个 token,每个 token 是 96 维

把 Window 合并进 Batch 后就可以把每个 window 当成一个独立的小序列做 Self-Attention

W-MSA

W-MSA:Window Multi-head Self-Attention

1
2
3
4
5
6
7
┌───────┬───────┐
│Window │Window │
│ A │ B │
├───────┼───────┤
│Window │Window │
│ C │ D │
└───────┴───────┘

每个 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
2
3
4
5
6
7
8
9
10
11
12
13
原窗口
┌───┬───┐
│ A │ B │
├───┼───┤
│ C │ D │
└───┴───┘

移动后
┌───┬───┐
│A/B│B/C│
├───┼───┤
│C/D│D/A│
└───┴───┘

实现跨 Window 信息交流

Swin Block

W-MSA 负责窗口内部建模,SW-MSA 负责跨窗口信息传播

连续两个 Block 分别使用 W-MSA 和 SW-MSA

1
2
3
4
5
6
7
Swin Block L
↓
W-MSA

Swin Block L+1
↓
SW-MSA

相对位置偏置

Swin 的 Attention 中加入了相对位置偏置 (Relative Position Bias)

Attention 可以写成:

$$ \operatorname{Attention}(Q,K,V)=\operatorname{Softmax} \left(\frac{QK^T}{\sqrt d}+B\right)V $$
表示窗口内部不同 token 之间的相对位置偏置

对于视觉空间,这种相对关系非常自然

$$ \hat B= \begin{bmatrix} b_{-(M-1),-(M-1)} & \cdots & b_{-(M-1),M-1}\\ \vdots & & \vdots\\ b_{M-1,-(M-1)} & \cdots & b_{M-1,M-1} \end{bmatrix} \in \mathbb{R}^{(2M-1)\times(2M-1)} $$

Patch Merging

ViT 基本保持同一尺度,而 Swin 逐渐降低空间尺寸,同时提升 channel

会在 Swin Block 后下采,下采采用拼接 + Linear 的实现方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
特征图
x00 x01 x02 x03
x10 x11 x12 x13
x20 x21 x22 x23
x30 x31 x32 x33

取 2 × 2
x00 x01
x10 x11

Concatenate 通道维度
[x00 | x01 | x10 | x11]
4C
↓
Linear Projection
4C → 2C

产生了 CNN 模式的特征金字塔

ViT Swin
Token形式 一维序列 二维Feature Map
Attention Global Attention Window Attention
复杂度 $O(N^2)$ $O(NM^2)$
空间结构 弱 强
多尺度 无 有
Patch数量 固定 逐层减少
适合任务 分类 分类/检测/分割

ConvNeXt

[2201.03545] A ConvNet for the 2020s

核心思想:以经典 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
2
3
4
5
6
7
8
9
10
11
12
13
Input C
↓
1×1 Conv
↓
C/4
↓
3×3 Conv
↓
C/4
↓
1×1 Conv
↓
C

先降维 → Spatial Mixing → 再升维

ConvNeXt 在 Channel Mixing 部分采用类似 Transformer FFN 的 Inverted Bottleneck:

1
2
3
4
5
6
7
8
9
10
11
12
13
Input C
↓
7×7 Depthwise Conv
↓
LayerNorm
↓
1×1 Conv / Linear
C → 4C
↓
GELU
↓
1×1 Conv / Linear
4C → C

先升维 → 非线性变换 → 再降维

类比Transformer:

  • $7\times7$ Depthwise Conv:负责 Spatial Mixing
  • $1\times1$ Conv / Linear:构成类似 FFN 的 Channel Mixing

ConvNeXt-T Architecture

和 Swin 基本一致

Snipaste_2026-09-23_12-13-09
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

视觉 Tokenizer

最基础的 Autoencoder (自编码器,AE) 可以写成

$$ x \xrightarrow{\text{Encoder}} z \xrightarrow{\text{Decoder}} \hat{x} $$
  • $x$ :输入图像
  • $z$:潜在表示(Latent Representation)
  • $\hat{x}$:重建得到的图像

训练目标是使重建结果尽可能接近原始输入

VAE

[1312.6114] Auto-Encoding Variational Bayes

Variational Autoencoder 变分自编码器

核心:与普通 Autoencoder 把输入编码为一个确定的 latent vector 不同,将输入编码为一个潜变量概率分布

1
2
3
4
5
6
7
8
9
10
11
12
13
x
↓
Encoder
↓
μ, σ
↓
Gaussian Sampling
↓
连续 z
↓
Decoder
↓
x̂

经过 Encoder 后得到一组分布参数,从该分布中采样

$$ z\sim \mathcal N(\mu,\sigma^2) $$
实际训练时通常写成
$$ z=\mu+\sigma\odot\epsilon,\qquad\epsilon\sim\mathcal N(0,I) $$
随机性被转移到 $ \epsilon$ 上,而 $ \mu$ 和 $\sigma$ 仍然可以通过梯度进行学习

VAE 的训练不仅要求 Decoder 能够重建输入,还会约束潜变量分布

$$ \mathcal L=\mathcal L_{\text{recon}}+D_{\mathrm{KL}}\left(q_\phi(z|x)\,\|\,p(z)\right) $$
  • Reconstruction Loss:保证 $z$ 中保留足够的信息来重建输入
  • KL 散度:约束使不同样本的潜在分布整体接近 $\mathcal N(0,I)$

最终得到一个连续且较规整的 Latent Space

VQ-VAE

[1711.00937] Neural Discrete Representation Learning

Vector Quantized Variational AutoEncoder 向量量化变分自编码器

核心:将 Encoder 得到的连续特征通过 Vector Quantization(向量量化) 映射到有限 Codebook 中,从而得到离散的潜在表示(Discrete Latent Representation)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x
↓
Encoder
↓
连续特征 z_e(x)
↓
Vector Quantization
↓
离散 Code Index k
↓
Codebook Lookup
↓
z_q(x) = e_k
↓
Decoder
↓
x̂

Vector Quantization

VQ-VAE 维护一个可以学习的 embedding table

$$ E=\{e_1,e_2,\ldots,e_K\}, \qquad e_i\in\mathbb R^D $$
  • $K$:离散 latent space 的大小,也就是 Codebook Size
  • $D$:每个 embedding vector 的维度

对于 Encoder 输出的每一个向量 $z_e(x)$,在 Codebook 中寻找距离最近的 embedding

$$ k=\operatorname*{argmin}_{j}\left\|z_e(x)-e_j\right\|_2 $$
然后令:
$$ z_q(x) = e_k $$
定义成一个确定性的 one-hot categorical distribution
$$ q(z=k\mid x)=\begin{cases} 1, & k= \operatorname*{argmin}_j \|z_e(x)-e_j\|_2 \\ 0, & \text{otherwise} \end{cases} $$
本质上很像 NLP 中的
1
2
3
4
5
Token ID
↓
Embedding Table
↓
Token Embedding

而 VQ-VAE 在编码阶段相当于反过来

1
2
3
4
5
Encoder Feature
↓
寻找最近的 Embedding
↓
得到 Code Index

模型自己学习了一套离散表示,使得连续空间变成了有限的离散状态

image-20260922215138414
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Image
[128, 128, 3]

↓ Encoder

z_e(x) [32, 32, D]

↓ Vector Quantization K=512

Code Index z
[32, 32,1]

↓ Codebook Lookup

z_q(x) [32, 32, D]

↓ Decoder

Reconstruction
[128, 128, 3]

Train

问题:Quantization 使用 argmin ,没有真正的梯度,所以无法正常反向传播

使用 Straight-Through Estimator,STE (直通估计器)的方法:

  • Forward :使用量化后的 $z_q (x) = e_k$
  • Backward :把 Decoder 输入 $z_q(x)$ 的梯度复制给 Encoder 输出 $z_e(x)$
$$ \frac{\partial z_q}{\partial z_e}\approx 1 $$

把 Quantization 在反向传播时近似当作 Identity

在Pytorch中:

1
z_q = z_e + (e_k - z_e).detach()

利用 .detach() 切断梯度,且前向传播中 $z_q = e_k$

反向传播时相当于 z_q = z_e + 常数

Loss

VQ-VAE 的训练目标包含三个部分:

$$ \mathcal L=\mathcal L_{\text{recon}}+\mathcal L_{\text{codebook}}+\beta\mathcal L_{\text{commit}} $$
**Reconstruction Loss**
$$ \mathcal L_{\text{recon}}=-\log p(x\mid z_q(x)) $$
衡量重建损失,具体展开取决于 Decoder 的输出分布

常见的就是MSE

$$ \mathcal L_{\text{recon}}=\|x-D(z_q(x))\|_2^2 $$
**Codebook Loss**
$$ \mathcal L_{\text{codebook}}=\left\|\operatorname{sg}[z_e]-e_k\right\|_2^2 $$
$z_e$ 被 Stop Gradient,所以只更新 $e_k$

目标是让 Codebook 中被选中的 embedding 向 Encoder 输出靠近

Commitment Loss

$$ \mathcal L_{\text{commit}}=\left\|z_e-\operatorname{sg}[e_k] \right\|_2^2 $$
$e_k$ 被 Stop Gradient,所以只更新 $z_e$

Encoder 去追 Codebook Embedding

训练目标

Loss Encoder Codebook Decoder
Reconstruction Loss ✓ × ✓
Codebook Loss × ✓ ×
Commitment Loss ✓ × ×
  • Encoder 学习如何把输入映射到有用的离散表示
  • Codebook 学习 embedding space
  • Decoder 学习如何根据量化后的 latent 重建输入

相比VAE,无需KL散度,因为潜空间不再连续

Prior

前面训练解决的是给定图片,如何得到离散 latent

但生成时并没有输入 $x$ ,因此还需要学习离散 latent 的概率分布 $p(z)$

VQ-VAE 采用 Two-Stage 的训练方式

1
2
3
4
5
6
7
8
9
10
11
12
Stage 1

训练 VQ-VAE
Image ↔ Discrete Latent

Stage 2

固定已经训练好的 VQ-VAE
↓
收集离散 latent z
↓
学习真正的 Prior p(z)

feature map 中不同位置的 latent 并不是独立的,因此可以使用自回归模型学习

$$ p(z)=\prod_{i=1}^{N}p(z_i\mid z_1,\ldots,z_{i-1}) $$
每一个 latent token 根据前面已经生成的 latent token 进行预测

论文中:

  • 图像使用 PixelCNN
  • Raw Audio 使用 WaveNet

在生成阶段其实就用不到Encoder了

$$ \text { PixelCNN prior } \rightarrow z_{1}, z_{2}, \ldots, z_{N} \rightarrow \text { Decoder } \rightarrow x $$

VQGAN

[2012.09841] Taming Transformers for High-Resolution Image Synthesis

核心:先使用 VQGAN 将图像压缩成由有限 Codebook 构成的离散视觉表示,再使用 Transformer 建模这些离散视觉 Token 的组合关系

Loss

继承 VQ-VAE 的量化训练方式

$$ \mathcal L_{\mathrm{VQ}}(E,G,Z) = \|x-\hat x\|_2^2 + \|\operatorname{sg}[E(x)]-z_q\|_2^2 + \|\operatorname{sg}[z_q]-E(x)\|_2^2 $$

VQ-VAE 的 Reconstruction Loss 更关注像素级重建,但如果压缩率进一步提高,仅使用 Pixel-level Reconstruction Loss 容易导致图像纹理和细节的感知质量下降

将原本的 $L_2$ Reconstruction Loss 替换成 Perceptual Loss(感知损失)


额外引入一个 Patch 二分类判别器 $D$,关注图像局部 Patch 的真实性

希望真实图 $D(x)$ 接近1,重建图 $D(\hat x)$ 接近0

$$ \mathcal L_{\mathrm{GAN}} (\{E,G,Z\},D) = \log D(x) + \log(1-D(\hat x)) $$
将 VQ 重建目标与 GAN 目标形成对抗

最后完整目标:

$$ Q^* = \operatorname*{argmin}_{E,G,Z} \operatorname*{max}_{D} \mathbb E_{x\sim p(x)} \left[ \mathcal L_{\mathrm{VQ}}(E,G,Z) + \lambda \mathcal L_{\mathrm{GAN}} (\{E,G,Z\},D) \right] $$
$\lambda$ 用于平衡两组损失,根据两个 Loss 对 Decoder 最后一层产生的梯度,自适应调整 GAN Loss 的权重
$$ \lambda=\frac{\nabla_{G_L}[\mathcal L_{\mathrm{rec}}]}{\nabla_{G_L}[\mathcal L_{\mathrm{GAN}}]+\delta} $$
VQ-VAE:Pixel Reconstruction → 重建容易偏平滑

VQGAN:Perceptual Loss + Patch-based GAN → 允许更强压缩

Prior

VQGAN 仍然采用和 VQ-VAE 类似的 Two-Stage 思路

但第二阶段不再使用 PixelCNN 建模离散 latent,而是使用 Transformer

$$ \mathcal L_{\text{Transformer}}=\mathbb E_{x\sim p(x)}[-\log p(s)] $$

扩散模型

U-Net

[1505.04597] U-Net: Convolutional Networks for Biomedical Image Segmentation

U-Net 是一种用于图像分割的 Encoder-Decoder 结构

论文将网络分为:

  • Contracting Path:收缩路径,对应 Encoder
  • Expansive Path:扩张路径,对应 Decoder

核心思想:收缩路径用于捕获上下文信息,扩张路径则用于恢复空间分辨率,从而实现精确的定位

整体结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
Input
│
▼
[Encoder 1] ─────────────────────→ [Decoder 1]
│ ▲
▼ │
[Encoder 2] ───────────────→ [Decoder 2]
│ ▲
▼ │
[Encoder 3] ─────────→ [Decoder 3]
│ ▲
▼ │
[ Bottleneck ]

Encoder 和 Decoder 对应层之间通过 Skip Connection 连接

Encoder

逐渐降低空间分辨率,同时提取更高层的语义和上下文特征

1
2
3
4
5
6
7
8
9
10
11
12
3×3 Conv
│
ReLU
│
3×3 Conv
│
ReLU
│
2×2 Max Pool Stride = 2
│
▼
下一层

Decoder

将低分辨率的高级语义特征逐步恢复到高分辨率,并完成精确定位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  Upsampling
│
2×2 Up-Conv 通道数减半
│
▼
与对应 Encoder 特征 Concat
│
▼
3×3 Conv
│
ReLU
│
3×3 Conv
│
ReLU
│
▼
下一层

Skip Connection

如果只使用普通 Encoder-Decoder

在不断下采样过程中,精确的位置信息可能逐渐丢失

因此 U-Net 把 Encoder 中的高分辨率特征直接送给 Decoder

沿着 Channel 维拼接后通过 Conv 融合这些特征

输出

原始 U-Net 用于图像分割

1
2
3
4
5
6
7
Feature Map
│
▼
1×1 Conv
│
▼
Segmentation Map

将每一个像素位置上的特性向量映射到目标类别数

DDPM

[2006.11239] Denoising Diffusion Probabilistic Models

DDPM 包含两个方向相反的 Markov Process

1
2
3
4
5
Forward Process
x₀ → x₁ → x₂ → ... → x_T ≈ N(0,I)

Reverse Process
x_T → x_{T-1} → ... → x₁ → x₀

其中:

  • Forward Process:人为定义的逐步加噪过程
  • Reverse Process:由神经网络学习,从 Gaussian Noise 逐步恢复数据
image-20260923195554651

Forward Process

每一步向数据加入少量 Gaussian Noise

$$ q(x_t|x_{t-1})=\mathcal N\left(x_t;\sqrt{1-\beta_t}x_{t-1}, \beta_t I \right) $$
  • $q$:人为定义的 Forward Process
  • $\beta$:第 $t$ 步加入噪声的 variance schedule

定义:

$$ \alpha_t = 1-\beta_t \qquad \bar\alpha_t=\prod_{s=1}^{t}\alpha_s $$
由于 Gaussian Distribution 的性质,可以直接从 $x_0$ 得到任意 timestep 的 $x_t$
$$ q(x_t\mid x_0)=\mathcal N \left( \sqrt{\bar\alpha_t}x_0, (1-\bar\alpha_t)I \right) $$
通过重参数化:
$$ \boxed{x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\epsilon \qquad \varepsilon\sim\mathcal N(0,I)} $$
因此训练时可以直接随机采样到任一时间步的位置

训练阶段知道原始数据 $x_0$,因此 Forward Process 的一步反向可以解析求出,并且仍然是 Gaussian:

$$ q(x_{t-1}\mid x_t,x_0)=\mathcal N \left( x_{t-1}; \tilde\mu_t(x_t,x_0), \tilde\beta_t I \right) $$
但是生成时无法已知,所以需要学习 Reverse Process

Reverse Process

逆过程希望学习:

$$ p_\theta(x_{t-1}\mid x_t) = \mathcal N \left( x_{t-1}; \mu_\theta(x_t,t), \Sigma_\theta(x_t,t) \right) $$
原则上 Gaussian 有两个需要确定的部分
  • 均值:$\mu_\theta(x_t,t)$
  • 协方差:$\sum_\theta(x_t,t)$

但在论文里直接规定

$$ \Sigma_\theta(x_t,t)=\sigma_t^2I $$
明确 $\sigma_t^2$ 是随 $t$ 变化,但不参与训练的常数,因此问题简化为只需要学习 mean

Loss

在 variance 固定之后,对应的 KL term 可以写成:

$$ L_{t-1} = \mathbb E_q \left[ \frac{1}{2\sigma_t^2} \left\| \tilde\mu_t(x_t,x_0) - \mu_\theta(x_t,t) \right\|^2 \right] +C $$
最直观的训练方式就是:
$$ \mu_\theta(x_t,t) \approx \tilde\mu_t(x_t,x_0) $$
但是 DDPM 没有直接让网络预测 mean

通过将 mean 重新参数化为:

$$ \boxed{\mu_\theta(x_t,t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t- \frac{\beta_t} {\sqrt{1-\bar\alpha_t}} \epsilon_\theta(x_t,t) \right)} $$
于是只需要预测噪声 $\varepsilon _\theta$
$$ \boxed{ \varepsilon_\theta \rightarrow \mu_\theta \rightarrow p_\theta(x_{t-1}\mid x_t) } $$
符号 来源 含义
$\varepsilon$ Forward Process 真正加到 $x_0$ 上的 Gaussian noise
$\varepsilon_\theta(x_t,t)$ U-Net 网络预测出来的噪声

因此可以直接训练

$$ \epsilon_\theta(x_t,t) \approx \epsilon $$
最终采用训练 Loss:
$$ \boxed{ L_{\text{simple}} = \mathbb E \left[ \|\varepsilon-\varepsilon_\theta(x_t,t)\|^2 \right] } $$
DDPM 表面上训练的是 Noise Predictor,本质上是在学习 Reverse Process

Timestep

不同的 $t $ 对应不同的 Noise Level,但所有 timestep 共用同一个 U-Net 参数

因此网络不仅需要输入 $x_t$ 还需要知道 $t$

用 Transformer 的位置编码方式来编码 timestep

LDM

[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models

Latent Diffusion Model,潜空间扩散模型

Pixel-space Diffusion Model 直接在高维 RGB 图像上进行反复去噪,训练和采样都需要大量计算

核心思想:使用 Autoencoder 将图像压缩到一个低维、感知上近似等价的 Latent Space,再在 Latent Space 中训练 Diffusion Model

感知压缩

目的是去掉高频、感知上不重要的信息,同时尽量保留图像的语义和视觉细节

训练一个 Autoencoder:

$$ z=E(x)\\ \tilde{x}=D(z)=D(E(x)) $$
但也不能压缩的太狠,论文实验中 LDM-4 和 LDM-8 表现出了较好的效率和质量平衡

LDM 的第一阶段与 VQGAN 的 Perceptual Compression 思想非常接近

Latent Diffusion

训练好 Encoder $E$ 和 Decoder $D$ 后,将它们固定

不再对 Pixel $x$ 做 Diffusion,而是在 Latent $z$ 中执行

1
z₀ → z₁ → z₂ → ... → z_T

与 DDPM 完全相同,可以写成

$$ \boxed{ L_{\text{LDM}} = \mathbb E_{E(x),\varepsilon,t} \left[ \left\| \varepsilon- \varepsilon_\theta(z_t,t) \right\|_2^2 \right] } $$
  • DDPM:预测 Pixel Space 中的噪声
  • LDM:预测 Latent Space 中的噪声

LDM 的 Diffusion Backbone 仍然采用 Time-Conditional U-Net

DiT

[2212.09748] Scalable Diffusion Models with Transformers

核心:用 Transformer 替换 Diffusion Model 中传统的 U-Net Backbone

Latent Diffusion

DiT 并不是直接在高分辨率 Pixel Space 上运行 Transformer,而是建立在 LDM 框架之上

先使用预训练 Autoencoder

1
2
3
4
5
6
7
Image
256 × 256 × 3

↓ Encoder

Latent
32 × 32 × 4

整个 Diffusion Process 都发生在这个 Latent Space

可以理解为:

  • LDM:Latent Diffusion + U-Net
  • DiT:Latent Diffusion + Transformer

Diffusion 数学过程基本没有发生变化

Patchify

Latent $z_t$ 仍然是二维 Feature Map:

Transformer 不能直接按照二维 Feature Map 的形式处理,所以与 ViT 类似,DiT 首先对 Latent 进行 Patchify

假设 Patch Size 为

$$ p \times p $$
那么 Token 数量为:
$$ \boxed{ T=\left(\frac{I}{p}\right)^2 } $$
每个 Patch 经过 Linear Projection,映射成一个 $d$ 维 token

对于位于二维网格坐标 $(x,y)$ 的 Patch,分别对 $x$ 和纵坐标 $y$ 使用不同频率的 sine / cosine 函数进行编码

单个坐标的位置编码形式与 sinusoidal positional encoding 类似

$$ PE_x(x)\in\mathbb{R}^{D/2}, \qquad PE_y(y)\in\mathbb{R}^{D/2} $$
拼接得到最终位置编码
$$ PE(x,y)\in\mathbb{R}^{D} $$
2D sine-cosine positional embedding 由固定数学公式生成,通常不作为模型参数参与训练

DiT Block

Snipaste_2026-09-26_22-12-13

基本结构是标准 Transformer,所以 DiT 没有 U-Net 的 Downsample → Bottleneck → Upsample,尺寸始终保持一致

Diffusion Model 除了输入 Noisy Latent 还需要知道

  • timestep $t$
  • class label $y$

论文比较了多种方法

1
2
3
4
5
6
7
8
9
Condition
│
├── In-Context Conditioning
│
├── Cross-Attention
│
├── adaLN
│
└── adaLN-Zero ← 最终效果最好

In-Context Conditioning

分别得到:

$$ e_t=\operatorname{Embed}(t),\qquad e_y=\operatorname{Embed}(y) $$
然后直接作为两个 Token
1
2
3
4
5
6
7
8
Image Tokens:
[x₁, x₂, ..., xₙ]

Condition Tokens:
[e_t, e_y]

拼接:
[x₁, x₂, ..., xₙ, e_t, e_y]

最后一个 Transformer Block 后,再把Condition Tokens 删除

Cross-Attention

在 Self-Attention 后加入一个 Cross-Attention Layer

1
2
3
4
5
Image Tokens
↓
Self-Attention
↓
Cross-Attention ← [e_t, e_y]

这种方式与 LDM 中的思路比较类似

但是额外的 Cross-Attention 会增加计算量

adaLN

Adaptive Layer Normalization

不把 $t$、$y$ 当作普通 token,而是利用它们去控制 LayerNorm

$$ c=e_t+e_y $$
然后由 Conditioning $c $ 预测 LayerNorm 的 Dimension-wise Scale 和 Shift
$$ \gamma(c),\beta(c) $$
LayerNorm 的输出经过 scale 和 shift
$$ \operatorname{adaLN}(x,c)=\gamma(c)\odot \operatorname{LN}(x)+ \beta(c) $$
Condition 不作为 Token 参与 Attention,而是动态改变 Transformer 中归一化后的 Feature

相比 Cross-Attention,adaLN 引入的额外 Gflops(十亿次浮点运算) 最少

adaLN-Zero

论文使用的不是普通 adaLN

在 adaLN 的基础上继续加入一个可学习的 Scale

初始化时:

$$ \alpha=0 $$
因此
$$ \operatorname{DiTBlock}(x)\approx x $$
每一个 DiT Block 初始化时近似 Identity Function

借鉴了 ResNet 和 Diffusion U-Net 中将 Residual Branch 初始化为零的思想,这种设计有利于深层网络训练

后续工作基本全部采用 adaLN-Zero

多模态

CLIP

[2103.00020] Learning Transferable Visual Models From Natural Language Supervision

CLIP:Contrastive Language-Image Pre-training

传统视觉分类模型通常学习:

1
2
3
4
5
6
7
8
9
Image
↓
Image Encoder
↓
Feature
↓
Linear Classifier
↓
Labels

这类方法通常需要预先定义固定类别,并依赖人工标注的分类数据

核心思想:使用自然语言作为视觉监督信号,同时训练 Image Encoder 和 Text Encoder,将图像和文本映射到同一个多模态向量空间,通过对比学习使匹配的图文表示靠近、不匹配的图文表示远离,解决图像与文本如何进行语义对齐的问题

模型结构

CLIP 由两个 Encoder 构成:

1
2
3
4
5
6
7
8
9
10
11
                 CLIP

┌─────────────────┐
Image → │ Image Encoder │ → Image Embedding
└─────────────────┘
↘
Shared Space
↗
┌─────────────────┐
Text → │ Text Encoder │ → Text Embedding
└─────────────────┘

对比学习

训练数据由大量匹配的 (image, text) Pair 构成

一个 Batch 中

$$ (I_1,T_1),(I_2,T_2),\ldots,(I_N,T_N) $$
总共可以组成 $N^2$ 个 Image-Text Pairing,只有 $N$ 个是Positive Pair,其余均为 Negative Pair

分别提取视觉和文本 Feature,进行 L2 归一化,两个 Embedding 的 Dot Product 就等价于 Cosine Similarity

$$ S_{ij}=z_I^i\cdot z_T^j=\frac{z_I^i\cdot z_T^j }{ \|z_I^i\|_2\|z_T^j\|_2 } $$
得到 Similarity Matrix

训练目标就是让对角线相似度更高,非对角线相似度更低

对比损失

Similarity 在进入 Softmax 前还会经过缩放

$$ \ell_{ij}=\frac{S_{ij}}{\tau} $$
CLIP 中的 Temperature 是可学习的,而不是固定超参数

训练时同时优化两个方向:

Image → Text

给定一张图片 $I_i$,在 batch 中所有文本里找到与它匹配的 $T_i$:

$$ L_I = -\frac{1}{N} \sum_i \log \frac{ \exp(S_{ii}/\tau) }{ \sum_j \exp(S_{ij}/\tau) } $$
可以理解为对 Similarity Matrix 的每一行做 Classification

Text → Image

给定文本 $ T_i$,在所有图片中找到 $ I_i$:

$$ L_T = -\frac{1}{N} \sum_i \log \frac{ \exp(S_{ii}/\tau) }{ \sum_j \exp(S_{ji}/\tau) } $$
相当于对 Similarity Matrix 的另一维做 Classification

最终

$$ \boxed{ L = \frac{L_I+L_T}{2} } $$

CLIP 同时优化,形成一个对称的 Contrastive Objective

Snipaste_2026-09-23_11-49-30

Zero-shot 分类

CLIP 最重要的能力之一是:下游分类时不需要重新训练一个固定的 Linear Classifier,而是直接使用自然语言描述目标类别

假设一个数据集包含:

1
2
3
4
dog
cat
car
plane

传统分类器:

1
2
3
4
5
6
7
8
Image Feature
↓
Learned Linear Classifier

W_dog
W_cat
W_car
W_plane

而 CLIP 可以直接构造:

1
2
3
4
"a photo of a dog."
"a photo of a cat."
"a photo of a car."
"a photo of a plane."

分别经过 Text Encoder

1
2
3
4
5
Text Prompt
↓
Text Encoder
↓
Class Embedding

这些 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
2
3
4
5
6
7
8
9
10
11
12
13
14
少量标注图片
(cat, dog, car)
│
▼
Frozen Image Encoder
│
▼
Image Features
│
▼
训练 Linear Classifier
│
▼
cat / dog / car

LLM 的 few-shot 不影响模型参数

CLIP LLM
Example 的形式 标注图像 Prompt 中的示例
是否更新 Backbone 否 否
是否训练新参数 训练分类头 否
Adaptation 方式 Parameter Learning In-Context Learning

BLIP

[2201.12086] BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation

在 CLIP 图文对齐思路的基础上,进一步统一了视觉语言理解(Understanding)和生成(Generation)两类任务

早期问题:Encoder-based 模型擅长图文检索等理解任务,但不容易直接用于文本生成;Encoder-Decoder 模型适合生成任务,但在图文检索方面表现受限

MED:让同一个预训练框架同时支持理解和生成

MED

Snipaste_2026-09-29_22-21-22

与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,因为其中存在较多与图像内容不匹配的噪声文本

Snipaste_2026-09-29_23-12-09

具体过程:

  1. 先利用原始数据预训练 MED
  2. 将预训练模型分别微调成 Captioner 和 Filter,使用 COCO 人工标注数据
  3. Captioner 为网络图像生成合成描述(每张图像生成一条)
  4. Filter 使用 ITM 判断图文是否匹配,过滤原始描述和生成描述中的噪声
  5. 将保留的图文对与人工标注数据合并,重新预训练一个模型

BLIP2

[2301.12597] BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models

BLIP 已经通过 MED 统一了视觉语言理解与生成,但仍然需要训练较大规模的多模态模型,计算成本较高

BLIP-2 希望直接利用已经训练好的单模态模型:

  • 预训练 Image Encoder:已经具备较好的视觉特征提取能力
  • 预训练 LLM:已经具备较强的语言理解和生成能力

但两者存在模态差异

通过两阶段训练实现高效的视觉语言对齐,先学习图文表示对齐,再学习让 LLM 理解视觉特征

Q-Former

Q-Former 并不是简单的线性映射,而是一个使用可学习 Query 主动提取视觉特征的 Transformer,不是由用户输入的文本生成的

通过 Cross-Attention 与冻结视觉编码器的输出交互

Snipaste_2026-10-11_21-32-40

使得每个 Query 可以从图像特征中聚合信息

论文给出的 ViT-L/14 视觉特征形状是 257 × 1024,而 Q-Former 输出为 32 × 768

因此 Q-Former 也起到 Information Bottleneck 的作用,将较长的视觉特征序列压缩成固定数量的视觉 Token


BLIP

1
2
3
4
5
Image → Image Encoder → Image Features
↑
Cross-Attention
↑
Text Tokens

文本 Token 直接通过 Cross-Attention 读取图像特征

BLIP-2

1
2
3
4
5
6
7
8
9
10
11
12
Image → Frozen Image Encoder
│
▼
Image Features
│ K, V
▼
Learnable Queries (Q)
│
Cross-Attention
│
▼
Query Representations

关键区别在于:

  • BLIP 主要由文本 Token 在跨模态融合过程中读取视觉特征
  • BLIP-2 额外引入 32 个可学习 Query,主动从视觉特征中提取信息

两阶段预训练

第一阶段:Vision-Language Representation Learning

目标:让 Q-Former 学会提取与文本语义相关的视觉特征

沿用 BLIP 的多任务学习思路,联合优化三个目标

让 Query 提取与语言相关、且具有细粒度语义信息的视觉特征

第二阶段:Vision-to-Language Generative Learning

目标:让 Q-Former 输出的视觉特征能够被冻结的 LLM 理解

展示了两种 LLM 接入方式

  1. Q-Former 提取视觉特征。
  2. FC 层将视觉特征映射到 LLM 的词嵌入维度。
  3. 将投影后的视觉特征作为 Soft Visual Prompts,与文本输入一起送入 LLM。
  4. 通过文本生成损失训练连接模块,LLM 本身保持冻结。
Snipaste_2026-10-11_21-41-20

两阶段训练的区别:

  • 第一阶段解决:如何从图像中提取与语言相关的信息?
  • 第二阶段解决:如何让已有 LLM 利用这些视觉信息进行生成?

BLIP2的核心:可以保留预训练单模态模型的能力,仅训练较小的跨模态连接模块,实现视觉信息向语言模型的迁移。无需联合训练整个大模型,也能实现多模态理解与生成

LLaVA

[2304.08485] Visual Instruction Tuning

CLIP、BLIP、BLIP-2 已经实现了图文对齐、图文匹配和视觉条件文本生成,但这些能力不完全等同于遵循用户指令完成视觉任务

LLaVA 的重点是将文本 LLM 中已经取得效果的 Instruction Tuning(指令微调) 扩展到视觉语言任务

模型架构

与 BLIP-2 相比,LLaVA 的模型连接方式更加简单

三个核心模块:

  • Vision Encoder:使用预训练的 CLIP ViT-L/14,提取图像 Patch 特征
  • Projection Layer:一个可训练的线性映射层,将视觉特征转换到 LLM 的词嵌入空间
  • LLM:使用 Vicuna,根据图像特征和文本指令自回归生成回答

与 BLIP-2 最大的架构区别:LLaVA 不使用 Q-Former,而是直接利用 Linear Projection 连接 CLIP 与 LLM

多模态指令数据构建

核心贡献

传统图文配对数据通常是:

1
2
3
4
Image: 一辆停在车库里的 SUV

Caption:
A black SUV parked in a garage.

但用户实际输入往往是一个问题,而非要求生成固定的 Caption

具体做法:

  1. 从 COCO 获取图像及其 Captions、Bounding Boxes。
  2. 将这些信息整理成文本形式,让 GPT-4 获得图像的符号化描述。
  3. GPT-4 根据这些文本信息生成问题与回答。
  4. 将原始图像与生成的指令问答组合成训练样本。
Snipaste_2026-10-11_21-59-33

两阶段训练

LLaVA 同样采用两阶段训练,但与 BLIP-2 的训练方式不同

第一阶段:Feature Alignment(特征对齐)

目标:让视觉特征能够适配 LLM 的词嵌入空间

图像经过 CLIP 和 Projection 后,作为视觉 Token 输入 LLM,训练模型根据图像生成对应的 Caption

只训练 Projection Layer,为冻结的 LLM 训练一个兼容的 Visual Tokenizer

第二阶段:Visual Instruction Tuning(视觉指令微调)

目标:让模型根据视觉信息理解并遵循用户指令

与第一阶段不同:

  • 视觉编码器仍然冻结。
  • Projection Layer 继续更新。
  • LLM 参数也参与训练,学习如何根据图像和指令生成回答

训练使用自回归语言建模目标,只对 Assistant 的回答 Token 和停止标记计算 Loss[和大模型的微调保持一致]

模型 核心设计 重点
CLIP Dual Encoder + Contrastive Learning 图文语义对齐
BLIP MED + CapFilt 统一理解与生成
BLIP-2 Frozen Encoder + Q-Former + Frozen LLM 高效连接视觉编码器和 LLM
LLaVA CLIP + Linear Projection + Vicuna 多模态指令微调

BLIP-2 重点解决的是:如何在冻结视觉编码器和 LLM 的情况下,通过 Q-Former 高效实现视觉语言对齐?

LLaVA 重点解决的是:如何通过简单的视觉连接模块和高质量视觉指令数据,让 LLM 学会根据图像遵循用户指令?

Qwen2-VL

[2409.12191] Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution

CLIP、BLIP-2、LLaVA 等模型已经建立了视觉编码器与语言模型之间的连接,但仍面临一些问题

  1. 固定图像分辨率:传统模型通常将图像缩放到固定尺寸(如 224×224),导致高分辨率图像中的文字和细节丢失
  2. 视觉空间建模不足:将图像 Token 当作普通一维序列处理,难以充分保留二维空间信息
  3. 视频时序理解不足:图像和视频经常被作为不同模态处理,缺少统一的时空位置表示

Qwen2-VL 针对这些问题,重点提升模型对不同分辨率图像、文档以及视频的理解能力

整体框架