神经网络与深度学习课程总结4:视觉大模型基础与 Vision Transformer(ViT)
神经网络与深度学习课程总结4:视觉大模型基础与 Vision Transformer(ViT)
摘要
本周课程主要介绍了视觉大模型的基本概念以及 Vision Transformer(ViT)的核心结构。大模型通常依托海量数据、大规模参数和预训练范式获得通用表征能力;视觉大模型则把这种思想推广到图像、文本、音频等多模态场景。ViT 的关键思想是将图像切分为若干 Patch,并将每个 Patch 映射为类似自然语言处理中“词”的 Token,再输入 Transformer Encoder 进行全局特征建模。与传统 CNN 依赖局部卷积不同,ViT 可以利用自注意力机制建立任意 Patch 之间的长距离依赖关系,但通常需要较大规模数据预训练才能充分发挥性能。本文从 Patch Embedding、位置编码、多头自注意力、MLP Head、模型规模和微调等方面系统梳理 ViT 的工作流程,并进一步总结 CLIP、多模态大模型和知识蒸馏等视觉大模型基础内容。
关键词: 视觉大模型;Vision Transformer;ViT;Patch Embedding;多头自注意力;CLIP;微调
1. 大模型与视觉大模型概述
1.1 什么是大模型
大模型通常指利用大规模数据和大规模参数训练得到的深度学习模型。与传统任务专用模型相比,大模型更强调“通用表示学习”:模型先通过预训练学习大量通用知识,再通过微调、指令对齐或少样本学习迁移到具体任务。
在自然语言处理领域,GPT 类模型体现了“预训练 + 微调 / 对齐”的典型范式。课程中将大模型训练过程概括为三个阶段:
- 无监督预训练: 使用海量文本或图像数据学习通用表示;
- 有监督微调: 利用人工标注数据让模型适应特定任务;
- 强化学习或偏好优化: 通过奖励模型、PPO 等方法使模型输出更符合人类偏好。
1.2 多模态大模型
人类理解世界并不只依赖一种信息来源,而是同时利用视觉、语言、声音等多种模态。多模态大模型的目标就是把不同模态统一到一个可学习、可交互的表示空间中,使模型具备“看图、读文、理解语义并完成任务”的能力。
视觉大模型是多模态大模型的重要组成部分。它可以作为图像编码器,向后续语言模型、图文检索模型、视觉问答模型提供视觉特征。典型方向包括:
- ViT: 将图像转化为 Token 序列,用 Transformer 建模图像;
- CLIP: 通过图像编码器和文本编码器进行图文对齐;
- DINO: 通过自监督学习和知识蒸馏学习视觉表示;
- 分割、检测、生成等下游模型: 如 SAM、扩散模型等。
2. Vision Transformer(ViT)的核心思想
ViT 的论文题目是 “An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale”。题目中的 “16x16 Words” 非常形象:ViT 将图像分成若干个 16×1616\times1616×16 的小块,每个小块就像 NLP 中的一个“词”。
传统 CNN 主要通过卷积核在局部区域提取特征,然后逐层扩大感受野;ViT 则直接把图像 Patch 序列送入 Transformer,通过自注意力机制在全局范围内建模 Patch 之间的关系。

ViT 的整体流程可以概括为:
- 将输入图像切分为固定大小的 Patch;
- 将每个 Patch 展平成向量;
- 通过线性映射得到 Patch Embedding;
- 加入分类 Token([CLS])和位置编码;
- 输入 Transformer Encoder 堆叠结构;
- 取 [CLS] Token 的输出送入 MLP Head 完成分类。
3. Embedding 层:把图像转化为 Token 序列
3.1 图像切分为 Patch 序列
设输入图像为:
x∈RH×W×C x \in \mathbb{R}^{H\times W\times C} x∈RH×W×C
其中 HHH、WWW 分别表示图像高度和宽度,CCC 表示通道数。若 Patch 大小为 P×PP\times PP×P,则图像可被划分为:
N=HWP2 N=\frac{HW}{P^2} N=P2HW
个 Patch。每个 Patch 展平后维度为:
P2C P^2C P2C
因此,所有 Patch 可以表示为:
xp∈RN×(P2C) x_p \in \mathbb{R}^{N\times(P^2C)} xp∈RN×(P2C)
以 ImageNet 中常见的 224×224×3224\times224\times3224×224×3 图像为例,如果 Patch 大小为 16×1616\times1616×16,则:
22416=14,N=14×14=196 \frac{224}{16}=14,\quad N=14\times14=196 16224=14,N=14×14=196
每个 Patch 展平后的维度为:
16×16×3=768 16\times16\times3=768 16×16×3=768
若再加入一个 [CLS] Token,则输入 Transformer Encoder 的序列长度变为 196+1=197196+1=197196+1=197,对应的输入矩阵大小为 197×768197\times768197×768。

3.2 线性映射
Patch 展平后仍然只是原始像素向量。为了输入 Transformer,需要通过一个可学习的线性映射矩阵 EEE 将其投影到 DDD 维的 Embedding 空间:
zi=xpiE,E∈R(P2C)×D z_i=x_p^iE,\quad E\in\mathbb{R}^{(P^2C)\times D} zi=xpiE,E∈R(P2C)×D
其中 DDD 是 Transformer 的隐藏维度。在 ViT-Base 中,常用 D=768D=768D=768。
3.3 加入 [CLS] Token
ViT 借鉴 BERT 的做法,在 Patch Token 序列最前面加入一个可学习的分类 Token:
xclass x_{class} xclass
经过 Transformer Encoder 后,取最后一层的 xclassx_{class}xclass 表示作为整张图像的全局特征,并输入 MLP Head 进行分类。
4. 位置编码:补充图像空间位置信息
Transformer 本身并不具备卷积那样的局部空间归纳偏置。如果只输入 Patch Token,模型无法天然知道某个 Patch 来自图像的左上角还是右下角。因此,ViT 需要添加位置编码(Position Embedding)。
课程中介绍了与 Transformer 类似的一维正弦余弦位置编码形式:
PE(pos,2i)=sin(pos100002i/dmodel) PE(pos,2i)=\sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)
PE(pos,2i+1)=cos(pos100002i/dmodel) PE(pos,2i+1)=\cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)
其中 pospospos 表示 Token 在序列中的位置,iii 表示维度索引,dmodeld_{model}dmodel 表示 Embedding 维度。
ViT 中的位置编码可以直接与 Patch Embedding 相加:
z0=[xclass;xp1E;xp2E;⋯ ;xpNE]+Epos z_0=[x_{class};x_p^1E;x_p^2E;\cdots;x_p^NE]+E_{pos} z0=[xclass;xp1E;xp2E;⋯;xpNE]+Epos
其中:
Epos∈R(N+1)×D E_{pos}\in\mathbb{R}^{(N+1)\times D} Epos∈R(N+1)×D
需要注意的是,虽然图像是二维结构,但原始 ViT 中的一维位置编码在实验中也可以取得较好效果。这说明模型可以在训练中学习到足够有效的空间关系表示。
5. Transformer Encoder:ViT 的核心计算模块
5.1 Encoder 的总体结构
ViT 的 Encoder 与标准 Transformer Encoder 基本一致,主要由以下部分组成:
- LayerNorm:层归一化;
- Multi-Head Self-Attention:多头自注意力;
- Residual Connection:残差连接;
- MLP Block:前馈神经网络;
- GELU:非线性激活函数。
课程中给出的 ViT Encoder 计算流程可表示为:
z0=[xclass;xp1E;xp2E;⋯ ;xpNE]+Epos z_0=[x_{class};x_p^1E;x_p^2E;\cdots;x_p^NE]+E_{pos} z0=[xclass;xp1E;xp2E;⋯;xpNE]+Epos
zℓ′=MSA(LN(zℓ−1))+zℓ−1,ℓ=1,2,⋯ ,L z'_\ell=MSA(LN(z_{\ell-1}))+z_{\ell-1},\quad \ell=1,2,\cdots,L zℓ′=MSA(LN(zℓ−1))+zℓ−1,ℓ=1,2,⋯,L
zℓ=MLP(LN(zℓ′))+zℓ′,ℓ=1,2,⋯ ,L z_\ell=MLP(LN(z'_\ell))+z'_\ell,\quad \ell=1,2,\cdots,L zℓ=MLP(LN(zℓ′))+zℓ′,ℓ=1,2,⋯,L
y=LN(zL0) y=LN(z_L^0) y=LN(zL0)
其中 MSAMSAMSA 表示多头自注意力,MLPMLPMLP 表示多层感知机,LNLNLN 表示层归一化,zL0z_L^0zL0 表示最后一层中 [CLS] Token 对应的输出。

5.2 LayerNorm 层归一化
层归一化用于稳定训练过程。对一个样本的特征向量 xxx,LayerNorm 先计算均值和方差:
μ=1d∑i=1dxi \mu=\frac{1}{d}\sum_{i=1}^{d}x_i μ=d1i=1∑dxi
σ2=1d∑i=1d(xi−μ)2 \sigma^2=\frac{1}{d}\sum_{i=1}^{d}(x_i-\mu)^2 σ2=d1i=1∑d(xi−μ)2
然后进行归一化并引入可学习缩放和平移参数:
LN(x)=γx−μσ2+ϵ+β LN(x)=\gamma\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta LN(x)=γσ2+ϵx−μ+β
其中 γ\gammaγ 和 β\betaβ 是可学习参数,ϵ\epsilonϵ 用于避免分母为 0。
5.3 多头自注意力
自注意力机制通过 Query、Key、Value 三组向量计算 Token 之间的相关性:
Q=XWQ,K=XWK,V=XWV Q=XW_Q,\quad K=XW_K,\quad V=XW_V Q=XWQ,K=XWK,V=XWV
单头注意力的计算公式为:
Attention(Q,K,V)=softmax(QKTdk)V Attention(Q,K,V)=softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
其中 dkd_kdk 表示 Key 向量的维度。QKTQK^TQKT 衡量不同 Token 之间的相似度,softmaxsoftmaxsoftmax 将其转化为注意力权重,再对 VVV 进行加权求和。
多头注意力则是并行计算多个注意力头:
headi=Attention(QWiQ,KWiK,VWiV) head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)
MSA(X)=Concat(head1,head2,⋯ ,headh)WO MSA(X)=Concat(head_1,head_2,\cdots,head_h)W^O MSA(X)=Concat(head1,head2,⋯,headh)WO
不同注意力头可以关注图像中不同区域之间的关系,例如目标主体、背景、边缘纹理或长距离语义依赖。
6. MLP 层与 GELU 激活函数
Transformer Encoder 中的 MLP Block 通常包含两个线性层和一个非线性激活函数:
MLP(x)=W2 GELU(W1x+b1)+b2 MLP(x)=W_2\,GELU(W_1x+b_1)+b_2 MLP(x)=W2GELU(W1x+b1)+b2
GELU 的全称是 Gaussian Error Linear Unit,其形式为:
GELU(x)=xΦ(x) GELU(x)=x\Phi(x) GELU(x)=xΦ(x)
其中 Φ(x)\Phi(x)Φ(x) 是标准正态分布的累积分布函数:
Φ(x)=∫−∞x12πe−t2/2dt \Phi(x)=\int_{-\infty}^{x}\frac{1}{\sqrt{2\pi}}e^{-t^2/2}dt Φ(x)=∫−∞x2π1e−t2/2dt
也可以用误差函数表示为:
Φ(x)=12[1+erf(x2)] \Phi(x)=\frac{1}{2}\left[1+erf\left(\frac{x}{\sqrt{2}}\right)\right] Φ(x)=21[1+erf(2x)]
与 ReLU 相比,GELU 是一种更平滑的激活函数,在 Transformer 结构中应用非常广泛。
7. MLP Head:完成图像分类
ViT 的最后输出通常取 [CLS] Token 在最后一层的表示:
y=LN(zL0) y=LN(z_L^0) y=LN(zL0)
然后送入 MLP Head 得到分类结果。课程中提到,在大规模数据集上预训练时,MLP Head 可以采用:
Linear+tanh+Linear Linear + tanh + Linear Linear+tanh+Linear
而迁移到下游任务进行微调时,通常只需要使用一个新的 Linear 分类层即可。这样做的好处是:模型主体保留预训练获得的通用视觉表示,只替换或微调最后的任务头,从而降低训练成本。
8. ViT 的模型规模与实验现象
课程中给出了 ViT 的三种常见规模:Base、Large、Huge。它们主要在层数、隐藏维度、MLP 维度、注意力头数量和参数量上不同。
| 模型 | Patch Size | Layers | Hidden Size D | MLP Size | Heads | Params |
|---|---|---|---|---|---|---|
| ViT-Base | 16×16 | 12 | 768 | 3072 | 12 | 约86M |
| ViT-Large | 16×16 | 24 | 1024 | 4096 | 16 | 约307M |
| ViT-Huge | 14×14 | 32 | 1280 | 5120 | 16 | 约632M |
从课程展示的实验结果可以看到,ViT 在大规模数据集上预训练后,在图像分类任务中能够取得非常强的性能,甚至超过部分 CNN 系列模型。但这也说明 ViT 对预训练数据规模比较敏感:当数据不足时,缺少卷积局部归纳偏置的 ViT 可能不如 CNN 稳定;当数据规模足够大时,Transformer 的全局建模能力可以充分发挥。
9. 微调:将预训练模型迁移到下游任务
预训练好的 ViT 可以看作一个强大的特征提取器。面对新的下游任务时,通常不需要从零训练整个模型,而是采用微调策略:
- 加载预训练 ViT 主干网络;
- 替换最后的分类头或任务头;
- 使用下游任务数据训练;
- 根据数据规模选择冻结部分参数或端到端微调;
- 输出任务结果。

微调的本质是利用预训练模型已经学到的通用特征,让模型更快适应新任务。例如,在图像分类任务中,只需将最后的分类层改为目标类别数;在目标检测、分割或视觉问答任务中,则需要在 ViT 特征之上增加对应的任务模块。
10. CLIP 与多模态视觉大模型
CLIP 的核心思想是将图像和文本编码到同一个语义空间中。它通常包含两个编码器:
- Image Encoder: 负责将图像编码为视觉特征;
- Text Encoder: 负责将文本描述编码为语言特征。
训练时,模型通过对比学习拉近匹配图文对的向量距离,拉远不匹配图文对的向量距离。这样一来,模型不仅可以进行图文检索,还可以利用文本提示完成零样本图像分类。

CLIP 的重要意义在于:它将视觉识别问题从“固定类别分类”扩展到了“开放词汇匹配”。这为后续视觉语言大模型的发展提供了基础。
11. 知识蒸馏与 DINO
知识蒸馏是一种常见的模型压缩与表示学习方法。基本思想是:使用一个性能较强的教师模型指导学生模型学习,使学生模型在保持较小规模的同时获得较好的表现。
DINO(Self-Distillation with No Labels)是一类典型的自监督视觉表示学习方法。它不依赖人工标签,而是通过教师网络和学生网络之间的一致性约束,让模型从图像自身的不同增强视图中学习稳定的视觉特征。
可以简单理解为:
- 教师网络提供相对稳定的目标表示;
- 学生网络尝试预测教师网络的输出;
- 两者通过动量更新和多视图增强不断改进;
- 最终模型能够学到较好的物体区域和语义结构表示。
12. 本周课程学习总结
本周课程的主线可以概括为:从大模型思想出发,理解视觉大模型的发展,再重点掌握 ViT 的结构与原理。
12.1 我对 ViT 的理解
ViT 最关键的创新不是提出新的注意力公式,而是改变了图像建模方式:它把图像从二维网格变成一维 Token 序列,使图像任务可以直接使用 Transformer 架构。这样做的优点是全局建模能力强、结构统一、容易扩展到多模态任务;缺点是对数据规模要求较高,且缺少 CNN 的局部归纳偏置。
12.2 ViT 与 CNN 的区别
| 对比角度 | CNN | ViT |
|---|---|---|
| 基本单元 | 卷积核 | Patch Token |
| 建模方式 | 局部感受野逐层扩大 | 自注意力全局建模 |
| 归纳偏置 | 强,天然适合图像局部结构 | 弱,更依赖数据学习 |
| 数据需求 | 相对较低 | 通常需要大规模预训练 |
| 多模态扩展 | 需要额外设计 | 更容易与文本 Transformer 统一 |
12.3 需要重点掌握的公式
课程中最重要的公式包括:
- Patch 数量:
N=HWP2 N=\frac{HW}{P^2} N=P2HW
- 初始输入序列:
z0=[xclass;xp1E;xp2E;⋯ ;xpNE]+Epos z_0=[x_{class};x_p^1E;x_p^2E;\cdots;x_p^NE]+E_{pos} z0=[xclass;xp1E;xp2E;⋯;xpNE]+Epos
- 注意力计算:
Attention(Q,K,V)=softmax(QKTdk)V Attention(Q,K,V)=softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
- Encoder 递推:
zℓ′=MSA(LN(zℓ−1))+zℓ−1 z'_\ell=MSA(LN(z_{\ell-1}))+z_{\ell-1} zℓ′=MSA(LN(zℓ−1))+zℓ−1
zℓ=MLP(LN(zℓ′))+zℓ′ z_\ell=MLP(LN(z'_\ell))+z'_\ell zℓ=MLP(LN(zℓ′))+zℓ′
13. 常见问题整理
问题1:为什么 ViT 要把图像切成 Patch?
因为 Transformer 的输入是 Token 序列,而不是二维图像矩阵。将图像切成 Patch 后,每个 Patch 就可以被看作一个视觉 Token,从而输入 Transformer 进行序列建模。
问题2:为什么要添加位置编码?
自注意力机制本身对输入顺序不敏感。如果不加入位置编码,模型无法区分不同 Patch 在原图中的空间位置。位置编码用于补充图像的空间结构信息。
问题3:为什么需要 [CLS] Token?
[CLS] Token 用来聚合整张图像的全局信息。经过多层 Transformer Encoder 后,它的输出表示可以作为图像级特征,用于最终分类。
问题4:ViT 一定比 CNN 好吗?
不一定。ViT 在大规模数据预训练后表现非常强,但在数据较少时,CNN 的局部归纳偏置可能更有优势。因此实际应用中需要结合数据规模、计算资源和任务需求选择模型。
问题5:CLIP 与普通图像分类模型有什么不同?
普通分类模型通常只能在固定类别集合中分类;CLIP 学习的是图像与文本之间的语义匹配关系,因此可以通过文本提示完成更开放的零样本分类和图文检索任务。
14. 结语
通过本周学习可以看到,视觉大模型的发展并不是孤立的,它与 Transformer、大语言模型、多模态学习和自监督学习密切相关。ViT 将图像表示为 Token 序列,使视觉任务能够直接利用 Transformer 的全局建模能力;CLIP 进一步把视觉与语言连接起来,为开放词汇识别和视觉语言模型奠定基础;DINO 等自监督方法则说明,在没有人工标签的情况下,模型也可以通过合理的训练目标学习有效视觉表示。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)