0
0

视觉Transformer:图像如何转化为Token的完整解析

2小时前0看过

本文深入解析视觉Transformer中图像转Token的核心机制,从技术原理、实现方式到典型应用场景全面梳理。通过对比文本与图像的Embedding过程,帮助开发者理解视觉Transformer如何突破传统CNN架构,在图像处理领域实现革命性突破。

一、概念定义:什么是图像Token化?

自然语言处理领域,Token化是将文本分割为离散单元(如单词、子词)的过程,这些单元通过嵌入(Embedding)转换为数值向量后输入Transformer模型。视觉Transformer(ViT)借鉴了这一思想,将图像视为由多个局部区域组成的序列,通过空间分割+特征映射将图像转化为离散的Token序列。

具体而言,图像Token化包含两个核心步骤:

  1. 空间分割:将图像划分为固定大小的非重叠图像块(patches),每个块对应一个空间位置上的局部视觉信息。
  2. 特征映射:通过线性变换将每个图像块转换为固定维度的特征向量,这些向量即视为模型的输入Token。

例如,一张224×224像素的RGB图像(C=3)被划分为16×16像素的图像块,共得到(224/16)²=196个块。每个块展平为16×16×3=768维的向量,再通过线性层映射为512维的嵌入向量,最终形成196个512维的Token序列。

二、背景与价值:为什么需要图像Token化?

传统CNN架构通过卷积核在局部区域滑动提取特征,虽然具有平移不变性,但存在以下局限:

  • 长距离依赖建模困难:需通过堆叠多层卷积扩大感受野,导致计算效率低下。
  • 固定感受野:卷积核大小固定,难以自适应不同尺度的视觉模式。
  • 归纳偏置强:CNN隐含了局部性和平移不变性假设,可能限制模型对复杂视觉模式的捕捉能力。

Transformer的自注意力机制通过计算所有Token间的全局关系,天然具备长距离依赖建模能力。图像Token化的核心价值在于:

  • 将图像转化为序列数据:使Transformer能够直接处理视觉信息,突破CNN的架构限制。
  • 保留空间结构信息:通过位置编码(Position Embedding)保留图像块的空间排列顺序。
  • 支持灵活的特征交互:自注意力机制可动态调整不同区域间的关注权重,适应不同视觉任务。

三、核心组成:图像Token化的关键模块

1. 图像分割模块

图像分割需平衡计算效率信息完整性,常见策略包括:

  • 均匀分割:将图像划分为固定大小的块(如ViT中的16×16),简单高效但可能破坏物体边界。
  • 自适应分割:基于图像内容动态调整块大小(如Swin Transformer的窗口划分),但实现复杂度较高。
  • 重叠分割:允许相邻块存在重叠区域(如T2T-ViT),减少信息丢失但增加计算量。

代码示例(伪代码)

  1. def image_to_patches(image, patch_size=16):
  2. # image shape: (H, W, C)
  3. H, W, C = image.shape
  4. patches = image.reshape(H//patch_size, patch_size,
  5. W//patch_size, patch_size, C)
  6. patches = patches.transpose(0, 2, 1, 3, 4) # (num_patches, patch_size, patch_size, C)
  7. patches = patches.reshape(-1, patch_size*patch_size*C) # (num_patches, patch_dim)
  8. return patches

2. 线性嵌入模块

每个图像块通过线性层映射为固定维度的嵌入向量,该过程可视为降维压缩特征初始化

  • 降维压缩:将高维像素数据(如768维)压缩为低维嵌入(如512维),减少计算量。
  • 特征初始化:通过可学习的权重矩阵为每个块分配初始特征表示,后续通过自注意力机制优化。

数学表达
对于第i个图像块 ( p_i \in \mathbb{R}^{patch_dim} ),其嵌入向量 ( e_i ) 为:
[ e_i = W \cdot p_i + b ]
其中 ( W \in \mathbb{R}^{embed_dim \times patch_dim} ),( b \in \mathbb{R}^{embed_dim} ) 为可学习参数。

3. 位置编码模块

由于Transformer本身不具备空间感知能力,需通过位置编码显式注入空间信息。常见方法包括:

  • 绝对位置编码:为每个位置分配独立可学习的向量(如ViT),简单但泛化性有限。
  • 相对位置编码:基于Token间的相对距离计算编码(如T5),更符合自注意力的计算逻辑。
  • 2D位置编码:分别对行和列位置编码(如CvT),保留图像的二维结构信息。

代码示例(绝对位置编码)

  1. class PositionEmbedding(nn.Module):
  2. def __init__(self, num_patches, embed_dim):
  3. super().__init__()
  4. self.position_embeddings = nn.Parameter(torch.randn(1, num_patches+1, embed_dim)) # +1 for [CLS] token
  5. def forward(self, x):
  6. # x shape: (batch_size, num_patches, embed_dim)
  7. return x + self.position_embeddings

四、工作原理:图像Token化的完整流程

以ViT为例,图像Token化的完整流程如下:

  1. 输入预处理:将图像调整为固定尺寸(如224×224),归一化像素值至[-1, 1]。
  2. 图像分割:划分为16×16的图像块,共196个块。
  3. 线性嵌入:每个块映射为512维向量,得到196×512的嵌入矩阵。
  4. 添加分类Token:在序列首部插入可学习的[CLS] token,用于最终分类。
  5. 位置编码:为每个Token(包括[CLS])添加位置编码,得到197×512的输入序列。
  6. Transformer编码:输入序列通过多层Transformer编码器,通过自注意力机制更新Token表示。

五、典型场景:图像Token化的应用领域

  1. 图像分类:ViT在ImageNet等数据集上达到SOTA性能,证明Token化方法的有效性。
  2. 目标检测:DETR将检测任务转化为集合预测问题,依赖Token化的全局特征交互。
  3. 图像生成:Transformer-based模型(如DALL·E)通过Token化实现文本到图像的生成。
  4. 视频理解:TimeSformer将视频帧拆分为时空Token,建模时序与空间关系。

六、相关概念区别:Token化 vs. 卷积特征提取

维度 Token化 卷积特征提取
数据结构 序列数据(Token序列) 网格数据(特征图)
感受野 全局(自注意力) 局部(卷积核)
参数共享 共享注意力权重 共享卷积核权重
计算复杂度 ( O(n^2) )(n为Token数) ( O(k^2) )(k为卷积核大小)
归纳偏置 弱(依赖数据学习) 强(局部性、平移不变性)

七、使用注意事项

  1. 块大小选择:过大会丢失细节信息,过小会增加计算量(通常16×16或32×32)。
  2. 分辨率适配:不同任务需调整输入图像尺寸(如检测任务需更高分辨率)。
  3. 位置编码设计:需根据任务特点选择编码方式(如检测任务需更精细的位置信息)。
  4. 计算效率优化:可通过稀疏注意力(如Longformer)或线性注意力(如Performer)降低复杂度。

八、总结

图像Token化是视觉Transformer的核心创新,通过将图像转化为序列数据,使Transformer能够直接处理视觉信息。其关键在于空间分割的合理性特征映射的有效性位置编码的准确性。随着Transformer在视觉领域的深入应用,图像Token化方法将持续演进,为复杂视觉任务提供更强大的建模能力。

评论
用户头像