引言
Transformer架构自2017年提出以来,彻底改变了自然语言处理领域。从BERT到GPT,从机器翻译到文本生成,Transformer已成为现代NLP的基石。本文将深入解析Transformer的核心机制。
一、注意力机制基础
1.1 为什么需要注意力机制
传统RNN处理序列的局限性:
- 长期依赖问题: 距离较远的信息难以传递
- 顺序计算: 无法并行化,训练效率低
- 信息瓶颈: 所有信息压缩到固定长度向量
1.2 注意力机制的直觉
类比人类阅读理解:
- 阅读时会重点关注某些关键词
- 理解一个词时会参考上下文
- 不同词的重要性不同
1.3 注意力计算
三个核心概念:
- Query(Q): 查询向量,当前要处理的信息
- Key(K): 键向量,用于匹配的信息
- Value(V): 值向量,实际要提取的信息
计算步骤:
- 1. 计算Q和K的相似度得到注意力分数
- 2. 对分数进行Softmax归一化得到注意力权重
- 3. 用权重加权求和V得到输出
二、Self-Attention(自注意力)
2.1 核心思想
Self-Attention让序列中的每个位置都能关注到其他所有位置,捕捉全局依赖关系。
2.2 计算流程
步骤1: 生成Q、K、V
- 输入向量通过三个权重矩阵Wq、Wk、Wv线性变换
- 得到Query、Key、Value向量
步骤2: 计算注意力分数
- Score = Q · K^T / √d_k
- 除以√d_k进行缩放,避免梯度过小
步骤3: Softmax归一化
- 将分数转换为概率分布
- 确保权重和为1
步骤4: 加权求和
- 用注意力权重对Value加权
- 得到该位置的输出表示
2.3 优势
- 并行计算: 所有位置可同时计算
- 全局视野: 直接建模任意距离的依赖
- 可解释性: 注意力权重可视化
三、Multi-Head Attention(多头注意力)
3.1 为什么需要多头
类似CNN的多通道:
- 不同的头关注不同的特征子空间
- 捕捉多种类型的依赖关系
- 增强模型表达能力
3.2 实现方式
- 将Q、K、V分成h个头
- 每个头独立做Self-Attention
- 拼接所有头的输出
- 通过线性层融合
3.3 典型配置
- BERT-base: 12个头,每个头维度64
- BERT-large: 16个头,每个头维度64
- GPT-3: 96个头
四、Transformer架构
4.1 整体结构
Encoder(编码器):
- 输入嵌入 + 位置编码
- N个Encoder层堆叠
- 每层包含:
- Multi-Head Self-Attention
- Feed-Forward Network
- 残差连接 + Layer Normalization
Decoder(解码器):
- 输出嵌入 + 位置编码
- N个Decoder层堆叠
- 每层包含:
- Masked Multi-Head Self-Attention
- Cross-Attention(关注Encoder输出)
- Feed-Forward Network
- 残差连接 + Layer Normalization
4.2 位置编码
由于Self-Attention本身不包含位置信息,需要添加位置编码:
- 正弦位置编码: 原始论文使用,固定的周期函数
- 可学习位置编码: BERT使用,通过训练学习
4.3 残差连接和Layer Norm
残差连接(Residual Connection):
- 输出 = LayerNorm(输入 + Sublayer(输入))
- 缓解梯度消失,方便训练深层网络
Layer Normalization:
- 对每个样本的所有特征归一化
- 稳定训练过程
五、BERT:预训练语言模型
5.1 BERT的创新
- 双向建模: 同时考虑左右上下文
- 预训练+微调: 迁移学习范式
- Masked Language Model: 掩码语言模型任务
5.2 预训练任务
Task 1: Masked Language Model(MLM)
- 随机遮盖15%的词
- 让模型预测被遮盖的词
- 学习双向语言表示
Task 2: Next Sentence Prediction(NSP)
- 判断两个句子是否连续
- 学习句子级别的语义
5.3 微调策略
针对下游任务,只需添加简单的输出层:
- 分类任务: 使用[CLS]标记的输出
- 序列标注: 使用每个Token的输出
- 问答任务: 预测答案的起始和结束位置
5.4 BERT变体
- RoBERTa: 改进训练策略,移除NSP
- ALBERT: 参数共享,减少模型大小
- DistilBERT: 知识蒸馏,压缩模型
- ELECTRA: 改进预训练任务,提高效率
六、Transformer的局限性与改进
6.1 计算复杂度
问题:
- Self-Attention复杂度为O(n²)
- 序列长度翻倍,计算量增加4倍
改进方案:
- Sparse Attention: 只关注部分位置
- Linformer: 降低K和V的维度
- Performer: 使用核方法近似
6.2 长序列处理
- Transformer-XL: 引入循环机制
- Longformer: 滑动窗口+全局注意力
- BigBird: 稀疏注意力模式
七、实践建议
7.1 使用预训练模型
- 优先使用Hugging Face的Transformers库
- 选择适合任务的预训练模型
- 注意中文模型需要使用中文预训练版本
7.2 微调技巧
- 使用较小的学习率(1e-5到5e-5)
- 对不同层使用不同学习率(Layer-wise Learning Rate Decay)
- 使用Warmup策略
- 注意过拟合,适当使用Dropout
7.3 效率优化
- 使用混合精度训练(FP16)
- 梯度累积应对显存限制
- 模型并行和数据并行
- 考虑模型蒸馏或剪枝
总结
Transformer通过Self-Attention机制,实现了高效的序列建模。BERT等预训练模型进一步展示了其强大的表示学习能力。理解Transformer是掌握现代NLP技术的关键。