共计 1541 个字符,预计需要花费 4 分钟才能阅读完成。
注意力机制的核心原理
注意力机制的本质是让模型在处理输入序列时,能够动态地关注与当前任务最相关的部分。其核心计算流程可以用 Query-Key-Value 模型来描述:

- Query (Q): 表示当前需要计算注意力的位置
- Key (K): 表示输入序列中所有位置的信息
- Value (V): 是实际被加权求和的特征表示
数学公式表示为:
Attention(Q, K, V) = softmax(QK^T/√d_k)V
其中 d_k 是 Key 向量的维度,√d_k 用于缩放点积结果,防止 softmax 梯度消失。
自注意力的结构优势
相比 RNN 和 CNN,自注意力机制具有以下优势:
- 直接建模任意两个位置的关系,不受序列距离限制
- 并行计算能力强,没有 RNN 的时序依赖
- 可解释性强,注意力权重可视化展示模型关注点
PyTorch 实现缩放点积注意力
import torch
import torch.nn as nn
import torch.nn.functional as F
class ScaledDotProductAttention(nn.Module):
"""缩放点积注意力实现"""
def __init__(self, dropout=0.1):
super().__init__()
self.dropout = nn.Dropout(dropout)
def forward(self, q, k, v, mask=None):
# 输入维度检查: [batch_size, seq_len, d_model]
assert q.size(-1) == k.size(-1) == v.size(-1)
# 计算注意力分数 [batch_size, seq_len, seq_len]
attn_scores = torch.matmul(q, k.transpose(-2, -1)) / (q.size(-1) ** 0.5)
# 应用 mask(如处理 padding 或 decoder 的因果 mask)if mask is not None:
attn_scores = attn_scores.masked_fill(mask == 0, -1e9)
# softmax 归一化
attn_weights = F.softmax(attn_scores, dim=-1)
attn_weights = self.dropout(attn_weights)
# 加权求和
output = torch.matmul(attn_weights, v)
return output, attn_weights
常见注意力变体对比
| 注意力类型 | 计算复杂度 | 适用场景 | 主要特点 |
|---|---|---|---|
| 加性注意力 | O(n^2d) | 小规模序列 | 使用全连接层计算兼容性分数 |
| 局部注意力 | O(nk) | 长序列 | 仅关注固定窗口内的邻居 |
| 稀疏注意力 | O(n√n) | 超长序列 | 基于规则 / 学习的稀疏模式 |
| LSH 注意力 | O(nlogn) | 极长序列 | 使用局部敏感哈希分组 |
Transformer 工程实践技巧
- 多头注意力并行计算 :
- 将 Q /K/ V 拆分为 h 个头分别计算
-
使用 einops 库高效实现张量 reshape
-
内存优化方案 :
- 梯度检查点 (checkpointing)
- 混合精度训练
-
序列分块处理
-
长序列处理方案 :
- Reformer 的 LSH 注意力
- Longformer 的滑动窗口注意力
- BigBird 的块稀疏注意力
避坑指南
- 注意力矩阵 O(n²) 问题 :
- 症状:处理长序列时显存爆炸
-
解决方案:
- 使用稀疏注意力变体
- 实现内存高效的注意力计算
- 采用分块处理策略
-
训练不稳定问题 :
- 症状:loss 出现 NaN
- 解决方案:
- 适当调整初始化范围
- 增加 LayerNorm
- 使用更稳定的激活函数
思考题
如何设计跨模态注意力机制?考虑以下方向:
1. 视觉 - 语言任务中的交叉注意力
2. 多模态特征对齐策略
3. 模态间信息融合的门控机制
在实际应用中,注意力机制已经成为现代深度学习模型的基石。理解其核心原理并掌握工程实现技巧,对于构建高效的 NLP 系统至关重要。
正文完
发表至: 未分类
近三天内
