深度学习——ViT(Vision Transformer)学习(2020.10)

文章目录

  • 一、概述
  • 二、结构
    • [2.1 输入](#2.1 输入)
    • [2.2 Encoder Block](#2.2 Encoder Block)
      • [2.2.1 多头自注意力层(Multi-Head Self-Attention, MHSA)](#2.2.1 多头自注意力层(Multi-Head Self-Attention, MHSA))
      • [2.2.2 前馈网络层(Multi-Layer Perceptron, MLP)](#2.2.2 前馈网络层(Multi-Layer Perceptron, MLP))
    • [2.3 输出](#2.3 输出)
  • 三、总结

一、概述

Vision Transformer(ViT) 是将自然语言处理领域的 Transformer 架构直接迁移到计算机视觉的开创性模型,由 Google 在 2020 年提出,论文标题为 《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》。

简单来说,ViT就是把图片当成一句话,用 Transformer 做图像分类。

ViT论文链接https://arxiv.org/pdf/2010.11929

二、结构

2.1 输入

CNN 以局部感受野逐层提取特征,依赖卷积的局部归纳偏置。而 Transformer 天然处理序列数据,无法直接输入二维图像。因此需要将二维图像结构化地拆分为一维序列,同时保留空间结构信息,使图像能够输入 Transformer Encoder。

通过分块、展平、线性投影,将图像转化为 Transformer 可处理的Token 序列,同时保留图像的空间结构信息,为自注意力机制提供全局建模基础。

  • 1、原始图像表示
    设输入图像为: X ∈ R H × W × C \mathbf{X} \in \mathbb{R}^{H \times W \times C} X∈RH×W×C
    • H H H:高度
    • W W W:宽度
    • C C C:通道数(RGB 为 3)
  • 2、分块操作(Patch Partition)
    选择分块尺寸 P×P,将图像均匀切分成互不重叠的图像块(Patch)。
    • 分块数量: N = H P × W P N = \frac{H}{P} \times \frac{W}{P} N=PH×PW
    • 每个块为: X p ∈ R P × P × C \mathbf{X_p} \in \mathbb{R}^{P \times P \times C} Xp∈RP×P×C
  • 3、展平(Flatten)
    将每个 Patch 展平为一维向量:
    • 展开后的一维向量的维度为 P 2 ⋅ C {P^2 \cdot C} P2⋅C,即 x p flat ∈ R P 2 ⋅ C \mathbf{x}_p^\text{flat} \in \mathbb{R}^{P^2 \cdot C} xpflat∈RP2⋅C
    • 此时图像从: H × W × C ⟹ N × ( P 2 C ) H×W×C⟹N×(P^2C) H×W×C⟹N×(P2C)
  • 4、线性映射(Patch Embedding)
    • 上述维度并不一定是 ViT 想要的维度,ViT 想要的输入维度为隐藏维度D。因此需要把长度不一样的向量,统一变成长度一样的向量。
    • z p = x p f l a t ⋅ W E \mathbf{z}_p=\mathbf{x}_p^{flat}⋅W_E zp=xpflat⋅WE
    • W E ∈ R ( P 2 C ) × D 为投影矩阵 W_E∈\mathbb{R}^{(P^2C)×D} 为投影矩阵 WE∈R(P2C)×D为投影矩阵
  • 5、增加class token​
    • class token 是一个 可学习的一维向量(维度 1×D),在输入序列最前面插入,让输入序列从 N×D 变成 (N+1)×D。
    • 我们的目标是对整张图像分类,但现在有 N 个 Patch 的特征,该用哪一个?
    • Transformer 的自注意力机制会让 class token 和所有 Patch token 交互------ 它会看遍所有 Patch 的特征,把整张图的全局信息整合到自己身上。
  • 6、增加Position Embedding
    • 位置编码的唯一目的:给每个 Patch Token 打上 "空间位置标签",让 Transformer 知道每个 Patch 在图像中的具体位置。
    • 位置编码的维度和Patch Embedding 完全一致(D 维,比如 768)。数量和输入序列长度一致(N+1 个)。将位置编码与向量直接相加,相加后维度不变。
    • ViT 用的是 可学习的位置编码(区别于原始 Transformer 的正弦余弦位置编码),是模型的可训练参数,训练过程中自动学习不同位置该怎么编码。

最终得到 Patch Embedding: Z 0 ∈ R ( N + 1 ) × D Z_0∈\mathbb{R}^{(N+1)×D} Z0∈R(N+1)×D
z 0 = [ x c l a s s ; x 1 f l a t ⋅ W E ; . . . . . . ; x N f l a t ⋅ W E ] + P E z0=[\mathbf{x}_{class};\mathbf{x}_1^{flat}⋅WE;......;\mathbf{x}_N^{flat}⋅WE]+PE z0=[xclass;x1flat⋅WE;......;xNflat⋅WE]+PE


  • 输入图像:224×224×3 、Patch 大小:P=16、 Transformer 隐层维度:D=768
  • 图像被切成 196 个 16×16 的小块。(224*224/16*16=196块)
  • 每个patch展平后变成 768 维向量。(16*16*3=768),196个patch最终维度为196*768
  • 这里刚好展开后的维度 P 2 ∗ C P^2*C P2∗C = 隐藏维度 D D D =768,所以映射后维度不变,仍是 768。得:196×768
  • 在最前面加 1 个可学习向量:1×768。序列为:197×768
  • 为序列添加位置编码,最终序列不变,仍为:197×768

2.2 Encoder Block

ViT 里的 Encoder 是重复堆叠 L 层(比如 ViT-Base 堆 12 层),每层结构完全一致,核心是【自注意力 + 前馈网络】的组合,还加了 Layer Norm 和残差连接(Residual Connection)。

假设:第 ℓ ℓ ℓ 层输入: Z ℓ − 1 Z_{ℓ−1} Zℓ−1​。第 ℓ ℓ ℓ 层输出: Z ℓ Z_ℓ Zℓ

2.2.1 多头自注意力层(Multi-Head Self-Attention, MHSA)

Z ℓ ′ = M H S A ( L a y e r N o r m ( Z ℓ − 1 ) ) + Z ℓ − 1 Z_ℓ^′=MHSA(LayerNorm(Z_{ℓ−1}))+Z_{ℓ−1} Zℓ′=MHSA(LayerNorm(Zℓ−1))+Zℓ−1

  • 子模块1:层归一化:对每个 token 独立做归一化,稳定训练、消除特征尺度差异。
  • 子模块2:多头自注意力机制:建模全局依赖关系,捕捉不同空间、不同语义层次的关联,结合位置编码,使模型感知空间结构
  • 子模块3:残差连接:解决深度网络梯度消失,保证浅层信息直接传递到深层

2.2.2 前馈网络层(Multi-Layer Perceptron, MLP)

Z ℓ = M L P ( L a y e r N o r m ( Z ℓ ′ ) ) + Z ℓ ′ Z_ℓ=MLP(LayerNorm(Z_ℓ^′))+Z_ℓ^′ Zℓ=MLP(LayerNorm(Zℓ′))+Zℓ′

  • 子模块1:层归一化:对每个 token 独立做归一化,稳定训练、消除特征尺度差异。
  • 子模块2:MLP 前馈网络:ViT 的 MLP 为两层线性变换 + 非线性激活,对每个 token 特征进行非线性变换与特征增强,提升模型表达能力。
    M L P ( Z ) = L i n e a r 2 ( G E L U ( L i n e a r 1 ( Z ) ) ) MLP(Z)=Linear_2(GELU(Linear_1(Z))) MLP(Z)=Linear2(GELU(Linear1(Z)))
    • 升维:让特征在高维空间变得线性可分
    • 非线性激活:引入复杂函数拟合能力
    • 降维:把学到的高阶信息压缩回固定维度
  • 子模块3:残差连接:解决深度网络梯度消失,保证浅层信息直接传递到深层

2.3 输出

  • 输入:经过 L 层 Encoder 后,模型输出一个序列: Z l ∈ R ( N + 1 ) × D Z_l∈\mathbb{R}^{(N+1)×D} Zl∈R(N+1)×D。这一步输出的是 所有 token 的高级特征。
  • 提取 class token:我们只拿第 0 号位置的 class token 代表整张图像,这个向量 = 整张图片的全局特征表示。
  • 送入分类头:分类头(Classification Head)就是一个线性层,把 D 维特征映射到类别数 C。C 为数据集类别总数。输出Logits模型最后一层线性层直接输出的原始分数,可正可负。
  • softmax:经过 Softmax 归一化后的值,范围 [0, 1],且所有类别的和 = 1。最终输出是一个 长度 = 类别数量 C 的向量,C 为数据集类别总数。向量中每一维表示输入图像属于对应类别的预测概率。

三、总结

核心创新:

  • 直接将图像视为序列,使用纯 Transformer 结构完成视觉任务。
  • 依靠自注意力实现全局感受野,突破 CNN 逐层扩大感受野的限制。
  • 使用 class token 聚合全局信息,位置编码保留空间结构。
  • 在大规模数据上表现优异,泛化性与表达能力强。

和CNN的主要对比:

对比维度 CNN Vision Transformer (ViT)
核心结构 卷积层 + 池化层 + 全连接层 Patch Embedding + Transformer Encoder
特征建模方式 局部卷积,逐层提取 全局自注意力,序列建模
感受野 从小到大,逐层扩大 第一层即可覆盖全局
先验知识 强(局部性、权重共享、平移不变) 弱,几乎无人工先验
位置信息 天然自带,无需额外处理 必须显式加入位置编码
全局依赖建模 弱,需多层堆叠间接实现 强,可直接建模长距离关系
数据依赖 小数据集即可训练良好 需要大规模数据预训练
计算复杂度 相对较低,推理快 较高,注意力复杂度为 O(N2)
擅长任务 边缘 / 纹理特征、轻量任务、小数据场景 全局结构、语义理解、大数据场景
分类依据 卷积输出全局平均池化 取 class token 作为全局特征

ViT 去掉分类头后,特征可以被复用,适配各种下游任务:

任务类型 改造方式 典型模型
目标检测 在 patch 特征上添加检测头 DETR, ViT-FRCNN, YOLOv8-ViT
语义分割 对 patch 特征做上采样 / 解码 SegViT, SETR, Mask2Former
图像生成 用 Transformer 做生成式建模 Stable Diffusion (ViT 变体), DALL-E
多模态任务 与文本 Transformer 对齐 CLIP, BLIP, Flamingo
姿态估计 / 跟踪 提取 patch 特征做回归 ViTPose, TrackFormer
相关推荐
Dxy12393102162 小时前
PyTorch的ReduceLROnPlateau详解:深度学习训练的“智能调速器”
人工智能·pytorch·深度学习
SomeOtherTime2 小时前
信号处理(AI回答)
人工智能·信号处理
视觉&物联智能2 小时前
【杂谈】-人工智能蓬勃演进背后的隐性支撑体系
人工智能·ai·aigc·算力·agi·deepseek
IT WorryFree2 小时前
openclaw飞书机器人权限管理
人工智能·机器人·飞书
吴佳浩2 小时前
OpenClaw、Claude Code 等 Agent 为什么都选择 Node.js?
前端·人工智能·langchain
CoovallyAIHub2 小时前
开源一周 6300+ Star!Andrew Ng 发布 Context Hub,专治 AI Agent 调用过时 API
人工智能·架构·github
witAI2 小时前
**GLM5剧本拆解2025指南,解锁多模态创作新范式**
人工智能·python
badhope2 小时前
C语言二级考点全解析与真题精讲
c语言·开发语言·c++·人工智能·python·microsoft·职场和发展