1. transformer
transformer的提出,最开始是针对nlp领域。在此之前主要使用的是RNN、LSTM之类的时序网络,但这些网络的记忆时间是有限的,比如RNN的记忆时间就比较短,所以提出了LSTM。同时还存在无法并行计算的问题,比如说必须要先计算t0时刻的数据后才能计算t0+1时刻的数据,这就导致了效率较低。
为此谷歌提出了transformer,在理论上,如果硬件不受限制,记忆长度可以无限长,其次他可以进行并行计算。
1.1 输入
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-Attention和Position-Wise Feed-Forward Network
1.2.1 MultiHead Attention
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-Attention、Multi-Head Context-Attention和Position-Wise Feed-Forward Network
1.3.1 Masked MultiHead Attention
1.3.2 MultiHead Attention
1.3.3 前馈网络
1.3.4 Linear和Softmax
Linear层是一个简单的全连接神经网络,它可以把Decoder产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。
接下来的Softmax 层便会把那些分数变成概率(都为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间的输出。
2. Vision Transformer
模型的参数数量和模型的推理时间并没有直接关系
2.1 Embedding
patch的提取
可以直接通过一个卷积层来实现,以ViT-B/16为例(patch大小为16x16x3),使用卷积核大小为16x16,stride为16,卷积核个数为16x16x3=768
[224, 224, 3] -> [14, 14, 768] -> [196, 768]
位置编码的规模不是很重要,但有没有位置编码很重要
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的并行计算能力得益于其编码器-解码器结构,每个位置的表示都是独立计算的,这使得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)。
- 对模型正则化要求较高的任务。
| 模型/场景 | 优化器 | 学习率调度 | 备注 |
|---|---|---|---|
| 原始Transformer | Adam | 逆平方根衰减 + 预热 | β1=0.9, β2=0.98, ε=1e-9 |
| BERT/GPT系列 | AdamW | 线性预热 + 线性衰减 | 权重衰减通常设为0.01 |
| T5/超大模型 | Adafactor | 恒定学习率或线性衰减 | 节省内存,适合长序列 |
| 分布式训练(如Megatron) | LAMB | 分层自适应学习率 | 支持大批量并行 |
4. 优化器选择的核心原则
-
任务规模:
- 小规模任务:Adam/AdamW(简单高效)。
- 大规模训练:Adafactor/LAMB(内存优化或分布式支持)。
-
硬件资源:
- 单卡训练:优先AdamW。
- 多卡/分布式:LAMB或ZeRO优化器(如DeepSpeed框架)。
-
正则化需求:
- 高泛化要求:AdamW(显式权重衰减)。
- 低资源场景:Adafactor(内存友好)。
CNN用注意力机制也可以提取全局特征,为什么用Transformer?
正确回答
CNN虽然能通过注意力机制提取全局特征,但Transformer在全局特征提取上更为高效和灵活。Transformer的自注意力机制能直接计算序列中任意两个位置的相关性,无需CNN的逐层卷积,从而更快捕捉长距离依赖。此外,Transformer的并行计算能力更强,训练速度更快,且模型结构更灵活,易于扩展到大规模数据和复杂任务。