ViT 详解:如何把一张图变成一段 token 序列

前言 本站的《Transformer 详解》讲了如何用注意力机制处理文本:把句子切分成 token,让任意两个位置直接交互。本文回答一个相关的问题:同一套机制,能不能用来处理图像? 答案是能,这个架构就是 ViT(Vision Transformer,视觉 Transformer),由 Google 在 2020 年提出。它的核心思路是:把图像切成固定大小的小块(Patch),每块展平成一个向量,再把这些向量按顺序组成序列输入 Transformer。像素是连续矩阵,文本是离散符号,两者结构原本不同;这一步变形把图像转换成了 Transformer 能够处理的序列形式。 ViT 是本站 VLM 专栏的基础:《CLIP 详解》的视觉编码器是 ViT,《LLaVA 详解》复用的也是它。理解了 ViT,就能理解这两篇文章中的图像特征是如何产生的。 阅读前提:已经读过本站《Transformer 详解》(理解自注意力、多头、位置编码),并会写基础的 PyTorch 代码。本文会与 CNN 做对比,但不要求你已经精通 CNN。 为什么视觉需要 Transformer CNN 的归纳偏置 在 ViT 之前,视觉任务的标准做法是 CNN(卷积神经网络)。CNN 有两个内在的设计假设: 局部性(Locality):CNN认为图上相邻的像素一定是有关系的,因此它让一个固定大小的 3*3 卷积核在图片上滑动,每个输出位置只"看"周围的一小片区域。要利用远处的信息,只能逐层堆叠卷积,逐步扩大感受野。 平移等变性(Translation Equivariance):同一个卷积核在整张图上共享权重,物体平移后,对应的特征也随之平移。也就是说,一个物体无论出现在一张图片中的哪一个地方,其特征都是一样的。 这两个假设统称归纳偏置(Inductive Bias),即用先验知识规定模型理解图像的方式。优点是数据效率高,用 ImageNet 规模的数据就能训练出不错的模型;缺点是这些先验限制了模型的表达能力:局部性意味着远距离信息只能通过加深网络来间接获取,而且这些先验并非在所有任务中都成立。 ViT 的选择:去掉归纳偏置 ViT 采取相反的思路:几乎完全去掉 CNN 的归纳偏置,只保留 Transformer 结构。图像被切成 patch 后,任意两个 patch 之间可以直接交互(自注意力),远距离依赖不再是问题;平移等变性也不再由结构保证,需要模型从数据中自行学习。 这种设计的代价是数据需求:归纳偏置越少,需要的数据就越多。ViT 论文的对比实验直接说明了这一点(详见"训练"一节):在 ImageNet(128 万张图)上从头训练时,ViT 的表现与同规模的 ResNet 相当;在更大的数据集(ImageNet-21k、JFT-300M)上预训练后,ViT 超过最强的 CNN 基线,而且数据规模越大,优势越明显。 ...

📅 August 13, 2026 · 🔄 更新于 2026-08-16 · ⏱️ 49 min · 📝 约 7455 字 · 👁️ 次阅读

从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式

前言 大语言模型(Large Language Model,LLM) 很会处理文字。它能把一段指令拆成 token,按概率逐字生成回复。但把它和一张图片放到一起,它就没了用武之地。给它一张图片的像素数据,它不知道画面上是一只猫还是一栋楼。它只能看文字。(注意:这里的大模型我们指的是早期的文本大模型,这个时候还没有出现 MLLM(多模态大模型),因此先不考虑现在的大模型所具备的图像识别和理解功能。但事实上,我们接下来要介绍的 VLM,概念上是属于 MLLM 的范畴。) 视觉语言模型(Vision-Language Model,VLM) 要补上的正是这一块。它同时理解图像与文本,能做跨模态推理。给它一张照片,它回答照片里有什么;给它一张图纸,它照着图纸说明步骤。这类能力的基础,是把图像和文本两套数据放进同一个表示空间,让模型能比较、能融合、能推理。这个过程的正式名称是模态对齐(Modality Alignment)。 图像和文本的数据结构完全不同。图像是连续的像素矩阵,一个像素是三个通道上的数值,整体是高维连续张量。文本是离散的符号序列,每个词元来自一张有限的词表。一个连续,一个离散,两者天然不在同一个空间里。VLM 的核心工作,就是找到一种方式把两者对齐。 围绕"怎么对齐",VLM 演化出三条技术路线。本文先讲 VLM 的骨架,再逐一拆解三条路线的数学原理,最后把训练流程串起来。 三大核心组件 一个 VLM 通常由三个部分组成。 视觉编码器(Vision Encoder)。负责把图像变成特征向量。以 Vision Transformer(ViT)为代表,先把图像切成固定大小的方块(Patch),每个方块展平并线性映射成嵌入,再送入多层 Transformer,输出一组图像特征。特征里压缩了图像的语义信息,是后续所有对齐操作的基础。 语言模型(LLM / Text Encoder)。负责理解文本语义并生成回复,常见的有 Llama、Qwen 等。在 VLM 中,它是推理与输出的核心。 模态连接器(Adapter / Projector)。这是 VLM 特有的枢纽。视觉编码器输出的特征和词向量不在同一个空间,连接器负责把图像特征映射成语言模型认识的词向量,通常是一个可学习的线性层或小型 Transformer。线性投影层(Linear Projector)和 Q-Former 都属于连接器。 flowchart LR IMG["图像"] --> VE["视觉编码器 ViT"] VE --> PR["模态连接器 Projector"] PR --> LLM["语言模型 LLM"] LLM --> OUT["文本回复"] 流派一:对比学习与模态对齐(CLIP) CLIP(Contrastive Language-Image Pre-training)由 OpenAI 在 2021 年提出。它的思路不要求模型把图像"说出来",只要求模型判断一对图文是否匹配。思想可以概括为,让配对的图像与文本在向量空间里互相靠近,不配对的互相远离。 ...

📅 August 11, 2026 · 🔄 更新于 2026-08-15 · ⏱️ 17 min · 📝 约 2615 字 · 👁️ 次阅读

LLaVA 详解:视觉指令微调的完整拆解

前言 本文是《从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式》的配套专篇。主篇里讲了三只流派,CLIP 走对比学习对齐,Flamingo 走交叉注意力,LLaVA 走的是生成式视觉指令微调。本文把 LLaVA 这一路从架构到损失函数的每一步完整拆开,包括线性投影的数学、视觉 token 如何进入语言模型、自回归交叉熵损失的推导,以及两阶段训练的具体流程。 阅读前提是了解 CLIP 的对比学习思想,可先看本站《CLIP 详解:对比学习如何让模型同时看懂图与文》。 核心思想 CLIP 学会的是"匹配",给它一张图,它能判断图和文本是否相关,但它不会开口回答。LLaVA(Large Language and Vision Assistant)要的是"对话",给它一张图加一句问题,它能像语言模型那样流利地回答。 实现办法很直接,把图像特征转成语言模型认识的 token,拼进输入序列,剩下的工作全部交给语言模型自回归生成。这条路线的核心假设是,语言模型足够强大,只要把图像信息以它看得懂的形式喂进去,它就能基于图像推理。因此"对齐"这一步被收敛成一个小而关键的组件,一个线性投影层。 整体架构 LLaVA 由三个模块串成一条链。 flowchart LR IMG["图像"] --> VE["视觉编码器 ViT"] VE --> PR["线性投影 W"] PR --> TOK["视觉 token"] TXT["指令文本"] --> LLM["语言模型 LLM"] TOK --> LLM LLM --> OUT["回答"] 视觉编码器。把图像编码成一组 patch 特征,LLaVA 直接复用 CLIP 训练好的 ViT,不重新训练。 线性投影。把视觉特征映射到语言模型的嵌入空间,这是唯一需要从零训练的关键组件。 语言模型。接收"视觉 token + 文本 token"的混合序列,自回归生成回答,通常复用开源的 LLaMA、Qwen 等。 视觉编码器 LLaVA 的视觉编码器直接采用 CLIP 的 ViT,训练时全程冻结。这样做的原因有两点。 ...

📅 August 13, 2026 · 🔄 更新于 2026-08-15 · ⏱️ 20 min · 📝 约 3034 字 · 👁️ 次阅读

CLIP 详解:对比学习如何让模型同时看懂图与文

前言 本文是《从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式》的配套专篇。主篇里只讲了 CLIP 的核心思想,本文把架构、每个公式的符号、温度参数 $\tau$ 的物理意义和正负样本矩阵完整拆开。 核心思想 CLIP(Contrastive Language-Image Pre-training) 由 OpenAI 在 2021 年提出。它的思路不要求模型把图像"说出来",只要求模型判断一对图文是否匹配。思想可以概括为,让配对的图像与文本在向量空间里互相靠近,不配对的互相远离。训练数据是从互联网抓取的海量图文对,弱标注、规模大,正好适合对比学习。 模型结构 CLIP 由两个编码器组成,训练完成后两者的输出落在同一个向量空间里。 视觉编码器(Vision Encoder) 把图像映射成图像特征向量。 文本编码器(Text Encoder) 把文本映射成文本特征向量。 两个编码器共享一个对比学习的目标,不要求图像特征还原文字,只要求"配对"的两者在空间中靠近。 视觉编码器 CLIP 论文里视觉编码器有两种可选实现。 ViT 实现。图像先切成固定大小的 Patch(如 $32 \times 32$ 像素),每个 Patch 展平成一个一维向量,经线性投影变成 token,加上位置编码后送入多层 Transformer 编码器。图像特征取 [class] token 位置的输出,经一个线性层映射到共享嵌入维度。(关于 ViT 的详细说明我想单独开一个post,由于比较懒这里就先不写了喵) 图 1:ViT 的图像编码器结构。 ResNet 实现。图像经卷积网络逐层提取特征,最后用一个注意力池化(attention pooling)把空间特征汇聚成单一向量,再经线性层映射。 详细说明请见本站《为什么 ResNet 能训练 152 层——残差连接的直觉与数学》。(其实这个是AI写的,我后面再修改~) 两种实现的最终输出都会投影到同一个嵌入维度,和文本特征的维度一致。 文本编码器 文本编码器是一个带因果掩码的 Transformer,结构上接近 GPT。输入句子先切分成 token,每个 token 做嵌入并加上位置编码,逐层编码;最后取句末特殊 token(End-of-Text,EOT)位置的输出作为整个句子的特征。CLIP 的文本编码器最长处理 76 个 token。 ...

📅 August 12, 2026 · ⏱️ 34 min · 📝 约 5139 字 · 👁️ 次阅读
Comments