
Transformer 模型
Transformer 是一种基于自注意力机制(Self-Attention)的深度学习模型架构,最初由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》中提出。它彻底改变了自然语言处理(NLP)领域,并在计算机视觉(CV)、语音处理等领域也得到广泛应用。以下是对 Transformer 的详细介绍:
一、Transformer 的提出背景
在 Transformer 出现之前,主流的序列建模方法(如机器翻译、文本生成)主要依赖循环神经网络(RNN)和长短期记忆网络(LSTM)。但这些模型存在以下问题:
难以并行化:RNN 需要按时间步顺序处理序列,无法充分利用 GPU 并行计算能力。
长距离依赖问题:随着序列长度增加,RNN 难以捕捉远距离词汇之间的关系。
计算效率低:LSTM 虽然缓解了梯度消失问题,但参数量和计算复杂度较高。
Transformer 通过自注意力机制和全连接架构解决了这些问题,实现了高效并行计算和全局依赖建模。
二、Transformer 的核心组件
Transformer 由 编码器(Encoder) 和 解码器(Decoder) 堆叠而成,每个编码器和解码器包含多个子层。以下是关键组件:
1. 自注意力机制(Self-Attention)
作用:捕捉序列中不同位置之间的依赖关系。
计算步骤:
将输入向量转换为 Query(Q)、Key(K)、Value(V) 三个矩阵。
计算注意力分数:Attention(Q,K,V)=softmax(dkQKT)V
dk 是 Key 向量的维度,用于缩放点积,防止梯度消失。
通过 Softmax 归一化权重,加权求和 Value 得到输出。
2. 多头注意力(Multi-Head Attention)
将 Q、K、V 拆分为多个子空间(即“头”),分别计算注意力后拼接结果。
优势:允许模型关注不同位置的不同语义信息(例如语法、语义、上下文等)。
3. 位置编码(Positional Encoding)
Transformer 没有循环结构,无法直接感知序列顺序,因此需要显式添加位置信息。
方法:使用正弦和余弦函数生成位置编码向量,与输入向量相加:PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中 pos 是位置,i 是维度索引。
4. 层归一化(Layer Normalization)和残差连接(Residual Connection)
残差连接:将子层的输入直接加到输出上(即 x+Sublayer(x)),缓解梯度消失。
层归一化:对每个子层的输出进行归一化,加速训练收敛。
5. 前馈神经网络(Feed-Forward Network, FFN)
每个编码器和解码器包含一个全连接前馈网络:FFN(x)=max(0,xW1+b1)W2+b2
使用 ReLU 激活函数,提供非线性变换能力。
三、编码器与解码器的结构
1. 编码器(Encoder)
由 N 个相同层堆叠而成(通常 N=6)。
每层包含:
一个 多头自注意力层(关注输入序列内部关系)。
一个 前馈神经网络层。
2. 解码器(Decoder)
同样由 N 个相同层堆叠而成。
每层包含:
一个 掩码多头自注意力层(防止当前位置看到未来信息)。
一个 编码器-解码器注意力层(关注编码器的输出)。
一个 前馈神经网络层。
四、训练细节
优化目标:通过交叉熵损失函数进行监督学习。
优化器:使用 Adam 优化器,结合学习率预热(Warm-up)策略。
正则化:Dropout 和标签平滑(Label Smoothing)防止过拟合。
五、Transformer 的应用与变体
1. 经典模型
BERT:仅使用编码器的双向预训练模型,适用于文本分类、问答等任务。
GPT 系列:仅使用解码器的自回归模型,擅长文本生成。
T5:完整的编码器-解码器结构,支持多种文本生成任务。
2. 跨领域应用
计算机视觉:ViT(Vision Transformer)将图像分块后输入 Transformer。
语音处理:Transformer 用于语音识别和语音合成。
多模态:CLIP、DALL-E 等结合文本和图像的跨模态模型。
六、Transformer 的优势与挑战
优势
并行计算:自注意力机制允许同时处理整个序列。
全局依赖建模:直接捕捉长距离依赖关系。
灵活性:通过调整注意力头数和层数适应不同任务。
挑战
计算资源需求高:尤其是处理长序列时(序列长度 O(n2) 复杂度)。
位置编码的局限性:某些任务需要更复杂的位置表示。
七、代码实现示例(PyTorch)
以下展示自注意力机制的简化实现:
import torch
import torch.nn.functional as F
# 输入序列(3个词,每个词嵌入维度4)
input_sequence = torch.tensor([[0.1, 0.2, 0.3, 0.4],
[0.5, 0.6, 0.7, 0.8],
[0.9, 1.0, 1.1, 1.2]])
# 生成Q/K/V矩阵
W_Q = torch.randn(4, 4) # 查询权重矩阵
W_K = torch.randn(4, 4) # 键权重矩阵
W_V = torch.randn(4, 4) # 值权重矩阵
Q = torch.matmul(input_sequence, W_Q)
K = torch.matmul(input_sequence, W_K)
V = torch.matmul(input_sequence, W_V)
# 计算注意力分数
d_k = Q.size(-1)
attention_scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k))
attention_weights = F.softmax(attention_scores, dim=-1)
output = torch.matmul(attention_weights, V)
print("自注意力输出:\n", output)