注意力机制解决了传统神经网络模型(如CNN和RNN)中需要固定输入大小的挑战。它们提供了一种灵活的方法来处理大小和内容各异的输入,例如长文本序列。这种灵活性是通过能够动态关注输入不同部分的机制来实现的。
数据库与查询类比
- 数据库模型:数据库使用键和值,其中查询根据键检索值。这个概念类似于神经网络,其中查询从一组数据(键和值)中获取相关信息。
- 数学公式:神经网络中的查询(q)根据键的相似性来获取值:
Attention(q,D)=i=1∑mα(q,ki)vi,
其中α是注意力权重,表示每个值vi基于查询q和键ki的重要性。
权重的归一化
- Softmax 函数:归一化注意力权重,确保它们和为1且保持非负:
α(q,ki)=∑jexp(a(q,kj))exp(a(q,ki)).
基于相似性的注意力池化
- Nadaraya-Watson 估计器:利用相似性核函数将查询与键关联起来,展示了现代注意力机制的先驱:
f(q)=i∑vi∑jα(q,kj)α(q,ki).
- 常用核函数:高斯、Boxcar 和 Epanechikov 核函数展示了根据查询和键之间的距离计算注意力权重的不同方法。
注意力评分 函数
- 点积注意力:使用查询和键的点积来简化注意力权重的计算:
a(q,ki)=dq⊤ki.
- 加性注意力:适用于查询和键维度不同的情况,涉及变换和非线性函数的组合:
a(q,k)=wv⊤tanh(Wqq+Wkk).
Bahdanau 注意力机制
- 动态上下文变量:在每个解码步骤更新上下文变量,使模型能够动态地关注输入序列的不同部分。
- 数学公式:上下文变量ct′被计算为所有编码器状态的加权和,根据解码器的需要进行调整:
ct′=t=1∑Tα(st′−1,ht)ht.
Seq2Seq 翻译中的注意力机制
PyTorch 关于 Seq2Seq 翻译的教程引入了注意力机制,以增强从法语到英语的翻译模型。以下是注意力如何应用的简明解释:
基本模型结构
- Seq2Seq 框架: 由编码器和解码器组成,两者都使用 RNN 实现。编码器将输入序列处理成一个上下文向量,解码器使用该向量生成输出序列。
代码示例