讲解Transformer原理!从入门到精通
但语言中的关系是复杂的,比如有语法关系、语义关联、指代关系等,单头注意力难以同时捕捉多种不同类型的关系。如果你把这些积木打乱顺序丢给一个机器人,机器人虽然能看到每个单词,但无法知道“我”、“爱”、“猫”的正确顺序,可能会错误地理解为“猫爱我”或“爱我猫”。注意力机制的整个过程就是:用你的问题去匹配文章中每个部分的标签,匹配度越高,说明其对应的信息越重要,就给这个信息分配更高的权重,最后把这些重要信
【【2026最新版】Transformer动画讲解教程!0基础易学,通俗易懂讲解Transformer原理!从入门到精通,看这一个视频就够了!】 https://www.bilibili.com/video/BV1NEf4BwESu/?share_source=copy_web&vd_source=2aa1470d7d939c522655c8cac5f2f8aa
15分钟快速认识视觉Transformer(ViT)
你有没有想过,为什么现在的AI不仅能聊天,还能看懂图片?当你发过去一张照片、一个截图,它就能给出答案。这个能“看见”的AI,背后的核心技术是什么?它叫什么名字,为了解决什么问题而诞生,它的核心方法又是什么?如果从实际工作的角度,它的输入和输出又分别是什么?
今天,我们就来深入理解一下它——ViT。
一、直观理解:什么是ViT?
ViT的全称是视觉Transformer(Vision Transformer)。让我先给你一个直观的理解:ViT是一个非常好的、用于处理和理解图像数据的工具。简单来说,它的工作方式可以概括为两个步骤:
- 把图片变成序列:先把图片切分成一个个小块。
- 用处理文本的方式来处理图片:然后,像处理文本序列一样,用Transformer来处理这些小块。
Google团队在论文《An Image is Worth 16x16 Words》中首次提出了ViT。这个论文名字本身就暗示了ViT的核心思想:把一张图片看成是由16x16个“单词”(也就是图像块)组成的句子。
二、为什么我们需要ViT?(它要解决CNN的什么问题)
这时候你可能会问:在ViT出现之前,图像领域的绝对霸主是卷积神经网络(CNN),它非常强大。那为什么我们还需要ViT呢?问题在于,CNN虽然强大,但也被一种叫做归纳偏置的东西所限制。
什么是归纳偏置?
简单来说,就是模型对数据做出的预先假设。对于图像,CNN有两个核心假设:
- 局部性:认为一张图片中,距离近的像素(局部区域)之间的关系最重要。
- 平移不变性:认为一个特征(比如一只眼睛)无论出现在图片的哪个位置,它都代表同样的含义。
这个假设在很多时候确实有用,但也给CNN带来了几个核心问题:
- 感受野受限:CNN的核心计算单元是卷积核,它本质上是一个小尺寸的滑动窗口(比如3x3或5x5)。在每一层,每个卷积核只能看到这个小窗口内的信息。要想看到更大范围的图像信息,CNN必须堆叠非常多的网络层,让信息一层一层地传递。这就像一个拿着放大镜看地图的人,必须一点一点地挪动和拼接,才能在大脑中形成整张地图的全局印象。这种方式效率低,而且在信息长距离传递的过程中,容易出现信息丢失。
- 长距离依赖关系建模困难:CNN很难捕捉到图像中两个距离很远的像素之间的直接关系。它能很好地识别具体的物体(比如一朵花),但在很多任务中,我们更需要模型理解整张图片的全局信息,理解万物之间复杂的关系。比如:
-
- 遮挡关系:人站在树前,模型需要知道树是被部分遮挡的,而不是长成了奇怪的形状。
- 支撑关系:杯子放在桌子上,模型需要理解重力和支撑的概念,知道杯子不是悬浮的。
- 相对大小:需要理解透视原理,知道远处的小汽车和近处的人,在现实中哪个更大。
要解决这些问题,CNN唯一的办法就是堆叠更多网络层,让感受野逐步扩大到覆盖整个图像,但这并不容易。
- 扩展性差:经典的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扮演着至关重要的角色,通常作为视觉编码器。
它的工作流程是:
- 用户输入一张图片和一个文本问题。
- 图片进入ViT视觉编码器,被切成图像块,并转换成高质量的图像特征向量。这个特征不仅包含了图片的局部信息,更重要的是包含了ViT捕捉到的全局语义理解。
- 这个图像特征会通过一个连接器,与文本特征的维度和语义空间对齐(例如,将图像特征的维度调整到语言模型能接受的维度)。
- 最后,处理后的图像特征和用户的文本问题一起进入大语言模型,大语言模型就能根据“看到”的图像内容和问题,生成相应的回答。
如果ViT这个“眼睛”看不清或理解得不好,那么大语言模型这个“大脑”再聪明也没用。
五、总结:ViT的输入和输出
- 输入:最基本的是RGB图像。图像会经过预处理(如调整大小、归一化)。在一些高级应用中,输入也可能是多张图片,模型需要理解它们之间的关系。
- 输出:取决于具体的任务,这也是容易混淆的地方。
-
- 图像分类:输出一个概率分布向量,代表图像属于每个类别的可能性。
- 作为视觉编码器:输出的是一个特征图,即所有图像块向量的集合。例如,一张图被分成256个块,输出就是一个256x768的特征矩阵。有时候为了减少计算量,模型可能只输出其中的一部分(如
[cls] token)。 - 目标检测/图像分割:输出需要包含更精细的空间信息。模型不仅会用
[cls] token,还会利用每个图像块的特征,并加上一个专门的检测头或分割头,来生成每个区域或每个像素的预测。 - 现代多模态模型:通常会输出多尺度的特征,即同时输出模型中间层和最后一层的特征。这样可以同时获得高层的语义信息和底层的细节信息,对提升模型的理解能力很有帮助。
Transformer中的位置编码(Positional Encoding)深度解析
在Transformer架构中,位置编码是一个至关重要的组件。本文将解答以下核心问题:什么是位置编码?为什么需要它?它的数学公式如何理解?它有什么优势?以及常用的改进版本——旋转位置编码(RoPE)又是如何实现的?
一、什么是位置编码?它在哪里?
在Transformer模型中,位置编码被添加在数据处理的最初阶段,具体位置是在词嵌入(Input Embedding)之后、第一个编码器(Encoder)或解码器(Decoder)之前。

流程是这样的:
- 输入文本经过分词(Tokenization)和词嵌入矩阵,被转换为词向量。
- 生成与词向量维度相同的位置编码向量。
- 将词向量和位置编码向量进行逐元素相加(Element-wise Sum),而不是拼接。
- 最后,将这个相加后的、融合了语义信息和位置信息的向量,作为后续编码器和解码器层的输入。

二、为什么需要位置编码?
想象一下,你有一堆写有单词的积木,它们可以拼成一句话,比如“我爱猫”。如果你把这些积木打乱顺序丢给一个机器人,机器人虽然能看到每个单词,但无法知道“我”、“爱”、“猫”的正确顺序,可能会错误地理解为“猫爱我”或“爱我猫”。
Transformer的自注意力机制就有点像这个机器人。它的核心优势是能并行处理所有词,而不是像RNN那样逐个按顺序读。但这种并行处理也带来了一个问题:自注意力机制本质上是置换等变的。这意味着,如果你打乱输入序列中单词的顺序,输出的结果也会以完全相同的方式被打乱。从数学上看,自注意力的计算主要是对输入矩阵进行一系列矩阵乘法和缩放变换,它并不关心元素在序列中的绝对或相对位置。
对于语言这种顺序至关重要的数据,这种顺序无关性就成了一个巨大缺陷。为了弥补这一点,我们必须给模型一个关于“顺序”的提示。这个提示,就是位置编码。


三、正弦位置编码的数学原理
Transformer论文中使用的是一种基于正弦和余弦函数的位置编码,其公式定义如下:


公式解读:
- 频率变化:公式为每个维度对(偶数维用正弦,奇数维用余弦)分配了不同的频率。频率由分母中的 ( 10000^{2i/d_{model}} ) 控制。
- 波长递增:随着维度索引 ( i ) 的增加,波长从 ( 2\pi ) 增加到 ( 2\pi \cdot 10000 )。这意味着:
-
- 低维度(i小):波长短,函数值变化快。这有助于模型捕捉词语之间的局部关系(比如紧邻的词)。如果两个词在位置上很近,它们在低维位置编码上的差异会很明显。
- 高维度(i大):波长长,函数值变化平缓。这有助于模型学习长距离依赖关系,提供一个稳定的、捕捉全局上下文信息的粒度。
- 选择10000的理由:这个超参数让位置编码的频率范围形成从 ( 2\pi ) 到 ( 2\pi \cdot 10000 ) 的几何级数。一方面保证了频率覆盖范围足够大,另一方面也兼顾了模型学习短序列和长序列的能力。
举例说明:

四、正弦位置编码的优势
- 唯一性与有界性:每个位置的编码向量是唯一的,且所有值都在[-1, 1]范围内。它是一种确定性的编码,无需学习,直接告诉模型每个位置的“坐标”。
- 序列长度外推性:由于正弦和余弦函数是连续且定义在实数域上的,因此该编码可以为任意长的序列(甚至超出训练时见过的长度)生成位置向量。模型理论上可以处理更长的文本。
- 捕捉相对位置关系:这是其最精妙之处。正弦位置编码能够保持相对位置关系的一致,即位置的线性偏移可以表示为原始位置编码的线性变换。数学证明简述:
这个特性使得模型可以非常方便地从绝对位置编码中推断出词与词之间的相对关系,这对于理解语言至关重要。
五、改进版:旋转位置编码(RoPE)
尽管正弦位置编码很优秀,但它本质上还是给每个位置附加一个绝对位置信号。有没有能直接编码相对位置的方法呢?有,那就是旋转位置编码。
RoPE的核心思想:不是在输入词向量上添加位置信息,而是在自注意力机制的计算过程中,对Query和Key向量进行旋转操作,使得它们的内积(即注意力分数)天然地包含相对位置信息。

具体实现步骤:


RoPE的优势:
- 直接编码相对位置:注意力分数天然地依赖于相对位置 ( m-n ),完美符合语言建模的需求。
- 平移不变性:序列的整体平移不会改变内部的注意力模式。
- 更好的外推能力:由于旋转角度是连续变化的,理论上可以处理任意长度的序列。相对位置 ( m-n ) 的增大,其对应的旋转角度差 ( (m-n)\theta_j ) 也会增大,导致注意力分数自然衰减,这符合直觉(距离越远的词,相关性通常越弱)。
注意力机制(Attention)与多头注意力(Multi-Head Attention)深度解析
注意力机制是Transformer模型的灵魂。本文将从核心思想、数学原理到模型应用,一步步深入理解从注意力机制,到自注意力,再到多头注意力的演变过程。
一、核心思想:从生活例子理解注意力
想象一下你在做阅读理解。如果没有注意力机制,你可能会:
- 通读全文:从头到尾读一遍文章,努力记住所有信息,形成一个模糊的整体印象。
- 寻找答案:看到问题后,再根据这个模糊的印象来寻找答案。
这种方法有两个问题:信息过载(长文章记不住细节)和效率低下(浪费精力在不相关的内容上)。
而有了注意力机制,你会更聪明地这样做:
- 带着问题阅读:先看问题,比如“故事发生的时间是什么?”。这个问题就是查询。
- 扫描关键信息:带着问题重新审视文章的每一部分,特别关注那些包含时间、日期的词句。这些词句的标签(比如“日期”)就是键。
- 分配关注度:大脑判断哪些句子与问题最相关,并为这些相关的句子分配更高的注意力权重。
- 整合信息:最后,将这些被重点关注的信息整合起来,得出精确答案“8月14日”。这个答案信息就是值。
这个例子模仿了人类的注意力分配方式:为数据的不同部分分配不同的权重,使模型能够在生成输出的每一步,动态地、有选择性地关注输入中最相关的部分。
在这个机制里,有三个核心概念:
- 查询:代表模型当前正在“问”什么,相当于我们看文章时脑子里的那个问题。
- 键:与输入序列的每个元素相关联,被用来与查询匹配,回答了“这个部分是什么?”的问题,类似于文章的标签。
- 值:也与每个元素相关联,代表了该元素的实际内容和特征。它回答了“如果我关注这个部分,应该提供什么信息?”的问题,类似于文章句子本身包含的真实信息。
注意力机制的整个过程就是:用你的问题去匹配文章中每个部分的标签,匹配度越高,说明其对应的信息越重要,就给这个信息分配更高的权重,最后把这些重要信息整合起来,形成答案。
二、注意力机制的数学抽象
更专业地说,注意力机制可以抽象为:将一个查询和一系列键值对映射到一个输出。其中,查询、键、值、输出都是向量。输出是值的加权和,而分配给每个值的权重是通过查询与对应键的相似度计算出来的。

不同的注意力算法,计算相似度的方式也不同。
早期注意力(如Bahdanau Attention):常与RNN结合使用。其核心思想是用一个加性神经网络来计算查询与键的匹配度,因此也叫加性注意力。虽然当时的论文没有明确提出Query、Key、Value的概念,但我们可以对应理解:
- 查询:解码器在生成当前词时的隐藏状态 ( s_{t-1} ),代表了“我需要什么样的信息”这个需求。
- 键:编码器的所有隐藏状态 ( h_j ),它们包含了输入序列中每个位置的信息,用于与查询进行匹配。
- 值:同样也是编码器的隐藏状态 ( h_j )。计算出注意力权重后,对它们进行加权求和,得到上下文向量 ( c_t )。
三、自注意力机制(Self-Attention)
Transformer提出的自注意力机制标准化了Q、K、V的概念。其核心在于Q、K、V都来自同一个输入。
假设我们有一个长度为 ( n ) 的文本序列,每个词已被转换为词向量,维度为 ( d_{model} )(例如512)。这 ( n ) 个向量组成了一个矩阵 ( X ),尺寸为 n×dmodel

)。

计算步骤:



Softmax归一化:对缩放后的分数矩阵的每一行应用Softmax,使其转换为概率分布,即注意力权重 ( A )。每一行的权重和为1。
这个权重矩阵是模型可解释性的重要来源,它直观地展示了词与词之间的相互关注程度。

为什么需要缩放?
-
- 控制方差:假设 ( q ) 和 ( k ) 的元素是独立同分布,均值为0,方差为1。那么它们的点积 ( q \cdot k ) 的均值是0,方差是 ( d_k )。即点积的方差与维度 ( d_k ) 成正比。当 ( d_k ) 很大时,点积的数值会非常大,导致后续Softmax函数的梯度极小(进入饱和区),不利于训练。
- 保持梯度稳定:除以 ( \sqrt{d_k} ) 后,点积的方差被拉回1,与维度无关。这使得Softmax函数的输入落在一个梯度敏感的区域内,保证了训练过程中梯度的健康流动。


四、多头注意力机制(Multi-Head Attention)
单头自注意力有一个局限:它只用一组 矩阵,相当于让模型从一个角度(或子空间)去理解词与词之间的关系。但语言中的关系是复杂的,比如有语法关系、语义关联、指代关系等,单头注意力难以同时捕捉多种不同类型的关系。
为此,Transformer提出了多头注意力,它允许模型共同关注来自不同位置、不同表示子空间的信息。
多头注意力的优势:
- 捕捉多重关系:每个头可以学习关注不同类型的关系。例如,一个头可能关注语法依赖,另一个头可能关注语义相似性。
- 增强表达能力:从不同的表示子空间中提取信息,通过拼接保留所有信息,形成一个更丰富、更全面的表示,而不是像单头那样将所有信息混合到一个单一向量里。




五、Transformer中的三种注意力
在Transformer架构中,注意力机制有三种应用方式:
- 编码器自注意力:Q、K、V都来自编码器上一层的输出。每个位置都可以关注到前一层的所有位置,信息可以在任意位置之间自由流动,用于理解输入序列的全局关系。
- 解码器掩码自注意力:Q、K、V都来自解码器上一层的输出。但与编码器不同,为了保持自回归属性(即预测下一个词时不能看到未来的词),这里会使用一个掩码矩阵,屏蔽未来位置的信息,使得每个位置只能关注到它自己和之前的位置。
- 编码器-解码器注意力:这个层连接着编码器和解码器。它的查询Q来自解码器前一层的输出,而键K和值V来自编码器的最终输出。这使得解码器在生成每个词时,都可以关注到输入序列中的所有位置,实现从源语言到目标语言的信息对齐。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)