ViT(VisionTransformer)

168 阅读7分钟

1. transformer

transformer的提出,最开始是针对nlp领域。在此之前主要使用的是RNN、LSTM之类的时序网络,但这些网络的记忆时间是有限的,比如RNN的记忆时间就比较短,所以提出了LSTM。同时还存在无法并行计算的问题,比如说必须要先计算t0时刻的数据后才能计算t0+1时刻的数据,这就导致了效率较低。 为此谷歌提出了transformer,在理论上,如果硬件不受限制,记忆长度可以无限长,其次他可以进行并行计算。 image.png

1.1 输入

image.png

1.1.1 词嵌入Word Embedding

词嵌入层 负责将自然语言转化为与其对应的独一无二的词向量表达。将词汇表示成特征向量的方法有多种

1.1.2 位置编码 Position Encode

Transformer 中除了Word Embedding,还需要使用Position Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。

1.2 encoder

编码器,负责将输入序列压缩成指定长度的向量,这个向量就是这个序列的语义,然后进行编码或进行特征提取。

transformer中的encoder由6个相同的层组成,每个层包含2个部分Multi-Head Self-AttentionPosition-Wise Feed-Forward Network image.png

1.2.1 MultiHead Attention

image.png Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder 包含一个 Multi-Head Attention,而 Decoder 包含两个 Multi-Head Attention (其中有一个用到 Masked)。

1.2.3 残差连接

Multi-Head Attention 上方还包括一个 Add & Norm 层:

  • Add: 表示残差连接 (Residual Connection) 用于防止网络退化
  • Norm: 表示 Layer Normalization,用于对每一层的激活值进行归一化

把得到的两个词的Attention值摞在一起后,将“加入位置编码后的词向量X”与“摞在一起后输出的Attention值Z” 相加。残差连接减小了梯度消失的影响。加入残差连接,就能保证层次很深的模型不会出现梯度消失的现象。

1.2.4 前馈网络

在进行了Attention操作之后,Encoder和Decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出

1.3 decoder

解码器,根据encoder部分输出的语义向量来做解码工作。生成的序列是不定长的,而且上一时刻的输出通常要作为下一时刻的输入。

transformer中的decoder也由6个相同的层组成,每层包含3个部分Multi-Head Self-AttentionMulti-Head Context-AttentionPosition-Wise Feed-Forward Network image.png

1.3.1 Masked MultiHead Attention

image.png

1.3.2 MultiHead Attention

image.png

1.3.3 前馈网络

1.3.4 Linear和Softmax

Linear层是一个简单的全连接神经网络,它可以把Decoder产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。

接下来的Softmax 层便会把那些分数变成概率(都为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间的输出。

2. Vision Transformer

image.png

模型的参数数量和模型的推理时间并没有直接关系

2.1 Embedding

patch的提取

可以直接通过一个卷积层来实现,以ViT-B/16为例(patch大小为16x16x3),使用卷积核大小为16x16,stride为16,卷积核个数为16x16x3=768

[224, 224, 3] -> [14, 14, 768] -> [196, 768] image.png

位置编码的规模不是很重要,但有没有位置编码很重要

image.png

2.2 Encoder层

对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[num_token, token_dim]

在输入Transformer Encoder之前需要加上cls token以及position Embedding,都是可训练参数

拼接[class]token: Cat([1,768],[196,768]) -> [197,768]

叠加Position Embedding:[197, 768] -> [197, 768]

2.3 MLP Head

在Transformer Encoder前有个Dropout层,后有一个Layer Norm

在训练大量数据时,由Linear+tanh激活函数+Linear组成。迁移到小规模数据时,可以只用一个Linear

3. CNN VS ViT

明确观点,cnn和vit是图像识别领域的两种主流架构,各有优点,不存在谁完爆谁的说法。

cnn在数据较少时效果更好,收敛也更快。本质也是因为cnn包含的inductive bias与图像数据的性质吻合。但vit只能靠海量数据学习这些性质。

cnn容易训练,只要用上residual和BN这两个技术,CNN的效果就不会差到哪里去

理想中的网络应该是用卷积抓住底层的特征,transformer处理高阶的信息。\color{red}{理想中的网络应该是用卷积抓住底层的特征,transformer处理高阶的信息。}

Transformer的并行计算能力得益于其编码器-解码器结构,每个位置的表示都是独立计算的,这使得Transformer在GPU等并行计算设备上表现优异。

Transfort的灵活性在于其易于通过增加层数、头数等参数进行扩展,以适应不同规模和复杂度的任务。同时Transformer也易于与其他模型或技术结合,如与CNN进行结合。

归纳偏置

利用一些假设对模型做一定的约束,比如CNN中假设数据的特征具有局部空间性,可以用滑动卷积共享权重的方式来提取图像特征。这些假设有助于他在小规模数据集上就能训练出不错的效果。而ViT则缺乏CNN的归纳偏置,因此需要大量数据来学习。

优化器的选择

(1) Adam
  • 特点

    • 结合动量(Momentum)和自适应学习率,适合处理稀疏梯度(如NLP任务)。

    • 初始论文《Attention Is All You Need》中使用,参数通常设为:

      • β1=0.9, β2=0.98, ε=1e-9。
  • 适用场景

    • 中小规模模型训练(如原始Transformer、BERT-base)。
    • 需要快速收敛的场景。
(2) AdamW
  • 特点

    • Adam的改进版本,显式解耦权重衰减(Weight Decay) ,避免与自适应学习率冲突。
    • 提升模型泛化能力,减少过拟合。
  • 适用场景

    • 大规模预训练模型(如GPT-3、ViT)。
    • 对模型正则化要求较高的任务。
模型/场景优化器学习率调度备注
原始TransformerAdam逆平方根衰减 + 预热β1=0.9, β2=0.98, ε=1e-9
BERT/GPT系列AdamW线性预热 + 线性衰减权重衰减通常设为0.01
T5/超大模型Adafactor恒定学习率或线性衰减节省内存,适合长序列
分布式训练(如Megatron)LAMB分层自适应学习率支持大批量并行

4. 优化器选择的核心原则

  1. 任务规模

    • 小规模任务:Adam/AdamW(简单高效)。
    • 大规模训练:Adafactor/LAMB(内存优化或分布式支持)。
  2. 硬件资源

    • 单卡训练:优先AdamW。
    • 多卡/分布式:LAMB或ZeRO优化器(如DeepSpeed框架)。
  3. 正则化需求

    • 高泛化要求:AdamW(显式权重衰减)。
    • 低资源场景:Adafactor(内存友好)。

CNN用注意力机制也可以提取全局特征,为什么用Transformer?

正确回答

CNN虽然能通过注意力机制提取全局特征,但Transformer在全局特征提取上更为高效和灵活。Transformer的自注意力机制能直接计算序列中任意两个位置的相关性,无需CNN的逐层卷积,从而更快捕捉长距离依赖。此外,Transformer的并行计算能力更强,训练速度更快,且模型结构更灵活,易于扩展到大规模数据和复杂任务。

答题思路