【2026最新版】Transformer动画讲解教程!0基础易学,通俗易懂讲解T
kelly的小舔狗
编辑于 2026年03月03日 11:29

cnn缺点

Transformer

### **15分钟快速认识视觉Transformer(ViT)**

你有没有想过,为什么现在的AI不仅能聊天,还能看懂图片?当你发过去一张照片、一个截图,它就能给出答案。这个能“看见”的AI,背后的核心技术是什么?它叫什么名字,为了解决什么问题而诞生,它的核心方法又是什么?如果从实际工作的角度,它的输入和输出又分别是什么?

今天,我们就来深入理解一下它——**ViT**。

#### **一、直观理解:什么是ViT?**

ViT的全称是视觉Transformer(Vision Transformer)。让我先给你一个直观的理解:ViT是一个非常好的、用于处理和理解图像数据的工具。简单来说,它的工作方式可以概括为两个步骤:

1. **把图片变成序列**:先把图片切分成一个个小块。

2. **用处理文本的方式来处理图片**:然后,像处理文本序列一样,用Transformer来处理这些小块。

Google团队在论文《An Image is Worth 16x16 Words》中首次提出了ViT。这个论文名字本身就暗示了ViT的核心思想:**把一张图片看成是由16x16个“单词”(也就是图像块)组成的句子**。

#### **二、为什么我们需要ViT?(它要解决CNN的什么问题)**

这时候你可能会问:在ViT出现之前,图像领域的绝对霸主是**卷积神经网络(CNN)**,它非常强大。那为什么我们还需要ViT呢?问题在于,CNN虽然强大,但也被一种叫做**归纳偏置**的东西所限制。

**什么是归纳偏置?**

简单来说,就是模型对数据做出的预先假设。对于图像,CNN有两个核心假设:

*  **局部性**:认为一张图片中,距离近的像素(局部区域)之间的关系最重要。

*  **平移不变性**:认为一个特征(比如一只眼睛)无论出现在图片的哪个位置,它都代表同样的含义。

这个假设在很多时候确实有用,但也给CNN带来了几个核心问题:

1. **感受野受限**:CNN的核心计算单元是卷积核,它本质上是一个小尺寸的滑动窗口(比如3x3或5x5)。在每一层,每个卷积核只能看到这个小窗口内的信息。要想看到更大范围的图像信息,CNN必须堆叠非常多的网络层,让信息一层一层地传递。这就像一个拿着放大镜看地图的人,必须一点一点地挪动和拼接,才能在大脑中形成整张地图的全局印象。这种方式效率低,而且在信息长距离传递的过程中,容易出现信息丢失。

2. **长距离依赖关系建模困难**:CNN很难捕捉到图像中两个距离很远的像素之间的直接关系。它能很好地识别具体的物体(比如一朵花),但在很多任务中,我们更需要模型理解整张图片的全局信息,理解万物之间复杂的关系。比如:

  *  **遮挡关系**:人站在树前,模型需要知道树是被部分遮挡的,而不是长成了奇怪的形状。

  *  **支撑关系**:杯子放在桌子上,模型需要理解重力和支撑的概念,知道杯子不是悬浮的。

  *  **相对大小**:需要理解透视原理,知道远处的小汽车和近处的人,在现实中哪个更大。

  要解决这些问题,CNN唯一的办法就是堆叠更多网络层,让感受野逐步扩大到覆盖整个图像,但这并不容易。

3. **扩展性差**:经典的CNN架构(如ResNet)是高度分阶段的,由功能不同的模块串联而成,每个阶段的卷积核大小、分辨率、通道数都不一样。这种设计需要人工精心构建,如果简单地堆叠层数或增加分辨率来扩展模型,性能提升会很快遇到瓶颈,甚至因为优化困难而下降。例如,网络从100层增加到200层,性能可能不升反降,或者很多层都只学到了恒等映射,造成了参数和计算的浪费。

**总结一下,传统CNN的问题在于:**

*  受限于局部感受野,难以捕捉全局依赖关系。

*  在扩展到超大规模模型时,会遇到各种技术难题和性能瓶颈。

与此同时,在自然语言处理领域,**Transformer架构**已经证明了自己强大的能力:它天生就能建立长距离依赖关系,而且可以很好地扩展到超大模型(数十亿参数)。那么,能不能把Transformer的这些优势应用到图像处理上呢?这就是ViT要做的事。

#### **三、ViT如何解决这些问题?(核心工作原理)**

ViT的核心思想非常巧妙,它把图像处理问题转化成了序列处理问题,从而能够直接利用Transformer的全部能力。它的工作流程主要分为以下五个步骤:

**第一步:切分图像块**

输入一张图片,首先把它像切豆腐一样,切成一个个不重叠的小方块,称为**图像块**。每个图像块的大小是固定的,比如16x16像素。研究表明,这个尺寸在计算效率和信息保留之间达到了很好的平衡。更小的补丁会增加计算量,更大的补丁则会丢失太多细节。

例如,一张分辨率为224x224的彩色图片,被切成16x16的图像块后,会得到 (224/16)² = 196个图像块。这一步将图像信息**序列化**了。

**第二步:线性投射成向量**

我们的目标是把每个图像块转换成Transformer能理解的“词向量”。但每个图像块还是一个16x16x3的像素矩阵。所以需要两步转换:

*  **展平**:将每个图像块的像素值直接拉直,形成一个长长的向量(长度为16x16x3=768)。

*  **线性投射**:用一个可学习的线性层(本质上是一个全连接层),把这个768维的向量映射到一个固定的维度D上(D是模型内部的隐层维度)。这一步将原始的像素信息转换为包含丰富语义特征的、模型能高效处理的密集向量,我们称之为**图像块向量**。

**第三步:加入特殊Token和位置编码**

*  **添加[CLS] Token**:在处理文本时,Transformer常常会在序列开头添加一个特殊的[CLS] token,用于汇聚整句的信息。ViT借鉴了这个设计,在图像块序列的开头也加入了一个可学习的向量,称为`[cls] token`。最终,这个`[cls] token`的输出向量将被用来代表整个图像的信息,用于分类等任务。

*  **添加位置编码**:经过前两步,我们得到了一堆无序的图像块向量。但图片的空间位置信息至关重要,模型必须知道哪个块在左上角,哪个在右下角。因此,ViT为每个位置都加上了一个独特的**位置编码向量**。有趣的是,与原始Transformer使用的固定正余弦位置编码不同,ViT使用的是**可学习的位置编码**。这意味着模型会在训练过程中,自己学习197个(196个图像块 + 1个[cls] token)不同的位置向量应该长什么样,以更好地表示空间信息。

完成这一步后,我们就得到了一个完整的、带位置信息的向量序列,可以直接送进Transformer编码器了。

**第四步:通过Transformer编码器**

这是ViT的核心计算部分。这个序列会被送入多层堆叠的Transformer编码器块。每一层都包含**多头自注意力机制**和**前馈神经网络**。

自注意力机制的妙处在于,它允许每个图像块与序列中所有其他图像块(包括自己)进行信息交互。经过这一层,每个图像块向量就不仅包含自己那16x16像素的局部信息,还能“看到”图片上其他地方的信息。经过多层这样的处理,模型就能建立起非常复杂的全局依赖关系,真正理解了整张图。

**第五步:输出结果**

经过多个Transformer层的处理后,我们会得到每个输入向量对应的更新后的输出。

*  对于**图像分类**任务,我们通常取`[cls] token`的最终输出向量,接上一个简单的线性分类头,就可以得到每个类别的预测概率。

*  对于更复杂的任务(如目标检测、图像分割),则需要特殊的输出头来对每个图像块的向量进行处理,生成每个区域或每个像素的预测。

#### **四、ViT在现代AI应用中的位置**

在现代多模态大模型中,ViT扮演着至关重要的角色,通常作为**视觉编码器**。

它的工作流程是:

1. 用户输入一张图片和一个文本问题。

2. 图片进入**ViT视觉编码器**,被切成图像块,并转换成高质量的图像特征向量。这个特征不仅包含了图片的局部信息,更重要的是包含了ViT捕捉到的**全局语义理解**。

3. 这个图像特征会通过一个**连接器**,与文本特征的维度和语义空间对齐(例如,将图像特征的维度调整到语言模型能接受的维度)。

4. 最后,处理后的图像特征和用户的文本问题一起进入**大语言模型**,大语言模型就能根据“看到”的图像内容和问题,生成相应的回答。

如果ViT这个“眼睛”看不清或理解得不好,那么大语言模型这个“大脑”再聪明也没用。

#### **五、总结:ViT的输入和输出**

*  **输入**:最基本的是RGB图像。图像会经过预处理(如调整大小、归一化)。在一些高级应用中,输入也可能是多张图片,模型需要理解它们之间的关系。

*  **输出**:取决于具体的任务,这也是容易混淆的地方。

  *  **图像分类**:输出一个概率分布向量,代表图像属于每个类别的可能性。

  *  **作为视觉编码器**:输出的是一个特征图,即所有图像块向量的集合。例如,一张图被分成256个块,输出就是一个256x768的特征矩阵。有时候为了减少计算量,模型可能只输出其中的一部分(如`[cls] token`)。

  *  **目标检测/图像分割**:输出需要包含更精细的空间信息。模型不仅会用`[cls] token`,还会利用每个图像块的特征,并加上一个专门的检测头或分割头,来生成每个区域或每个像素的预测。

  *  **现代多模态模型**:通常会输出**多尺度的特征**,即同时输出模型中间层和最后一层的特征。这样可以同时获得高层的语义信息和底层的细节信息,对提升模型的理解能力很有帮助。