AI学习笔记整理(33)—— 视觉Transformer (ViT)与自注意力机制

Transformer

1. 基本概念

Transformer模型是一种深度学习架构,最初为自然语言处理任务设计,其核心创新在于利用自注意力机制捕捉序列中元素间的全局关系,从而克服传统循环神经网络在处理长序列时的效率与依赖性局限。‌由Vaswani等人在2017年的论文《Attention Is All You Need》中首次提出。它完全摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)结构,仅使用注意力机制来处理序列数据。

Transformer模型之所以被称为"Transformer",是因为它的核心功能是对输入数据的矩阵进行变换处理。

这种变换是通过计算矩阵内部各个向量之间的关系来实现的,目的是去除无效信息并加强有效信息。在这个过程中,组成矩阵的向量的值会发生变化,但形状保持不变。这样的变换使得模型能够更好地解决最终数学问题,计算最优解。

2. 核心组件
2.1 自注意力机制(Self-Attention)

自注意力机制允许模型在处理每个元素(如单词)时关注输入序列中的所有其他元素,计算它们之间的相关性分数。通过计算查询(Query)、键(Key)和值(Value)之间的相关性,动态分配权重,以聚焦于最相关的上下文信息。‌具体过程包括:

  • 将输入向量转换为查询(Query)、键(Key)和值(Value)三个向量
  • 计算Query与所有Key的点积得分
  • 通过softmax归一化得到注意力权重
  • 用权重对Value进行加权求和

2.2 多头注意力(Multi-Head Attention)

多头注意力将自注意力机制并行执行多次(通常8次),每个"头"学习不同的注意力模式,最后将结果拼接起来。这使模型能够同时关注来自不同位置的不同表示子空间的信息。

2.3 位置编码(Positional Encoding)

由于Transformer不包含循环或卷积结构,需要显式地注入位置信息。位置编码使用正弦和余弦函数为每个位置生成独特的向量,与词嵌入相加后输入网络,以保留序列的顺序信息,使模型能区分"我爱"与"爱我"的语义差异。

2.4 前馈神经网络‌

每个位置的嵌入向量会通过一个共享的前馈网络,进行非线性变换,以提升表示能力。‌

3. 架构细节

Transformer由编码器(Encoder)和解码器(Decoder)两部分组成,两者均包含多个重复的块(block)。‌

Transformer采用编码器 - 解码器架构。编码器由多个相同层堆叠而成,每层包含多头自注意力机制和前馈神经网络,通过残差连接和层归一化稳定训练。解码器同样多层堆叠,在自注意力机制基础上增加了编码器 - 解码器注意力层,同样有残差连接与层归一化。位置编码注入序列位置信息,共同构成完整架构。

上图是Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。

3.1 编码器(Encoder)结构

负责将输入序列转换为上下文相关的表示。

  1. 输入嵌入层(Input Embedding)
  2. 位置编码(Positional Encoding)
  3. N个相同的编码器层(通常N=6),每层包含:
    • 多头自注意力子层:计算输入序列内部的自注意力。
    • 前馈神经网络子层:对每个位置的向量独立进行变换。
    • 每个子层后都有残差连接和层归一化:确保梯度稳定,促进深层网络训练。‌

3.2 解码器(Decoder)结构

基于编码器输出生成目标序列,结构类似编码器。

  1. 输出嵌入层(Output Embedding)
  2. 位置编码(Positional Encoding)
  3. N个相同的解码器层(通常N=6),每层包含:
    • 遮蔽多头注意力‌:带掩码的多头自注意力子层(防止信息泄露),防止当前位置关注未来信息,保持自回归特性。
    • ‌交叉注意力层:多头编码器-解码器注意力子层,使解码器能整合编码器的上下文信息,实现源目标对齐。‌
    • 前馈神经网络子层
    • 每个子层后都有残差连接和层归一化

3.3 工作流程

输入序列首先通过嵌入层转化为向量,并添加位置编码。编码器逐层处理这些向量,通过自注意力机制丰富上下文表示。解码器则逐步生成输出,每一步利用交叉注意力对齐源上下文,并通过softmax层预测下一个词,直至生成结束标记。‌

可以先将 Transformer 模型视为一个黑盒:通俗地说、Transformer就是一个翻译器。在机器翻译任务中,将一种语言的一个句子作为输入,然后将其翻译成另一种语言的一个句子作为输出。中间部分由编码器 和 解码器两部分组成。

Transformer架构已成为现代大模型(如GPT、BERT)的基础,广泛应用于机器翻译、文本生成等任务。‌

4. 优势与应用

4.1 主要优势

  1. 并行计算能力:相比RNN的序列处理,Transformer可以并行处理整个序列
  2. 长距离依赖建模:自注意力机制直接建模任意距离的关系
  3. 可扩展性:模型性能随着参数增加而持续提升

4.2 典型应用

  1. 机器翻译(如Google的Transformer模型)
  2. 文本生成(如GPT系列模型)
  3. 文本分类
  4. 语音识别
  5. 图像处理(如Vision Transformer)

5. 局限性

尽管 Transformer 模型在自然语言处理领域取得了巨大的成功,然而,其本身也存在一些局限性,主要包括以下几个方面:

  1. 高计算资源需求:Transformer 模型通常需要大量的计算资源进行训练和推理。由于模型参数众多且复杂,需要显著的计算能力和存储资源来支持其运行,从而使得在资源受限的环境下应用 Transformer 模型变得相对困难。

  2. 长文本处理困难:在某些特定的场景下,由于 Transformer 模型中自注意力机制的特性,其对于长文本的处理存在一定的困难。随着文本长度的增加,模型的计算复杂度和存储需求也会显著增加。因此,对于超长文本的处理,Transformer 模型可能会面临性能下降或无法处理的问题。

  3. 缺乏实际推理机制:在实际的业务场景中,Transformer 模型通常是通过在大规模数据上进行预训练,然后在特定任务上进行微调来实现高性能,从而使得模型在实际推理过程中对于新领域或特定任务的适应性有限。因此,对于新领域或特定任务,我们往往需要进行额外的训练或调整,以提高模型的性能。

  4. 对训练数据的依赖性:Transformer 模型在预训练阶段需要大量的无标签数据进行训练,这使得对于资源受限或特定领域数据稀缺的情况下应用 Transformer 模型变得困难。此外,模型对于训练数据的质量和多样性也有一定的依赖性,不同质量和领域的数据可能会对模型的性能产生影响。

  5. 缺乏常识推理和推理能力:尽管 Transformer 模型在语言生成和理解任务上取得了显著进展,但其在常识推理和推理能力方面仍存在一定的局限性。模型在处理复杂推理、逻辑推断和抽象推理等任务时可能表现不佳,需要进一步的研究和改进。

6. 变体与扩展

  1. BERT:双向Transformer编码器,用于语言理解
  2. GPT:自回归Transformer解码器,用于文本生成
  3. Transformer-XL:处理更长序列的改进版本
  4. Sparse Transformer:降低计算复杂度的变体
  5. Vision Transformer:将Transformer应用于计算机视觉任务

视觉Transformer(ViT)

视觉Transformer(Vision Transformer,ViT)是Transformer在计算机视觉领域的直接应用,通过将图像分割为图像块(patches)序列,将其转化为类似自然语言处理中的词元序列,从而利用Transformer架构进行视觉任务建模。‌

ViT的核心思想是将图像视为序列数据,通过分块和自注意力机制实现全局信息交互。具体流程包括:

  • 图像分块(Patch Embedding):输入图像被分割为不重叠的图像块(例如16×16像素),每个块展平为一维向量,并通过可学习的线性投影映射到嵌入空间。每个块被展平并通过线性投影映射到嵌入空间,形成一维序列;例如,一个224×224×3的图像会被分成14×14=196个块,每个块投影到768维空间。‌

  • ‌位置编码(Position Encoding)‌:由于Transformer本身对输入顺序不敏感,ViT引入位置编码(可学习或固定正弦编码)来保留图像块的空间位置信息。‌添加位置编码以保留空间信息,然后输入Transformer编码器。‌

  • Transformer Encoder层‌:由多头自注意力(MSA)和多层感知机(MLP)交替堆叠而成,每层包含残差连接和层归一化。MSA通过Query-Key-Value计算捕捉块间全局依赖,而MLP则对特征进行非线性变换。‌

  • 分类头‌:在序列开头添加一个特殊[class] token,其对应的输出经过MLP后生成类别概率。‌

与传统卷积神经网络(CNN)相比,ViT具有全局建模能力,因为自注意力机制允许任意两个图像块直接交互,克服了CNN的局部感受野限制。‌然而,ViT对数据量依赖较大,需在大规模数据集(如JFT-300M)上预训练才能避免过拟合,而CNN在小数据集上表现更稳健;此外,ViT的计算复杂度随序列长度平方增长,处理高分辨率图像时效率较低,而CNN更适合密集视觉任务。‌在归纳偏差方面,ViT几乎无先验假设(弱归纳偏差),需从数据中学习图像特性,而CNN隐式编码了局部性和平移不变性等先验知识(强归纳偏差)。‌

ViT的网络结构

参考链接:https://felix.blog.csdn.net/article/details/128298751

BERT模型是Transformer结构的Encoder部分,其基本的网络结构如下图所示:这个结构与Transformer中的Encoder结构是完全一致的。

ViT模型是希望能够尽可能少对Transformer模型修改,并将Transformer应用于图像分类任务的模型。ViT模型也是基于Transformer的Encoder部分,这一点与BERT较为相似,同时对Encoder部分尽可能少的修改。

ViT的网络结构如下图所示:

ViT模型的网络结构如上图的右半部分所示,与原始的Transformer中的Encoder不同的是Norm所在的位置不同,类似BERT模型中[class]标记位的设置,ViT在Transformer输入序列前增加了一个额外可学习的[class]标记位,并且该位置的Transformer Encoder输出作为图像特征。

Vision Transformer(ViT)将输入图片拆分成16 × 16个patches,每个patch做一次线性变换降维同时嵌入位置信息,然后送入Transformer。类似BERT[CLS]标记位的设计,在ViT中,在输入序列前增加了一个额外可学习的[class]标记位,并将其最终的输出作为图像特征,最后利用MLP做最后的分类,如上图中的左半部分所示,其中,[class]标记位为上图中Transformer Encoder的0*。那么现在的问题就是两个部分,第一,如何将图像转换成一维的序列数据,因为BERT处理的文本数据是一维的序列数据;第二,如何增加位置信息,因为在Transformer中是需要对位置信息编码的,在BERT中是通过学习出来,而在Transformer中是利用sin和cos这两个公式生成出来。

ViT的典型应用场景

包括图像分类、目标检测(如DETR)、图像生成和医学图像分析,其中其全局上下文建模能力有助于捕捉长程依赖关系。‌为改进ViT的局限性,后续工作如Swin Transformer引入了滑动窗口机制和多尺度设计,以降低计算复杂度并适应不同分辨率任务。‌

  • 图像分类:ViT在ImageNet上达到与CNN相当甚至更优的准确率。
  • 目标检测(如DETR):使用Transformer编码器-解码器进行端到端检测。
  • 图像生成(如TransGAN):结合生成对抗网络。
  • 医学图像分析:在医学图像分析中,ViT融合局部与全局特征,增强了对细微结构(如微血管)和整体形态(如器官边界)的理解,适用于疾病分级等细粒度任务。‌

自注意力机制

注意力机制Attention和自注意力机制Self-Attention的区别

传统的Attention机制发生在Target的元素和Source中的所有元素之间。简单讲就是说Attention机制中的权重的计算需要Target来参与。即在Encoder-Decoder 模型中,Attention权值的计算不仅需要Encoder中的隐状态而且还需要Decoder中的隐状态。

Self-Attention:不是输入语句和输出语句之间的Attention机制,而是输入语句内部元素之间或者输出语句内部元素之间发生的Attention机制。例如在Transformer中在计算权重参数时,将文字向量转成对应的KQV,只需要在Source处进行对应的矩阵操作,用不到Target中的信息。

Self-Attention(自注意力机制)

Self Attention就是句子中的某个词对于本身的所有词做一次Attention。算出每个词对于这个词的权重,然后将这个词表示为所有词的加权和。每一次的Self Attention操作,就像是为每个词做了一次Convolution操作或Aggregation操作。具体操作如下:

首先,每个词都要通过三个矩阵Wq, Wk, Wv进行一次线性变化,一分为三,生成每个词自己的query, key, vector三个向量。以一个词为中心进行Self Attention时,都是用这个词的key向量与每个词的query向量做点积,再通过Softmax归一化出权重。然后通过这些权重算出所有词的vector的加权和,作为这个词的输出。

Self-Attention 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词。

Self-Attention 的输出:得到矩阵 Q, K, V之后就可以计算出 Self-Attention 的输出了,计算的公式如下:

公式中计算矩阵Q和K每一行向量的内积,为了防止内积过大,因此除以

的平方根。Q乘以K的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。

Masked Attention

Decoder与Encoder的另外一个不同,就是每个Decoder单元的输入层,要先经过一个Masked Attention层。那么Masked的与普通版本的Attention有什么区别呢?

Encoder因为要编码整个句子,所以每个词都需要考虑上下文的关系。所以每个词在计算的过程中都是可以看到句子中所有的词的。但是Decoder与Seq2Seq中的解码器类似,每个词都只能看到前面词的状态,所以是一个单向的Self-Attention结构。

Masked Attention的实现也非常简单,只要在普通的Self Attention的Softmax步骤之前,与(&)上一个下三角矩阵M就好了

Multi-Head Attention

Multi-Head Attention就是将上述的Attention做h遍,然后将h个输出进行concat得到最终的输出。这样做可以很好地提高算法的稳定性,在很多Attention相关的工作中都有相关的应用。Transformer的实现中,为了提高Multi-Head的效率,将W扩大了h倍,然后通过view(reshape)和transpose操作将相同词的不同head的k、q、v排列在一起进行同时计算,完成计算后再次通过reshape和transpose完成拼接,相当于对于所有的head进行了一个并行处理。

Multi-Head Attention 是由多个 Self-Attention 组合形成的,下图是论文中 Multi-Head Attention 的结构图。

从上图可以看到 Multi-Head Attention 包含多个 Self-Attention 层,首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵Z。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵Z。

得到 8 个输出矩阵 Z1到 Z8之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z。

参考链接:https://blog.csdn.net/qq_38769809/article/details/147999197
https://zhuanlan.zhihu.com/p/338817680

相关推荐
2401_841495648 小时前
【自然语言处理】中文文本字频统计与交互式可视化工具
人工智能·python·自然语言处理·多线程·分块读取·文本分析·字频统计
十铭忘8 小时前
SAM2跟踪的理解8——mask decoder
人工智能·计算机视觉
【上下求索】8 小时前
学习笔记096——Windows postgreSQL-18.1[压缩包版本]
windows·笔记·学习·postgresql
五度易链-区域产业数字化管理平台8 小时前
五度易链产业大脑:从数据融合到智能决策的技术实践
大数据·人工智能
加点油。。。。8 小时前
【强化学习】——策略梯度方法
人工智能·机器学习·强化学习
中屹指纹浏览器8 小时前
2025 技术解析:中屹量子加密级隐私防护技术底层实现与安全逻辑
经验分享·笔记
2401_841495648 小时前
【自然语言处理】处理 GBK 编码汉字的算法设计
人工智能·python·自然语言处理·校验·文件读写·gbk编码与解码·批量过滤
路在脚下,梦在心里8 小时前
net学习总结
android·学习