神经网络与深度学习第5周课程总结:视觉大模型基础、ViT与CLIP实践
神经网络与深度学习第5周课程总结:视觉大模型基础、ViT与CLIP实践
课程名称:神经网络与深度学习
授课教师:屈桢深老师
周次:第5周
主题:视觉大模型基础、Vision Transformer、CLIP与DINO
材料来源:第5周/7_视觉大模型基础.pdf、第5周/7-3 ViT.pdf、第5周/源代码(神经网络与深度学习课程)/VIT、第5周/源代码(神经网络与深度学习课程)/CLIP、第5周/源代码(神经网络与深度学习课程)/image_segmentation

图注:本周课程围绕视觉大模型展开,从大语言模型和多模态大模型的基本训练范式出发,重点学习 Vision Transformer 的图像序列化方法、CLIP 的图文对齐机制,以及 DINO 中自监督学习与知识蒸馏思想。
摘要
第5周课程主题是“视觉大模型基础”。与前几周主要关注卷积神经网络、视觉任务和 Transformer 基本结构不同,本周开始把视角扩展到“大模型”和“多模态”层面:模型不再只处理单一图像分类任务,而是通过大规模预训练学习通用表示,再通过微调、提示词、图文对齐或自监督方式迁移到不同任务。
本周内容可以分为四条主线。
第一条是大模型技术概述。课程从大语言模型讲起,介绍无监督预训练、有监督微调、奖励模型和基于 PPO 的强化学习训练思路。这部分帮助我们理解 ChatGPT 类模型为什么需要“预训练 + 微调 + 人类反馈强化学习”这一组合流程。
第二条是多模态大模型。视觉、语言、音频等模态可以通过统一表示空间进行融合。多模态模型的关键不是简单把不同输入拼起来,而是让模型学会跨模态对齐和迁移。
第三条是 Vision Transformer。ViT 把图像切成 patch,把每个 patch 当成类似 NLP 中 token 的序列元素,再送入 Transformer Encoder。它说明 Transformer 不只适用于文本,也可以成为视觉模型的基础结构。
第四条是 CLIP、DINO 和课程源码实践。CLIP 使用图像编码器与文本编码器完成对比学习,能够做零样本图像分类;DINO 通过教师网络和学生网络实现无标签自监督学习;源码部分则提供了 ViT 花分类训练、CLIP 图像分类示例和 DeepLab 语义分割演示。
目录
- 大模型技术概述
- 多模态大模型:从单模态识别到图文对齐
- Vision Transformer整体思想
- ViT嵌入层:图像如何变成Token序列
- ViT编码器:LayerNorm、MSA、MLP与GELU
- MLP Head、模型结果与微调
- CLIP:通用视觉语言预训练
- 知识蒸馏与DINO自监督学习
- 第5周源码实践:ViT、CLIP与DeepLab
- 本周知识点表格总结
- 本周学习收获
- 总结
- CSDN发布建议
1. 大模型技术概述
大模型的核心特点是规模大、数据多、迁移能力强。课程首先以大语言模型为入口,介绍了大模型从预训练到任务适配的基本路线。
大语言模型通常是基于大量文本数据训练出来的语言生成模型。它不是只记忆某个固定答案,而是学习词、句子和上下文之间的统计关系,从而对下一个词、被遮蔽词或整段文本生成结果进行建模。
课程中提到,大语言模型训练可以概括为几个阶段:
- 无监督预训练:使用大规模无标注语料学习基础语言表示。
- 有监督微调:使用人工标注的问题回答数据,让模型适应对话和任务指令。
- 奖励模型训练:让人类比较不同回答的好坏,训练一个能够给回答打分的模型。
- 强化学习优化:使用奖励模型提供的分数,通过 PPO 等算法继续优化策略模型。
1.1 语言模型预训练与掩码语言模型预训练
无监督预训练常见目标包括语言模型预训练和掩码语言模型预训练。
语言模型预训练关注“预测下一个词”。给定前文,模型学习下一个 token 的概率分布。这类目标适合自回归生成模型。
掩码语言模型预训练关注“根据上下文预测被遮蔽词”。输入句子中部分 token 被 mask 掉,模型需要根据左右上下文恢复这些位置。这类目标常用于双向编码模型。
两种目标都说明一个问题:大模型的基础能力来自海量数据上的通用模式学习,而不是只针对某个小任务训练分类器。
1.2 有监督微调
预训练模型虽然掌握了大量语言模式,但不一定天然会按照人的指令回答问题。因此需要有监督微调。
有监督微调使用人工构造的 prompt-answer 数据,让模型学习“用户问题 -> 合理回答”的映射。微调仍然是梯度下降训练,只是训练数据更贴近目标交互场景。
对于 ChatGPT 类模型来说,微调的作用是让模型从单纯续写文本,转向遵循指令、保持对话风格、回答用户问题。
1.3 奖励模型与PPO
奖励模型的输入通常是 [prompt, model output],输出是一个标量分数,用来表示这个回答在人类看来是否更好。
训练奖励模型时,通常不是直接要求人给每个回答打绝对分,而是让人比较多个模型回答哪个更好。模型学习这种偏好后,就可以对新回答给出质量分数。
有了奖励模型,就可以用强化学习继续训练语言模型。课程中提到 PPO 思路:从 prompt 数据中采样输入,让模型生成回答,再用奖励模型打分,最后用奖励信号更新策略模型。
这个流程体现了大模型训练的重要思想:预训练提供基础能力,微调提供任务格式,奖励模型和强化学习进一步对齐人类偏好。
2. 多模态大模型:从单模态识别到图文对齐
多模态大模型处理的不只是文本,也包括图像、视频、音频等不同数据形态。相比单模态模型,多模态模型需要解决两个问题:
- 不同模态的输入结构不同。文本是 token 序列,图像是二维像素阵列,音频是时间信号。
- 不同模态需要对齐。模型需要知道“这张图片”和“这段文字”表达的是同一个语义。

图注:视觉大模型通常使用统一基础模型或统一表示空间,把图像分类、目标检测、语义分割、图文检索等任务连接起来。核心是从固定任务模型转向可迁移的视觉表示。
课程中列举了常见多模态模型,例如 ChatGPT、Gemini、Claude、LLaMA、Grok、DeepSeek、Qwen 等。虽然不同模型的侧重点不同,但共同方向都是让模型具备跨任务、跨模态的泛化能力。
从视觉方向看,多模态大模型的发展可以理解为三步:
- 先用 CNN、ViT 等视觉骨干网络学习图像特征。
- 再通过文本编码器、对比学习或跨注意力机制,把图像和文本对齐。
- 最后通过指令数据、微调和推理模块,让模型完成开放式视觉问答、图文检索、图像描述等任务。
这也解释了为什么本周重点学习 ViT 和 CLIP。ViT 提供视觉 Transformer 骨干,CLIP 提供图文语义对齐方式,两者都是理解视觉大模型的重要基础。
3. Vision Transformer整体思想
Vision Transformer,简称 ViT,是把 Transformer 用于图像识别任务的代表模型。它的核心论文是 2020 年 Google 提出的 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale。
ViT 的关键思想是:图像可以被切分为固定大小的 patch,每个 patch 可以看作视觉版的 token。这样,图像就能像一句话一样变成序列,送入 Transformer Encoder。

图注:ViT 先把图像切分为 patch,再通过线性映射变成 patch embedding,加入分类 token 和位置编码后输入 Transformer Encoder,最后使用 MLP Head 输出分类结果。
3.1 ViT与传统CNN的差异
CNN 使用卷积核在图像上滑动,天然带有局部感受野、平移等变性和层级特征提取能力。ViT 不使用卷积作为主要结构,而是直接把 patch 序列输入 Transformer。
这带来两个特点:
- ViT 更依赖大规模数据预训练。因为它不像 CNN 那样内置强局部归纳偏置。
- ViT 能更直接地建模全局关系。任意两个 patch 之间可以通过自注意力建立联系。
课程中展示的结果表明,在足够大的数据集上预训练后,ViT 可以达到甚至超过 CNN 或 BiT 等模型效果。这说明 Transformer 架构在视觉领域同样具备很强扩展能力。
3.2 ViT三部分结构
ViT 整体可以分为三部分:
| 部分 | 作用 | 对应理解 |
|---|---|---|
| Embedding层 | 把图片转换为 token 序列 | 图像序列化 |
| Transformer Encoder | 建模 patch 之间的关系 | 全局上下文建模 |
| MLP Head | 输出分类结果 | 任务预测头 |
这三个部分对应了从图像输入到分类输出的完整流程。
4. ViT嵌入层:图像如何变成Token序列
Transformer 原本处理的是文本序列。ViT 要把图像送入 Transformer,就必须先把图像转换成类似文本 token 的序列。
4.1 Patch切分
假设输入图片为:
x∈RH×W×C x \in R^{H \times W \times C} x∈RH×W×C
patch 大小为 P x P,那么可以得到:
N=HWP2 N = \frac{HW}{P^2} N=P2HW
个图像 patch。每个 patch 展平后维度为:
P2⋅C P^2 \cdot C P2⋅C
如果使用 ImageNet 常见输入尺寸 224 x 224 x 3,patch 大小为 16 x 16,则每个 patch 包含:
16×16×3=768 16 \times 16 \times 3 = 768 16×16×3=768
个数值。patch 数量为:
22416×22416=14×14=196 \frac{224}{16} \times \frac{224}{16} = 14 \times 14 = 196 16224×16224=14×14=196
因此,原始图像会被转换为 196 个 patch token。
4.2 Linear Projection
每个 patch 展平后,还需要通过线性映射转换到 Transformer 使用的隐藏维度。课程中将这一步称为 patch transformation 或 embedding。
这一步类似 NLP 中的词嵌入。区别是 NLP 的 token 通常是离散词表 id,而 ViT 的 token 来自连续像素块。
可以理解为:
Image -> Patches -> Flatten -> Linear Projection -> Patch Embeddings
4.3 Class Token
ViT 会额外加入一个可学习的 class token,记作 x_class。这个 token 不对应图像中的某个 patch,而是用于汇总整张图的信息。
经过 Transformer Encoder 后,模型取最后一层 class token 对应的表示,送入 MLP Head 做分类。
如果一张图切成 196 个 patch,再加入 1 个 class token,那么输入序列长度就是 197。
4.4 Position Embedding
Transformer 本身不具备二维空间顺序感。如果只给模型 196 个 patch embedding,模型不知道这些 patch 原来在图片中的位置。因此 ViT 需要加入位置编码。
课程中仍然联系了 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)
ViT 中的位置编码通常是可学习的位置向量,形状与输入序列一致。例如 197 个 token、隐藏维度 768,则位置编码形状为:
197 x 768
完整输入可以写作:
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
其中:
x_class是分类 token。x_p^i是第 i 个 patch。E是 patch 线性映射矩阵。E_pos是位置编码。
5. ViT编码器:LayerNorm、MSA、MLP与GELU
ViT 的主体是 Transformer Encoder。它与前面学习过的 Transformer Encoder 很接近,只是输入从文本 token 变成了图像 patch token。
课程中给出的 Encoder 递推形式可以概括为:
zl′=MSA(LN(zl−1))+zl−1,l=1…L z'_l = MSA(LN(z_{l-1})) + z_{l-1}, \quad l = 1 \ldots L zl′=MSA(LN(zl−1))+zl−1,l=1…L
zl=MLP(LN(zl′))+zl′,l=1…L z_l = MLP(LN(z'_l)) + z'_l, \quad l = 1 \ldots L zl=MLP(LN(zl′))+zl′,l=1…L
y=LN(zL0) y = LN(z_L^0) y=LN(zL0)
这里 MSA 是多头自注意力,LN 是 LayerNorm,MLP 是前馈网络,残差连接用于稳定深层模型训练。
5.1 LayerNorm
LayerNorm 是一种标准化技术。它对每个样本内部的特征维度计算均值和方差,再进行归一化。
课程中强调,标准化可以缓解特征维度数值差异,让后续注意力计算和 MLP 训练更稳定。
ViT 通常采用 Pre-LN 结构,即在进入 MSA 和 MLP 前先做 LayerNorm。这与一些 Transformer 实现中的 Post-LN 不完全相同。
5.2 Multi-Head Self-Attention
多头自注意力仍然使用 Query、Key、Value。
对输入序列 X,模型通过线性层得到:
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
在 ViT 中,这里的序列元素是图像 patch。某个 patch 可以通过注意力关注其他任意 patch,从而建立长距离空间关系。
例如,图片左上角和右下角的区域在 CNN 中可能需要多层卷积才能充分交互,而在 ViT 中可以在一次自注意力中直接计算相关性。
5.3 MLP层
每个 Transformer Block 中,MSA 后面还有 MLP 层。它通常由两层全连接网络构成,中间使用激活函数。
课程中讲到了 GELU 激活函数。GELU 全称 Gaussian Error Linear Unit,可以写作:
GELU(x)=xΦ(x) GELU(x) = x\Phi(x) GELU(x)=xΦ(x)
其中 Phi(x) 是标准正态分布的累积分布函数。
相比 ReLU 的硬截断,GELU 更平滑。BERT、ViT 等 Transformer 系列模型中经常使用 GELU。
6. MLP Head、模型结果与微调
6.1 MLP Head
ViT Encoder 输出的是一组 token 表示。分类任务通常只取 class token 的最终表示,送入 MLP Head。
可以理解为:
Patch tokens + CLS token
↓
Transformer Encoder
↓
CLS hidden state
↓
MLP Head
↓
Class probabilities
MLP Head 的输出维度等于类别数。例如花分类任务中有 5 类,输出维度就是 5。
6.2 ViT模型规格
课程中提到 ViT 有 Base、Large、Huge 等规模。源码 vit_model.py 中也提供了多个模型构造函数:
| 函数名 | 说明 |
|---|---|
vit_base_patch16_224 |
Base模型,patch大小16,输入224 |
vit_base_patch16_224_in21k |
在 ImageNet-21K 上预训练的 Base/16 模型 |
vit_base_patch32_224 |
Base模型,patch大小32 |
vit_large_patch16_224 |
Large模型,patch大小16 |
vit_large_patch32_224_in21k |
Large模型,patch大小32,ImageNet-21K预训练 |
vit_huge_patch14_224_in21k |
Huge模型,patch大小14,ImageNet-21K预训练 |
模型越大,参数量和计算量越高,对数据规模和硬件资源要求也越高。
6.3 Fine-tuning
微调是把预训练模型迁移到下游任务的重要方法。
课程中强调,预测任务的类别数可能与预训练任务不同。例如预训练可能面向 ImageNet-21K,而当前花分类只有 5 类。因此微调时通常需要替换最后分类头。
源码 train.py 中也体现了这一点:
del_keys = ['head.weight', 'head.bias'] if model.has_logits \
else ['pre_logits.fc.weight', 'pre_logits.fc.bias', 'head.weight', 'head.bias']
for k in del_keys:
del weights_dict[k]
这段代码删除了不匹配的分类头权重,只加载主干网络的预训练参数。
如果设置 --freeze-layers=True,代码会冻结除 head 和 pre_logits 之外的大部分参数:
if "head" not in name and "pre_logits" not in name:
para.requires_grad_(False)
这样可以减少训练成本,也能降低小数据集上过拟合风险。
7. CLIP:通用视觉语言预训练
CLIP 全称 Contrastive Language-Image Pretraining,核心目标是把图像和文本映射到同一个语义空间中。
传统图像分类模型通常只能在固定类别上预测。例如训练集有猫、狗、车,模型输出也只能是这些类别。CLIP 不同,它可以把图片和文本描述进行匹配,因此具备更强的开放类别识别能力。

图注:CLIP 使用图像编码器和文本编码器分别提取特征,再通过相似度矩阵进行对比学习,使匹配的图文对靠近,不匹配的图文对远离。
7.1 CLIP基本流程
CLIP 包含两个编码器:
- Image Encoder:把图片编码为向量。
- Text Encoder:把文本描述编码为向量。
训练时,模型输入一批图像和对应文本。正确匹配的图文对应该在向量空间中相似度高,不匹配的图文对相似度低。
推理时,可以把类别名称写成文本提示,例如:
a photo of a car
a photo of a not_car
再计算图片特征与每个文本特征的相似度,选择得分最高的类别。
7.2 课程CLIP代码
本周 CLIP/CLIP.py 演示了用 CLIP 做简单图像分类。
关键流程如下:
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device, download_root = './')
这里加载的是 ViT-B/32 版本 CLIP 模型。图像经过 preprocess 处理,文本经过 clip.tokenize 编码:
image_input = preprocess(image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in classes]).to(device)
随后分别提取图像特征和文本特征:
image_features = model.encode_image(image_input)
text_features = model.encode_text(text_inputs)
最后进行归一化并计算相似度:
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
这段代码体现了 CLIP 的核心:分类不再依赖固定分类头,而是依赖图片向量和文本向量之间的语义相似度。
8. 知识蒸馏与DINO自监督学习
课程还介绍了知识蒸馏和 DINO。
知识蒸馏的基本思想是用一个较强的教师模型指导学生模型。教师模型输出 soft target,学生模型学习教师输出的分布,而不仅仅学习硬标签。
DINO 是一种自监督学习方法,全称 Self-Distillation with No Labels。它不依赖人工标签,而是通过不同增强视图之间的一致性训练模型。

图注:DINO 使用教师网络和学生网络处理同一图像的不同增强视图。教师输出作为目标信号,学生网络学习对齐该表示,从而在无标签数据上学习视觉特征。
8.1 DINO核心思路
DINO 的典型流程可以概括为:
- 对同一张图片生成多个增强视图。
- 教师网络处理部分视图,学生网络处理其他视图。
- 学生网络学习匹配教师网络输出。
- 教师网络通常由学生网络参数的移动平均更新。
这种方法不需要类别标签,但可以学习到具有语义结构的视觉表示。对于大规模无标注图像数据,DINO 提供了一种重要训练方式。
8.2 与CLIP的区别
CLIP 依赖图文对,通过图像和文本之间的对比学习获得跨模态能力。
DINO 依赖图像自身的不同增强视图,通过自蒸馏获得视觉表征能力。
两者都体现了大模型时代的重要趋势:减少对传统人工分类标签的依赖,更多利用大规模数据结构本身提供监督信号。
9. 第5周源码实践:ViT、CLIP与DeepLab
第5周源码目录包含三个实践部分:
VIT:ViT 花分类训练和预测工程。CLIP:用 CLIP 做简单图像分类。image_segmentation:DeepLab 语义分割演示。

图注:ViT 实践代码包含数据集划分、数据增强、加载预训练权重、冻结主干、训练分类头、验证、保存模型和预测图片等步骤。
9.1 VIT代码结构
VIT 文件夹主要文件如下:
| 文件 | 作用 |
|---|---|
README.md |
说明数据集、权重、训练和预测配置方法 |
train.py |
训练入口,负责数据加载、模型构建、权重加载、冻结层、训练与验证 |
predict.py |
预测入口,加载图片、模型和类别索引,输出预测概率 |
vit_model.py |
ViT模型结构定义,包括PatchEmbed、Attention、Mlp、Block、VisionTransformer等 |
my_dataset.py |
自定义数据集类 |
utils.py |
数据划分、训练、验证等工具函数 |
weights/ |
预训练权重与训练权重 |
data/flower_photos.tgz |
花分类数据集压缩包 |
vit_model.py 中的主要结构包括:
| 模块 | 作用 |
|---|---|
PatchEmbed |
将图像切成patch并转为embedding |
Attention |
实现多头自注意力 |
Mlp |
Transformer block中的前馈网络 |
Block |
一个完整Encoder Block |
VisionTransformer |
ViT完整模型 |
DropPath |
随机深度,用于正则化 |
9.2 ViT训练流程
train.py 的训练流程比较完整:
- 判断设备:优先使用 CUDA。
- 创建
weights文件夹。 - 使用
read_split_data(args.data_path)划分训练集和验证集。 - 定义训练和验证数据增强。
- 构造
MyDataSet和DataLoader。 - 创建
vit_base_patch16_224_in21k模型。 - 加载预训练权重,并删除不匹配的分类头参数。
- 根据
--freeze-layers冻结主干网络。 - 使用 SGD 优化器。
- 使用 cosine 学习率调度。
- 每个 epoch 训练、验证并写入 TensorBoard。
- 保存模型权重。
其中数据增强部分如下:
data_transform = {
"train": transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
]),
"val": transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
}
训练集使用随机裁剪和水平翻转,增强模型泛化能力;验证集使用固定缩放和中心裁剪,保证评估稳定。
9.3 ViT预测流程
predict.py 中的预测流程如下:
- 加载图片。
Resize(256)和CenterCrop(224)。- 转为张量并归一化。
- 使用
unsqueeze(0)增加 batch 维度。 - 读取
class_indices.json。 - 创建与训练一致的 ViT 模型。
- 加载训练好的权重。
model.eval()切换推理模式。- 使用
torch.no_grad()前向传播。 - 对输出做
softmax,得到类别概率。
关键代码:
with torch.no_grad():
output = torch.squeeze(model(img.to(device))).cpu()
predict = torch.softmax(output, dim=0)
predict_cla = torch.argmax(predict).numpy()
这与前几周 DeepLab 推理流程类似,都体现了实际模型使用时的基本规范:预处理、增加 batch 维、加载权重、切换 eval、关闭梯度、得到预测结果。
9.4 CLIP代码实践
CLIP 文件夹包含:
| 文件 | 作用 |
|---|---|
CLIP.py |
CLIP图像分类示例 |
traffic.jpeg |
测试图片 |
cup1.jpg |
测试图片 |
ViT-B-32.pt |
CLIP模型权重 |
代码默认使用 traffic.jpeg,类别为:
classes = ['car', 'not_car']
这说明 CLIP 示例不是训练一个新分类器,而是把类别写成文本描述,然后用图文相似度完成分类。
9.5 DeepLab语义分割实践
image_segmentation 文件夹延续第3周语义分割实践,包含:
| 文件 | 作用 |
|---|---|
deeplab.ipynb |
DeepLab语义分割程序文件 |
runner.jpg、dog.jpg、athletes.jpg |
测试图片 |
deeplabv3_resnet101_coco-586e9e4e.pth |
DeepLabV3-ResNet101预训练权重 |
readme.txt |
权重路径说明 |
readme.txt 提到,权重需要拷贝到:
C:\Users\<username>\.cache\torch\hub\checkpoints
这样 PyTorch 加载预训练模型时可以直接使用本地缓存。
10. 本周知识点表格总结
10.1 本周核心知识点表
| 知识点 | 核心问题 | 关键结论 |
|---|---|---|
| 大语言模型 | 模型如何获得通用语言能力 | 通过大规模无监督预训练学习基础表示 |
| 有监督微调 | 模型如何适应对话和任务 | 使用人工问答数据调整模型行为 |
| 奖励模型 | 如何衡量回答好坏 | 学习人类偏好,输出质量分数 |
| PPO强化学习 | 如何根据奖励优化模型 | 用奖励信号更新策略模型 |
| 多模态大模型 | 图像和文本如何融合 | 不同模态映射到统一语义空间 |
| ViT | Transformer如何处理图像 | 把图片切成patch序列 |
| CLIP | 如何做图文对齐 | 图像编码器和文本编码器进行对比学习 |
| DINO | 无标签图像如何训练 | 教师-学生自蒸馏学习视觉表示 |
10.2 ViT输入输出张量表
| 阶段 | 形状示例 | 说明 |
|---|---|---|
| 原始图像 | 224 x 224 x 3 |
RGB输入图像 |
| Patch切分 | 196 x 768 |
16x16 patch,共196个,每个展平为768维 |
| 加入CLS | 197 x 768 |
增加分类token |
| 加位置编码 | 197 x 768 |
加入空间位置信息 |
| Encoder输出 | 197 x 768 |
每个token得到上下文表示 |
| CLS输出 | 1 x 768 |
用于整图分类 |
| MLP Head输出 | num_classes |
类别预测分数 |
10.3 ViT模块功能表
| 模块 | 功能 | 学习重点 |
|---|---|---|
| PatchEmbed | 切分图片并映射到隐藏维度 | 图像序列化 |
| Position Embedding | 加入位置信息 | 弥补Transformer无空间顺序感 |
| Class Token | 汇总整图信息 | 分类任务输出入口 |
| LayerNorm | 标准化特征 | 稳定训练 |
| Multi-Head Attention | 建模patch间关系 | 全局上下文 |
| MLP | 非线性特征变换 | 提升表达能力 |
| GELU | 平滑激活函数 | Transformer常用激活 |
| MLP Head | 分类输出 | 下游任务预测 |
10.4 CLIP与DINO对比表
| 对比项 | CLIP | DINO |
|---|---|---|
| 训练信号 | 图像-文本配对 | 同图像不同增强视图 |
| 是否需要文本 | 需要 | 不需要 |
| 是否需要人工类别标签 | 不需要传统类别标签,但需要图文数据 | 不需要 |
| 核心机制 | 对比学习 | 自蒸馏 |
| 输出能力 | 图文检索、零样本分类、开放类别识别 | 通用视觉表示、无监督特征学习 |
| 代表模块 | Image Encoder + Text Encoder | Teacher + Student |
10.5 源码实践流程表
| 实践 | 输入 | 核心步骤 | 输出 |
|---|---|---|---|
| ViT训练 | 花分类数据集、预训练权重 | 数据增强、加载权重、冻结主干、训练分类头 | weights/model-*.pth |
| ViT预测 | 测试图片、类别索引、训练权重 | 预处理、前向传播、softmax | 类别与概率 |
| CLIP分类 | 图片、文本类别描述 | 图像编码、文本编码、相似度计算 | 最相似类别 |
| DeepLab分割 | 测试图片、DeepLab权重 | 预处理、模型推理、argmax、可视化 | 像素级分割图 |
10.6 常见注意事项表
| 问题 | 原因 | 处理方法 |
|---|---|---|
| ViT权重加载失败 | 分类头维度不匹配 | 删除 head 或 pre_logits 相关权重 |
| 训练过慢 | ViT模型和权重较大 | 冻结主干,只训练分类头 |
| 预测脚本找不到类别 | 缺少 class_indices.json |
先运行训练流程生成类别映射 |
| CLIP库无法导入 | 未安装CLIP依赖 | 按代码注释安装 git+https://github.com/openai/CLIP.git |
| DeepLab权重无法加载 | 权重未放入PyTorch缓存路径 | 按 readme.txt 拷贝到 checkpoints 目录 |
11. 本周学习收获
本周最重要的收获,是理解视觉模型已经从“为固定任务设计网络”逐步走向“先学习通用视觉表示,再迁移到多种任务”。
传统 CNN 视觉模型通常围绕分类、检测、分割分别设计结构。ViT 则把图像转成 patch token,让 Transformer 成为视觉骨干。这说明 Transformer 的序列建模能力可以迁移到二维视觉数据,只要我们合理设计图像到序列的转换方式。
CLIP 进一步说明,视觉模型不一定只能输出固定类别。通过图像和文本对齐,模型可以把“类别名称”“自然语言描述”和“图片内容”放到同一语义空间中比较。因此,图像分类可以从固定分类头变为图文相似度匹配。
DINO 则说明,视觉表示也可以从无标签数据中学习。教师-学生结构、自监督增强视图和蒸馏损失,使模型不依赖人工类别标签也能学习到有用特征。
源码实践方面,ViT 训练代码帮助我们把理论结构落到工程流程。训练一个 ViT 下游任务,不只是调用模型,还要处理数据集划分、数据增强、权重加载、分类头替换、冻结层、学习率调度、验证和模型保存。CLIP 示例则展示了图文模型如何用几行代码完成开放式分类。
12. 总结
第5周课程以视觉大模型为核心,系统梳理了大模型训练思想、多模态模型发展、Vision Transformer、CLIP、DINO 和相关代码实践。
从理论上看,本周建立了三层认识:
第一,大模型的能力来自大规模预训练、微调和对齐。无监督预训练学习基础表示,有监督微调适配任务格式,奖励模型和强化学习进一步贴近人类偏好。
第二,视觉大模型的关键是表示学习和迁移。ViT 把图像变成 patch 序列,CLIP 把图像和文本放进同一空间,DINO 从无标签图像中学习视觉特征。
第三,代码实践必须关注完整链路。ViT 训练涉及数据、权重、模型结构、优化器、学习率、冻结策略和预测流程;CLIP 分类体现了图文相似度推理;DeepLab 分割继续帮助我们理解视觉模型在像素级任务中的使用方式。
总体来看,本周内容把前面学习的 Transformer、视觉任务和 PyTorch 实践连接到了当前大模型发展方向,为后续继续学习视觉语言模型、图像生成模型和多模态智能系统打下基础。
更多推荐



所有评论(0)