1. Transformer架构概览
Transformer模型自2017年由Google团队提出以来,已成为自然语言处理领域的基石架构。与传统RNN/LSTM不同,它完全基于自注意力机制,实现了并行化计算和长距离依赖建模的双重突破。核心组件包括编码器堆栈、解码器堆栈以及连接二者的注意力机制,这种独特设计使其在机器翻译、文本生成等任务中展现出惊人效果。
典型Transformer模型由6个编码器和6个解码器组成(层数可调),每层都包含多头注意力子层和前馈神经网络子层。编码器负责将输入序列转换为富含上下文信息的隐藏表示,解码器则基于该表示逐步生成输出序列。整个过程通过残差连接和层归一化保持训练稳定性,而位置编码的引入则弥补了自注意力机制对序列顺序不敏感的缺陷。
关键理解:Transformer的核心创新在于用注意力权重动态计算词元间关系,替代了RNN的固定顺序计算模式。这使得每个词元都能直接"看到"序列中所有其他相关词元,无论它们相距多远。
2. 输入预处理阶段
2.1 词元化与嵌入表示
原始文本首先经过词元化(Tokenization)处理,将句子分割为模型可处理的离散符号。以BPE(Byte Pair Encoding)算法为例:
- 统计语料中所有字符对出现频率
- 合并最高频字符对形成新词元
- 重复上述过程直到达到预设词表大小
得到词元ID后,通过嵌入层将其转换为d_model维的稠密向量(通常512或1024维)。这个步骤本质上是查表操作:
python复制embedding = EmbeddingMatrix[token_id] # 形状: (d_model,)
2.2 位置编码注入
由于自注意力机制本身不具备序列顺序感知能力,必须显式注入位置信息。原始论文采用正弦函数生成位置编码:
code复制PE(pos,2i) = sin(pos/10000^(2i/d_model))
PE(pos,2i+1) = cos(pos/10000^(2i/d_model))
其中pos是位置索引,i是维度索引。这种编码方式允许模型轻松学习相对位置关系,实验表明其效果优于可学习的位置嵌入。
实测技巧:当处理超过训练时最大序列长度时,可尝试线性插值或随机初始化扩展位置编码。部分现代模型已改用旋转位置编码(RoPE)来更好处理长序列。
3. 编码器执行链路
3.1 多头注意力机制
每个编码器层的核心是自注意力计算,分为三个步骤:
- 线性变换:将输入X分别投影为Q(查询)、K(键)、V(值)矩阵
python复制Q = X @ W_Q + b_Q # 形状: (seq_len, d_k) K = X @ W_K + b_K V = X @ W_V + b_V - 缩放点积注意力计算:
python复制attn_scores = Q @ K.T / sqrt(d_k) # 防止梯度消失 attn_weights = softmax(attn_scores) output = attn_weights @ V - 多头结果拼接:将h个注意力头的输出拼接后做线性变换
3.2 前馈神经网络
注意力输出经过LayerNorm后送入前馈网络,这是两个线性变换夹着ReLU激活的三层结构:
python复制FFN(x) = max(0, xW1 + b1)W2 + b2
虽然结构简单,但参数量占单层的2/3,是模型关键容量所在。实践中常用GELU替代ReLU以获得更平滑的梯度流动。
3.3 残差连接与层归一化
每个子层都采用残差连接+层归一化的标准配置:
python复制x = LayerNorm(x + Sublayer(x))
这种设计有效缓解了深层网络梯度消失问题。层归一化对每个样本的特征维度进行标准化,比批量归一化更适合变长序列处理。
4. 解码器执行链路
4.1 掩码自注意力
解码器的第一个注意力层采用因果掩码,确保位置i只能关注到位置1~i的内容:
python复制mask = torch.tril(torch.ones(seq_len, seq_len))
attn_scores = attn_scores.masked_fill(mask == 0, -1e9)
这种掩码机制是自回归生成的关键,防止模型"偷看"未来信息。
4.2 编码器-解码器注意力
第二层注意力使用编码器输出作为K和V,解码器状态作为Q。这使得解码器可以动态检索编码信息,类似于传统seq2seq中的动态注意力机制。特殊情况下(如文本摘要),可以设计特殊attention mask控制可访问的源序列范围。
4.3 输出概率生成
最终解码器输出经过线性变换+softmax得到词表上的概率分布:
python复制logits = decoder_output @ W_vocab
probs = softmax(logits/temperature) # temperature控制生成随机性
束搜索(beam search)通常用于生成阶段,保留多个候选序列以提高输出质量。
5. 关键实现细节剖析
5.1 注意力计算优化
原始实现的空间复杂度为O(n²),对大序列不友好。以下优化策略值得关注:
- 内存高效的注意力实现(如FlashAttention)
- 局部窗口注意力(限制每个位置的关注范围)
- 稀疏注意力模式(固定模式或学习得到的模式)
5.2 训练技巧实录
- 学习率预热:前10k步线性增加学习率,避免早期不稳定
python复制lr = d_model^-0.5 * min(step^-0.5, step*warmup^-1.5) - 标签平滑:将硬标签替换为0.9和0.1/(V-1),防止模型过度自信
- 梯度裁剪:限制梯度范数在1.0以内,防止梯度爆炸
5.3 常见问题排查
-
注意力权重全为均匀分布:
- 检查初始化是否合适
- 尝试减小初始学习率
- 确认模型深度与注意力头数的平衡
-
验证集loss波动大:
- 增加层归一化的ε参数(如从1e-6调到1e-4)
- 检查残差连接是否实现正确
- 尝试更大的批处理尺寸
-
生成结果重复:
- 调整temperature参数(0.7~1.0效果较好)
- 尝试top-k或top-p采样
- 检查训练数据中的重复模式
6. 现代变体与演进方向
6.1 高效Transformer变体
- Longformer:结合局部窗口注意力和全局注意力,处理长文档
- Reformer:使用局部敏感哈希(LSH)减少注意力计算量
- Performer:通过随机特征映射近似注意力矩阵
6.2 解码策略对比
| 策略 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 贪心搜索 | 计算简单 | 易陷局部最优 | 快速原型验证 |
| 束搜索 | 质量较高 | 多样性不足 | 机器翻译/文本摘要 |
| 采样 | 多样性好 | 可能不连贯 | 创意写作 |
| 核采样 | 平衡质量与多样性 | 超参数敏感 | 对话生成 |
6.3 未来改进方向
- 记忆机制:将关键信息存储在外部记忆单元
- 模块化设计:不同模块处理不同子任务
- 持续学习:在不遗忘旧任务的情况下学习新任务
- 能量模型:用能量函数统一各种生成方式