Vi Transformer

部署运行你感兴趣的模型镜像

Vision Transformer(ViT)是计算机视觉的 “自注意力时代” 的标志性模型,由 Dosovitskiy 等人于 2021 年提出,核心创新是将纯 Transformer 架构直接应用于图像识别,突破了 CNN 在视觉任务中的主导地位。其核心逻辑是 “将图像转化为序列特征,通过 Transformer 编码器的自注意力机制捕捉全局依赖”,以下为解析核心结构与模型框架:

在介绍ViTransformer之前我想先整理回顾一下Transformer,熟悉的可跳过这部分。

参考文献:

https://doi.org/10.48550/arXiv.2111.07624

Transformer

一、注意力机制

注意力机制是一个帮助算法辨别信息重要性的计算流程,它通过计算样本与样本之间相关性来判断每个样本之于一个序列的重要程度,并给这些样本赋予能代表其重要性的权重

衡量两个向量之间的相关性就是计算其内积:

r=\vec{a}\cdot \vec{b}

若r=0,说明向量a、b不相关;r>0,a、b正相关;r<0,a、b负相关。

在自然语言处理中,一段话(一条语句)划分为多个基本单元token,token可能是一个字、一个符号、也可能是一个词。总之,在输入模型之前,需要对句子进行token划分。

而每个token就会通过embadding将其用n维向量(词向量,一般n=512)来表示,相当于把token投影到n维空间中:

token_idexdim0dim1dim2……dim_n向量
00.80 0.70 0.76 0.67 0.64 x1
10.08 0.86 0.88 0.58 0.29 x2
最好的20.74 0.53 0.19 0.82 0.16 x3
时代30.12 0.55 0.95 0.49 0.35 x4
40.90 0.57 0.27 0.53 0.70 x5
50.08 0.50 0.31 0.95 0.95 x6
60.30 0.91 0.83 0.23 0.09 x7
最坏的70.76 0.85 0.58 0.23 0.17 x8
时代80.56 0.93 0.47 0.68 0.97 x9
90.99 0.33 0.43 0.48 0.42 x10

计算注意力的过程,就是计算词语两两之间的相关性的过程,若两个词之间相关性强,说明注意力的权重可能更高。

例如,计算“最好的"“时代”之间的相关性,就是计算向量x3和x4的内积;把这一整个句子组成的词向量看作输入矩阵X={x1,x2,x3,……xn},那么

X_{L\times n}\cdot X^{T}_{L\times n}=R_{L\times L}

得到R自相关性矩阵,是一个对称阵,R的第i行、第j列元素的值表示原来第i个词和第j个词之间的相关性,自注意力就是基于此而计算的。

自注意力计算:

了解了重要的“相关性矩阵”概念,下面介绍自注意力计算的完整式子:

Attention(Q,K,V)=softmax(\frac{Q\cdot K^{T}}{\sqrt{d}})\cdot V

d为词向量维度,三个重要的矩阵:Q查询矩阵、K键矩阵、V值矩阵,一般来说这三个矩阵都由输入特征X投影(Wq、Wk、Wv)而来,包含了输入特征的不同方面信息。这样这个式子就很好理解了,Q与K进行相关性计算得到R,除以\sqrt{d}消除维度大小带来的影响,softmax将R进行归一化,使得R每一行的值相加都为1(有一点“权重”的意思在里面);最后再乘以V得到注意力分数。

因为Q、K都来自同一特征X,Q、K相乘时得到的是“自相关矩阵”,因此计算结果是自注意力

若Q、K来自不同的数据特征(比如Q来自图像、K来自语句),那么计算的结果就是交叉注意力但是注意V要和K来自同一数据特征:

R_{q\times k}=Q_{q\times d}\cdot K^{T}_{k\times d}

A_{q\times d}=R_{q\times k}\cdot V_{k\times d}

*这里我在想为什么Q称为查询矩阵、K称为键矩阵、V称为值矩阵?从上述计算可以知道,K的形状和V的形状一定是相同的,而Q矩阵的形状和注意力分数结果A是相同的,这意味着Q是主体,是“问题发出者”(因为最后的结果A要与来自Q的特征数据相加【残差连接】X+A),而K、V只是“参考文献”,是获取结果的过程中需要参考的一些信息。因为K直接与Q接触,所以他表示参考文献中的关键信息,而V就是参考文献本身的内容。我是这么理解的,大家有不同的理解可以一起讨论。

二、Transformer架构

1.Input部分:词嵌入Embedding和位置编码Positional Encoding

在Transformer中,embedding层位于encoder和decoder之前,主要负责进行语义编码。Embedding层将离散的词汇或符号转换为连续的高维向量,使得模型能够处理和学习这些向量的语义关系。此外,在输入到编码器和解码器之前,通常还会添加位置编码(Positional Encoding),因为Transformer没有内置的序列顺序信息,也就是说Attention机制本身会带来位置信息的丧失

词嵌入Embedding

1. 核心作用

将离散的 token(如单词、子词)从词汇表索引(整数)映射为低维、稠密的连续向量,捕捉 token 的语义信息,解决离散符号无法直接计算的问题。

2. 数学定义

词汇表大小为V,嵌入维度为d_model​(Transformer 默认 512),则 Embedding 层是一个可学习的矩阵E∈R^{V×dmodel}​。

3. 关键特性

  • 可学习性:Embedding 矩阵随模型训练更新,语义相似的 token 会在向量空间中靠近;

  • 缩放因子:Transformer 中会将 Embedding 输出乘以dmodel​​,抵消 Positional Encoding 的幅值影响,保证两者尺度匹配;

  • 共享性:编码器(Encoder)和解码器(Decoder)可共享同一 Embedding 矩阵(如机器翻译任务),减少参数规模。

位置编码Positional Encoding

1. 核心作用

Transformer 无 RNN/CNN 的时序结构,需显式为每个 token 注入位置信息,让模型区分不同位置的相同 token(如 “我吃饭” 和 “吃饭我”)。

2. 实现方式(Transformer 原版)

采用正弦余弦编码(非可学习,固定公式),也可替换为可学习的位置嵌入(效果相近)。对于序列中第pos个位置(从 0 开始)、嵌入维度第i维(从 0 开始),位置编码值为:

3. 关键特性

  • 周期性:正弦 / 余弦函数的周期性可让模型捕捉长序列的相对位置(如pos+k与pos的编码差值固定);

  • 任意长度适配:公式化编码无需预训练,可处理训练时未见过的超长序列;

  • 维度分离:不同维度对应不同周期(从100000到100002(dmodel​−1)/dmodel​),覆盖不同尺度的位置依赖。

4. 位置编码与 Embedding 的融合

将位置编码直接逐元素相加到 Embedding 输出上:

2.Encoder

多头注意力Multi-Head Attention

Multi-Head Attention 就是在self-attention的基础上,对于输入的embedding矩阵,self-attention只使用了一组线性变换Wq、Wk、Wv 来得到Query,Keys,Values。而Multi-Head Attention使用多组Wq、Wk、Wv 得到多组Query,Keys,Values,然后每组分别计算得到一个Z矩阵,最后将得到的多个Z矩阵进行拼接

因为Q、K、V的矩阵维度(L,d_matrix)的d_matrix是要按头数进行划分(比如模型维度d_model=512,H=8,那么d_matrix=512/8=64)因此一般来说H要能被d_model整除。

残差连接&层归一化Add&Norm

这里的Add表示“加和”,是在多头注意力机制输出的信息的基础上加了一个输入数据y自身,这个数据y是从输入层传过来的。这种通过两条链路并行、一条链路进行复杂计算(在这里是多头注意力机制)、一条链路将输入数据y原封不动传到架构后方、并且最终让两条链路上的输出结果进行加和的操作,叫做残差操作。与复杂链路并行、负责将y进行传输的链路就是残差链接

在Transformer结构中,Layer Normalization(层归一化)是一个至关重要的部分,它是一种特定的归一化技术,它在2016年被提出,用于减少训练深度神经网络时的内部协方差偏移(internal covariate shift)。

前馈神经网络FeedForward

线性变换W1+激活函数ReLu+线性变换W2:

3.Decoder

Decoder输入:Decoder的输入是滞后1个单位的标签矩阵(shifted right outputs),并且还要增加一个开始符号sos结束符号eos,我们要将真实标签输入给模型,并且让真实标签指导模型的学习与预测,这种让模型通过正确的标签来学习的流程在Transformer中被称之为是teacher forcing强制教学机制

标签矩阵首先通过嵌入层(embedding)转换成固定大小的向量。就像 Encoder 一样,Decoder 也会对这些嵌入向量添加位置编码,以包含序列中的位置信息。但这里需要注意的是,输入到Decoder层中的sequence_length维度可以与输入到Encoder中的sequence_length维度不一致。

起始标记(SOS)的意义

  • 标识序列的开始:SOS标记用于指示解码器开始生成序列。这在训练和推理过程中都非常重要。

  • 初始化解码器:在解码阶段,解码器需要一个初始输入来开始生成输出序列。SOS标记作为解码器的第一个输入,帮助其启动生成过程。

  • 模型一致性:通过在每个输出序列的开头添加SOS标记,模型在训练时可以学到序列生成的起点,从而在推理时保持一致的生成过程。

结束标记(EOS)的意义

  • 标识序列的结束:EOS标记用于指示生成的序列在何处结束。这对于模型在推理阶段停止生成非常重要。
     
  • 控制生成长度:在没有固定长度的输出序列中,EOS标记告诉模型何时停止生成,而不需要生成固定数量的时间步。这使得模型可以处理变长序列。
     
  • 训练终止条件:在训练过程中,模型学会在适当的时候生成EOS标记,从而正确地结束序列

Teacher Forcing强制教学:

简单来说就是decoder在训练过程中,根据真实标签来进行学习预测(把真实目标标签作为下一步的输入,这个训练过程有真实值做“教正”,因此称为强制教学);不同的是,在测试过程中,由于没有真实标签(可以参考机器翻译任务),encoder只能把自己预测的结果作为下一步的输入。

训练过程

测试过程

虽然Transformer的训练过程是并行的,为了防止模型在生成过程中只能看到当前和当前时间以前的信息,不能看到未来的信息,需要加个前瞻掩码

Masked Multi-Head Attention 带掩码的多头注意力

Decoder 的自注意力层在功能上与 Encoder 的自注意力层类似,它允许 Decoder 关注到之前所有生成的词。然而,为了防止在生成当前词时使用未来的信息(即避免信息泄露),使用了所谓的“掩码”技术(Masking)。这种技术通过将未来位置的值设置为负无穷大(在 softmax 操作前),使得这些位置的影响力为零(经过softmax)。

    编码器-解码器注意力层

    这一层是 Decoder 特有的注意力层,它允许 Decoder 的每个位置关注 Encoder 的全部输出。具体来说,这一层的查询(Q)来自前一层 Decoder 的输出,而键(K)和值(V)则来自 Encoder 的输出。通过这种方式,Decoder 能够利用输入序列中的相关信息来帮助生成正确的输出序列。

    以上就是Transformer的大致介绍,下面来看ViTransformer


    Vision Transformer

    一、核心定位与设计动机

    ViT 的提出旨在验证 “纯自注意力模型能否在视觉任务中达到甚至超越 CNN”,核心动机包括:

    • CNN 依赖卷积核的局部感受野,需通过多层堆叠或空洞卷积扩大视野,全局信息建模效率低;
    • Transformer 的自注意力机制可直接捕捉任意位置间的长距离依赖,无需依赖局部卷积;
    • 借鉴 NLP 中 Transformer 的成功经验,将图像拆分为 patch(补丁)序列,适配 Transformer 的输入格式,实现跨模态迁移。

    二、模型核心框架:从图像到分类的完整流程

            ViT 的整体框架遵循 “图像 patch 化→序列编码→Transformer 编码→分类输出” 的流程,无任何卷积操作,完全基于自注意力机制,具体步骤如下:

    1. 第一步:图像预处理与 Patch Embedding(图像→序列)

    这是 ViT 适配 Transformer 的关键步骤,将 2D 图像转化为 1D 序列特征:

            图像分割:给定输入图像X\in \mathbb{R}^{H\times W\times C}(H、W 为图像尺寸,C 为通道数,如 RGB 图像 C=3),将其均匀分割为 N 个不重叠的正方形 patch,每个 patch 尺寸为 (P×P)(文献中默认 P=16);

    •  例:224×224×3 的图像→分割为 14×14=196 个 16×16×3 的 patch,即 (N=196);

            展平与线性投影:将每个 (P×P×C) 的 patch 展平为 (P^2C) 的 1D 向量,再通过一个线性投影层(Linear Projection)将维度压缩至 D(文献中 D=768),得到每个 patch 的嵌入向量x_{i}\in \mathbb{R}^{D}(i=1,2,...,N)

            序列构造:最终形成长度为 N 的 patch 序列

    X_{seq}=[x_1,x_2,...,x_N]\in \mathbb{R}^{N\times D}

    2. 第二步:位置编码(Positional Embedding)

            Transformer 编码器本身不包含位置信息,而图像 patch 的空间位置对视觉识别至关重要,因此 ViT 引入可学习的位置编码

    • 构造与 patch 序列长度相同的位置嵌入向量 E_{pos} \in \mathbb{R}^{N\times D},每个位置对应一个独特的嵌入向量;
    • 将位置编码与 patch 嵌入序列逐元素相加,得到含位置信息的输入序列:

    X_{input} = X_{seq} + E_{pos}

    3. 第三步:分类 Token 嵌入(Class Token)

            为适配 Transformer 的分类任务,ViT 新增一个特殊的 “分类 Token”:x_{class} \in \mathbb{R}^D,用于聚合全局特征,在 patch 序列前拼接分类 Token,形成新序列:

    X_{token}=[x_{class};x_1;x_2;...;x_N ]\in \mathbb{R}^{(N+1)\times D}

    4. 第四步:Transformer 编码器(核心特征提取)

            ViT 的编码器由 L 个相同的 Transformer Block 堆叠而成(文献中默认 L=12),每个 Block 包含 “多头自注意力(Multi-Head Attention, MHA)” 和 “多层感知机(MLP)” 两个核心子层,且每个子层前均加入 “层归一化(Layer Norm)”,子层后加入残差连接(Residual Connection),这里的结构在Transformer中有讲过包括多头注意力;介绍一下多层感知机MLP:

    作用:对 MHA (多头注意力)的输出进行非线性变换,包含两层全连接和一个激活函数:

    • 第一层全连接:将维度从 D 扩张至 4D(文献中默认扩张系数为 4,即 768→3072),激活函数采用 GELU(Gaussian Error Linear Units);
    • 第二层全连接:将维度从 4D 压缩回 D,无激活函数;
    • 作用:对每个位置的特征进行独立的非线性增强,补充自注意力缺乏的局部特征变换能力。

    5. 第五步:分类头(Classification Head)

            经过 L 层 Transformer 编码器后,提取分类 Token 对应的输出特征z_{class} \in \mathbb{R}^D (即编码器输出序列的第一个元素),通过一个简单的分类头得到最终预测结果:

    • 文献中分类头设计:一层全连接层,将 D 维特征映射至类别数 K,再通过 Softmax 输出分类概率;
    • 预训练与微调差异:预训练时(如 JFT-300M 数据集),分类头采用 “MLP(含一层隐藏层)”;微调时(如 ImageNet),简化为单层全连接,提升泛化能力。

    总结:

            文献中验证,ViT 在大规模数据集(如 JFT-300M)上的分类性能超越当时的 CNN(如 ResNet-50),且模型结构更简洁、通用性更强。其核心贡献不仅是提出一种新的视觉骨干网络,更开启了 “Transformer 主导视觉任务” 的新时代,后续衍生出 PVT、Swin-Transformer、CoAtNet 等一系列变体,均基于 ViT 的 “patch 序列 + Transformer 编码” 核心框架。

            ViT 的成功证明:“视觉任务无需依赖卷积的局部归纳偏置,纯自注意力机制可通过数据驱动学习视觉特征”,为后续视觉 Transformer 的发展奠定了基础。

    您可能感兴趣的与本文相关的镜像

    PyTorch 2.5

    PyTorch 2.5

    PyTorch
    Cuda

    PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值