注意力机制的数学公式梳理

本文为个人阅读笔记,参考《动手学深度学习》和蒲公英书《神经网络与深度学习》,两本书对RNN和attention都有简洁明了的介绍,深入浅出。

RNN回顾

循环神经网络使用隐状态ht1存储到时间步t-1的序列信息:

P(xtxt1,,x1)P(xtht1)

时间步t的隐状态可以用当前输入xt和先前隐状态ht1来计算:

ht=f(xt,ht1)

有许多不同的方法构建循环神经网络,最常见的隐状态计算方式:

Ht=ϕ(XtWxh+Ht1Whh+bh)

输出层则类似于多层感知机中的计算:

0t=HtWhq+bq

循环神经网络存在梯度爆炸和梯度消失、只能建立短距离依赖关系和局部编码,且无法并行计算;使用全连接网络可以直接建模远距离依赖,但无法处理变长的输入序列、根据输入长度改变连接权重的大小。利用注意力机制可以有效解决。

注意力

比起RNN这种token-by-token的时序处理方式,注意力机制采用一种“软性”的信息选择机制,对所有输入信息进行加权平均,其选择的信息是所有输入向量在注意力分布下的期望:

att(X,q)=n=1Nαnxn=Ep(zX,q)[xz]

其中,X=[x1,x2,,xN]Rd×N 是一个包含 N 个元素的向量序列,qRd 是一个查询向量,αn 是第 n 个元素的权重,满足 n=1Nαn=1。期望值 Ep(zX,q)[xz]z 表示被选择信息的索引位置。

这个模型可以通过控制注意力分布 αn 来使查询向量 q 更加关注向量序列 X 中的特定元素,从而更好地处理信息。

注意力分布αn 计算方式为:

αn=p(z=nX,q)=softmax(s(xn,q))=exp(s(xn,q))j=1Nexp(s(xj,q))

其中,s(xn,q) 是注意力打分函数,用来衡量 xn 和查询向量 q 之间相似度,可以用加性模型、点积模型、缩放点积模型、或双线性模型计算。

键值对注意力

以上是普通的注意力机制(K=V),更常用的键值对注意力函数如下:

att((K,V),q)=n=1Nαnvn=n=1Nexp(s(kn,q))jexp(s(kj,q))vn,

使用注意力机制的优点是可以处理输入序列中的重要部分,削减噪声部分,提高计算效率。对于翻译任务,一个词的翻译应该与原句子中的特定词汇相关,而不是与整个句子相关,因此利用注意力机制使代表原/目标语的端到端模型表现更加优秀。

多头注意力

Transformer中用到的多头注意力能并行地从输入信息中选取多组信息:

att((K,V),Q)=att((K,V),q1)att((K,V),qM)

其中Q=[q1,q2,,qM] 表示 M 个查询集合,每个查询集合具有相同的维度,即 qiRdqatt((K,V),qi) 表示第 i 个查询集合和 (K,V) 的注意力表示, 表示向量拼接。在这个公式中,多个查询 Q 是用来探索数据中丰富性的。具体来讲,通过利用多个不同的查询向量 qi,多头注意力机制可以在不同的方向上关注不同的特征。

自注意力

相比普通的全连接模型,自注意力模型可以动态生成连接的权重。

对于整个输入序列 X, 将其线性映射到三个不同的空间:

Q=WqXRDk×N,K=WkXRDk×N,V=WbXRDv×N,

Q=[q1,,qN],K=[k1,,kN],V=[v1,,vN] 分别是由查询向量、键向量和值向量构成的三个投影矩阵.

如果使用缩放点积来作为注意力打分函数, 输出向量序列为:

H=Vsoftmax(KQDk),

𝐷𝑘 是矩阵𝑸 和𝑲 中列向量的维度.

posted @   鸽鸽的书房  阅读(3140)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示