注意力机制 Attention
1. 为什么引入注意力机制?
注意力机制的提出主要是为了解决传统深度学习模型(如RNN、LSTM)在处理序列数据时的两大瓶颈:
- 长距离依赖问题:传统RNN在长序列中容易丢失早期信息(例如翻译长句子时,开头的词可能被遗忘)。
- 固定编码瓶颈:传统编码器-解码器模型将整个输入序列压缩为一个固定长度的向量,导致细节丢失(尤其是长文本)。
引入注意力的核心优势:
- 动态聚焦:允许模型在处理每个输出时,动态关注输入中最相关的部分(例如翻译“apple”时,重点关注源句中的“苹果”)。
- 保留细节:通过加权聚合所有输入信息,而非压缩为单一向量,避免信息损失。
- 可解释性:注意力权重能直观显示模型关注的位置(类似“高亮”重要词)。
- 并行计算:自注意力机制(如Transformer)摆脱了RNN的顺序计算,大幅提升训练速度。
2. 注意力机制如何工作?
注意力机制的核心思想是:根据输入的重要性分配权重,再通过加权求和提取关键信息。具体步骤:
1. 输入表示
- 查询(Query):当前需要生成的目标位置(例如翻译任务中待生成的英文单词)。
- 键(Key)和值(Value):通常来自输入序列(例如法语句子中的每个词)。
2. 计算相似度(评分函数)
通过比较Query和所有Key的相似性,得到注意力分数。常用方法:
- 点积(Dot Product):
Score = Query · Key
- 缩放点积(Scaled Dot-Product):加入缩放因子(如除以√维度,防止梯度爆炸)。
- 加性(Additive):通过神经网络计算。
3. 归一化权重
用Softmax将分数转换为概率分布,确保权重和为1:
Attention Weights = Softmax(Scores)
4. 加权聚合
用权重对Value加权求和,生成上下文向量(Context Vector):
Context = Σ(Attention Weights * Value)
5. 输出
将上下文向量与当前解码状态结合,生成最终输出(例如预测目标词)。
示例:
在英文翻译法语的句子“I love cats → J’aime les chats”中:
- 当生成英文词“cats”时,模型会为法语句子中的“chats”分配高注意力权重,同时忽略无关词。
扩展类型:
- 自注意力(Self-Attention):Query、Key、Value来自同一序列,捕捉序列内部关系(如理解句子中代词指代的对象)。
- 交叉注意力(Cross-Attention):Query来自目标序列,Key/Value来自源序列(用于翻译等任务)。
- 多头注意力(Multi-Head):并行多个注意力头,捕捉不同维度的语义关联(例如同时关注语法和语义)。
总结:
注意力机制通过动态权重分配,解决了长序列建模中的信息丢失问题,并成为Transformer、BERT、GPT等现代模型的核心组件,推动了NLP领域的突破性进展。