1. Transformer架构概述
Transformer架构是当前大语言模型(如GPT、BERT等)的核心基础,它彻底改变了传统序列建模的方式。与RNN、LSTM等循环神经网络不同,Transformer完全基于注意力机制,能够并行处理整个输入序列,显著提升了训练效率和模型表现。
我第一次接触Transformer是在2017年Google发表的那篇著名论文《Attention is All You Need》中。当时最让我震惊的是,这个架构完全摒弃了循环结构,仅通过自注意力机制就能捕捉长距离依赖关系。经过多年实践,我发现Transformer之所以能成为语言模型的标配,主要得益于以下几个关键特性:
- 并行处理能力:所有位置的token可以同时计算,训练速度比RNN快一个数量级
- 长距离依赖捕捉:自注意力机制可以直接关联任意距离的token
- 可扩展性强:通过堆叠更多层和增加头数,模型能力可以持续提升
- 通用性好:同样的架构稍作调整就能用于翻译、分类、生成等不同任务
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 输入表示:词嵌入与位置编码
2.1 词嵌入(Input Embeddings)
词嵌入是将离散的词语映射到连续向量空间的技术。在实际项目中,我通常会使用预训练的词向量(如Word2Vec或GloVe)作为初始化,然后在具体任务上进行微调。
举个例子,假设我们有一个简单的词汇表:
- "猫" → [0.2, -0.5, 0.7]
- "狗" → [0.3, -0.4, 0.6]
- "苹果" → [-0.8, 0.1, 0.2]
这些向量有几个重要特性:
- 语义相似性:相似的词在向量空间中距离近
- 向量运算:可以进行有意义的加减运算(如"国王"-"男"+"女"≈"女王")
- 维度固定:所有词向量长度相同,便于矩阵运算
在实际实现时,我们通常会使用一个嵌入矩阵E ∈ R^(V×d),其中V是词汇表大小,d是嵌入维度。对于输入序列中的每个词,通过查表得到对应的向量。
2.2 位置编码(Positional Encoding)
由于Transformer没有循环结构,需要显式地加入位置信息。在实践中,我发现正弦/余弦位置编码效果最好:
PE(pos,2i) = sin(pos/10000^(2i/d))
PE(pos,2i+1) = cos(pos/10000^(2i+1/d))
其中pos是位置,i是维度索引。这种编码方式有两个优势:
- 可以表示任意长度的序列
- 可以学习到相对位置关系
在代码实现中,位置编码会与词嵌入相加:
python复制x = Embedding(input) + PositionalEncoding(position)
3. 自注意力机制
3.1 基本概念
自注意力机制是Transformer的核心创新。它允许每个词直接关注序列中的所有其他词,计算它们之间的相关性。在我的项目中,这种机制特别适合处理长文档中的指代消解问题。
3.2 QKV计算
每个输入向量会通过三个不同的线性变换得到查询(Query)、键(Key)和值(Value):
python复制Q = X @ W_Q # 查询矩阵
K = X @ W_K # 键矩阵
V = X @ W_V # 值矩阵
其中W_Q, W_K, W_V是可学习的参数矩阵。
3.3 注意力分数计算
注意力分数表示词与词之间的相关性,通过查询和键的点积计算:
python复制scores = Q @ K.T / sqrt(d_k) # 缩放点积
weights = softmax(scores) # 归一化为概率分布
output = weights @ V # 加权求和
这里除以√d_k是为了防止点积过大导致softmax梯度消失。
3.4 多头注意力
在实践中,单头注意力往往不够,因此我们会使用多头注意力:
python复制head_i = Attention(Q @ W_Q_i, K @ W_K_i, V @ W_V_i)
MultiHead = Concat(head_1, ..., head_h) @ W_O
每个头可以关注不同的关系模式,例如:
- 一个头关注语法关系
- 一个头关注语义相似性
- 一个头关注指代关系
4. 前馈神经网络
4.1 基本结构
前馈神经网络(FFN)是Transformer中的另一个关键组件。它由两个线性变换和一个激活函数组成:
python复制FFN(x) = max(0, x @ W1 + b1) @ W2 + b2
其中W1 ∈ R^(d×d_ff),W2 ∈ R^(d_ff×d),通常d_ff=4d。
4.2 为什么需要FFN?
在我的实践中发现,FFN主要有三个作用:
- 提供非线性变换能力
- 增加模型容量
- 独立处理每个位置的信息
5. 残差连接与层归一化
5.1 残差连接
残差连接是深度神经网络训练的关键技术:
python复制y = x + Sublayer(x)
这种设计有两个好处:
- 缓解梯度消失问题
- 保留原始输入信息
5.2 层归一化
层归一化对每个样本的所有特征进行归一化:
python复制LN(x) = γ * (x - μ)/σ + β
其中μ和σ是均值和标准差,γ和β是可学习的参数。
6. Transformer完整流程
一个标准的Transformer层处理流程如下:
- 输入词嵌入 + 位置编码
- 多头自注意力计算
- 残差连接 + 层归一化
- 前馈神经网络
- 残差连接 + 层归一化
在实现时,通常会堆叠多个这样的层(如BERT-base有12层)。
7. 实践经验与技巧
经过多个项目的实践,我总结了一些Transformer的使用技巧:
- 学习率预热:训练初期使用较小的学习率,逐步增大
- 梯度裁剪:防止梯度爆炸
- 标签平滑:防止模型过度自信
- 注意力头数选择:通常8-16个头效果较好
- 层归一化位置:放在残差连接前还是后需要实验确定
对于初学者,我建议先从较小的模型(如4层、8头)开始实验,逐步增加复杂度。同时要特别注意内存消耗,Transformer的内存需求与序列长度的平方成正比。
8. 常见问题排查
在实现Transformer时,经常会遇到以下问题:
-
训练不稳定:
- 检查梯度裁剪
- 调整学习率
- 验证初始化方法
-
验证集表现差:
- 检查过拟合(增加dropout)
- 调整正则化强度
- 增加训练数据
-
长序列处理:
- 考虑使用稀疏注意力
- 尝试分块处理
- 降低批大小
Transformer架构虽然强大,但也需要大量的数据和计算资源。在实际项目中,我通常会先在小规模数据上验证想法,然后再扩展到全量数据。
