Vision Transformer (ViT) 计算复杂度详解

Vision Transformer (ViT) 计算复杂度详解

1. 输入与 Patch Embedding 的复杂度

1.1 输入图像

假设输入图像的尺寸为:
输入图像 = H × W × C \text{输入图像} = H \times W \times C 输入图像=H×W×C

  • H H H W W W:图像的高度和宽度。
  • C C C:图像的通道数(通常为 3,代表 RGB 图像)。

1.2 Patch 分割

将图像分割成 P × P P \times P P×P 的 Patch,每个 Patch 被展平为一维向量,作为 Transformer 的输入。

  • Patch 的数量
    N = H ⋅ W P 2 N = \frac{H \cdot W}{P^2} N=P2HW
    N N N 是分割得到的 Patch 数。

  • 每个 Patch 的维度
    d patch = P ⋅ P ⋅ C d_{\text{patch}} = P \cdot P \cdot C dpatch=PPC
    即每个 Patch 包含 P × P P \times P P×P 个像素,乘以通道数 C C C

1.3 Patch Embedding

每个 Patch 经过一个线性层投影到固定维度 d model d_{\text{model}} dmodel

  • 线性变换的权重矩阵大小
    W embed ∈ R d patch × d model W_{\text{embed}} \in \mathbb{R}^{d_{\text{patch}} \times d_{\text{model}}} WembedRdpatch×dmodel

  • 线性变换的计算复杂度
    对所有 N N N 个 Patch 执行线性变换:
    O embedding = N ⋅ d patch ⋅ d model O_{\text{embedding}} = N \cdot d_{\text{patch}} \cdot d_{\text{model}} Oembedding=Ndpatchdmodel


2. Transformer Encoder 的复杂度

Transformer Encoder 是 ViT 的核心组件,其复杂度主要来源于 多头自注意力机制前馈网络

2.1 多头自注意力机制

2.1.1 Query、Key、Value 计算

对于输入特征 X ∈ R N × d model X \in \mathbb{R}^{N \times d_{\text{model}}} XRN×dmodel

  • 计算 Query、Key 和 Value:
    Q = X W Q , K = X W K , V = X W V Q = XW_Q, \quad K = XW_K, \quad V = XW_V Q=XWQ,K=XWK,V=XWV
    其中 W Q , W K , W V ∈ R d model × d model

### Vision Transformer 的详细介绍 #### 原理 Vision Transformer (ViT) 是一种基于 Transformer 架构的模型,最初设计用于自然语言处理(NLP)[^1]。然而,为了适应图像数据的特点,ViT 对传统的 Transformer 进行了一些调整。由于图像具有二维或三维的空间结构特性,而原始的 Transformer 主要针对一维序列任务进行了优化,在直接应用于图像识别时会遇到挑战。具体来说,当尝试将整个图像一次性输入到标准 Transformer 中时,其自注意力机制会导致极高的计算复杂度,因为每一对像素间都需要建立连接并评估相互影响。 为解决上述问题,ViT 提出了分片策略:即将图片分割成固定大小的小块(patch),再把这些patch线性化作为离散token送入Transformer编码器之前的位置嵌入层中[^2]。通过这种方式,不仅降低了整体运算负担,还保留了一定程度上的局部空间信息。 #### 结构 ViT的整体架构由以下几个部分组成: - **Patch Embedding**: 输入图像被均匀划分为多个不重叠的小区域(即patches),每个 patch 被展平成向量并通过线性变换映射至指定维度 d_model。 - **Positional Encoding**: 位置编码是为了给这些无序排列的 patches 添加顺序信息,使得后续的 self-attention 层能够区分不同位置的信息贡献差异。这一步骤对于保持图像内部的空间关系至关重要[^3]。 - **Transformer Encoder Layers**: 经过预处理后的 tokens 将依次穿过若干个相同的 Transformer 编码单元。每一个这样的单元都包含了多头自注意机制(Multi-head Self Attention, MSA) 和前馈神经网络(Feed Forward Network, FFN),两者之间夹杂着残差链接与标准化操作(Layer Normalization)来稳定训练过程。 ```python class ViTEncoderLayer(nn.Module): def __init__(self, dim, num_heads=8, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() # Multi Headed Self Attention Layer self.attn = nn.MultiheadAttention(dim, num_heads, bias=qkv_bias) # Feedforward Neural Network with GELU activation and dropout layers hidden_features = int(mlp_ratio * dim) self.mlp = nn.Sequential( nn.Linear(dim, hidden_features), nn.GELU(), nn.Dropout(drop_rate), nn.Linear(hidden_features, dim), nn.Dropout(drop_rate) ) def forward(self, x): residual_x = x + self.attn(x,x,x)[0] out = residual_x + self.mlp(residual_x) return out ``` - **Classification Token & Pooling Operation**: 在最后一个 Transformer 编码层之后加入了一个特殊的分类 token ([CLS]) ,它与其他所有来自各个 patch 的表征一起参与最终决策;最后通常采用全局平均池化(global average pooling) 或者仅取 [CLS] token 输出来进行预测任务。 #### 应用 自从发布以来,ViTs 已经证明了自己在各种计算机视觉任务上具备强大的性能潜力,尤其是在大规模数据集下的表现尤为突出。一些典型的应用场景包括但不限于: - 图像分类(Image Classification): 如前所述,这是最基础也是最常见的应用场景之一; - 物体检测(Object Detection): 利用 DETR(Detection Transformer)框架可以实现端到端的目标定位和类别判断; - 实例分割(Instance Segmentation): 类似于物体检测,但是更进一步地提供了目标边界内的精确掩膜; - 视频理解(Video Understanding): 当扩展到时间轴方向时,ViT 可以帮助解析连续帧之间的动态变化模式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值