Transformer:加性注意力还是点积注意力?这是个问题~

目录

写在前面

一、加性注意力

二、点积注意力

三、QKV的理解

四、总结


写在前面

        加性注意力(Additive Attention)和点积注意力(Multiplicative Attention,也称为缩放点积注意力,Scaled Dot-Product Attention)是两种常见的注意力机制,用于计算不同序列元素之间的相关性。加性注意力最初用在seq2seq;点积注意力最初用在Transformer。总的来说点积注意力更符合当下的NLP模型,使用的更广泛。

一、加性注意力

        加性注意力通过将查询(Query)和键(Key)向量进行拼接,然后通过一个全连接计算注意力分数。具体步骤如下:

1.线性变换:将查询向量 Q 和键向量 K 通过线性变换得到新的表示。

Q=XW_q

K=XW_k

2.拼接并计算注意力分数:将变换后的查询和键向量拼接,并通过一个前馈神经网络(通常是一个单层感知机,MLP)计算注意力分数。

Scores=tanh(W[q,k])

        其中,W是一个可训练的权重矩阵, [q,k] 表示拼接后的向量。

3.归一化:使用softmax函数将注意力分数归一化为概率分布。

Attention\ Weights=softmax(Scores)

4.加权求和:将注意力权重与值向量 VV 进行加权求和,得到最终的输出。

Attention\ Output=Attention\ Weights\times V

二、点积注意力

        点积注意力(Multiplicative Attention / Scaled Dot-Product Attention)通过直接计算查询向量和键向量的点积来获得注意力分数。缩放点积注意力则是在点积结果上进行缩放,以防止数值过大。具体步骤如下:

        1.线性变换:将查询向量 QQ、键向量 KK 和值向量 VV 分别通过线性变换得到新的表示。

Q=XW_q

K=XW_k

V=XW_v

        2.计算点积:计算查询和键的点积以获得注意力分数。

Score=QK^T

        3.缩放:为了防止点积结果过大,导致softmax的梯度变得很小,对点积结果进行缩放,通常缩放因子为\sqrt{d_k},其中 dkdk​ 是键向量的维度。

Scaled\ Scores=\frac{Scores}{\sqrt{d_k}}

        4.应用掩码(可选):如果需要掩盖部分位置(如解码阶段的未来标记),则将这些位置的分数设置为负无穷大。

Masked\ Scores=Scaled\ Scores+Mask

        5.归一化:使用softmax函数将缩放后的分数归一化为概率分布。

Attention\ Weights=softmax(Masked\ Scores)

        6.加权求和:将注意力权重与值向量V进行加权求和,得到最终的输出。

Attention\ Output=Attention\ Weights\times V

        下面这个图上面的过程描述了上面的过程,其中q_ik_iv_i是矩阵中的向量,带颜色的线表示先点乘(score是相乘)再相加:

三、QKV的理解

        这里简答说一下QKV的理解,两种注意力机制都用到了查询向量(Q)、键向量(K)和值向量(V)。Q和K都是输入经过线性变换的到来的,操作是相似的,但我们习惯给他们赋予不同的角色,其实是便于理解。

        1.查询向量(Q)

        Query代表的是当前位置对其他位置的查询信号。它是从当前位置的角度出发,试图找出哪些位置的信息是重要的,应该被更多地关注。

        2.键向量(K)

        Key代表的是每个位置提供的信息的一种表征,用于响应来自Query的查询。Key的作用是为每个位置的信息建立一个索引,以便Query可以用来评估每个位置的相关性。

        3.值向量(V)

        Value在自注意力机制中扮演的是内容提供者的角色。每个位置的Value包含了该位置的具体信息,这些信息将根据计算得到的注意力分数被加权求和,以生成该位置的输出表示。

        使用QKV有如下好处:

        1. 可解释性:Q和K的乘积提供了一种解释性强的方式来表示不同元素之间的相互作用。每个元素的Query与其他所有元素的Key进行点积,可以看作是评估它们之间相似度的一种方式。

        2. 参数共享:在使用QK计算注意力分数时,相同的Query和Key矩阵被用于所有的输入位置,这意味着模型可以在不同位置间共享学习到的特征表示,从而减少模型参数并提高泛化能力。

        3. 动态性:通过Q和K的乘积,模型可以根据输入数据的不同长度动态调整注意力分布。这种动态性是全连接层难以实现的,因为全连接层通常生成固定的输出,而不是基于输入之间相互作用的动态输出。

四、总结

        加性注意力:由于涉及拼接向量和通过前馈神经网络进行计算,计算复杂度相对较高。在处理较小的维度时表现良好,因为前馈神经网络能够捕捉更复杂的关系。

        点积注意力:主要操作是矩阵乘法和缩放,计算复杂度相对较低,特别是当使用并行计算时。在处理较高维度时表现更好,因为点积操作能够更有效地计算相似性,并且缩放可以防止数值不稳定。

        加性注意力和点积注意力是两种重要的注意力机制,各有优劣。在现代深度学习模型中,特别是Transformer架构中,点积注意力由于其计算效率和并行化能力,得到了更广泛的应用。

        加性注意力还是点积注意力就介绍到这里,关注不迷路(#^.^#)

关注订阅号了解更多精品文章

交流探讨、商务合作请加微信

  • 38
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
Transformer 中,自注意力操作的目的是对输入序列中的每个位置进行加权平均池化,得到一个加权平均的“向量表示”。其中,每个位置的权重是通过计算该位置与其他所有位置的相似度得到的。而为了计算相似度,Transformer 使用了点积运算。 具体来说,对于输入序列中的每个位置,我们可以将其表示为一个 d 维的向量。我们将这些向量组成一个矩阵 X,其中每一行代表一个位置。接着,我们将 X 矩阵的每一行分别作为查询(query)、键(key)和值(value)向量。对于每个查询向量,我们需要计算它与所有键向量的相似度,并将这些相似度作为权重,加权平均地得到一个值,作为该查询向量的加权表示。具体地,我们可以将查询向量 q 与键向量 k 的相似度表示为: sim(q, k) = q · k 其中 · 表示点积运算。可以看出,点积运算得到的是两个向量之间的相似度,值越大表示两个向量越相似。因此,在自注意力操作中,点积运算的含义是用来衡量查询向量和键向量之间的相似度,从而计算它们之间的权重。 使用点积作为相似度的度量方式在计算上非常高效,因此在 Transformer 中得到了广泛的应用。同时,由于点积得到的相似度值是没有经过归一化的,因此在计算时还需要对相似度进行一定的缩放,以确保不同维度上的特征对相似度的贡献是相同的。具体来说,Transformer 中使用了一个缩放因子 sqrt(d_k),其中 d_k 表示键向量的维度。这样,计算得到的相似度值就可以保证在不同维度上的特征对相似度的贡献是相同的。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殊小殊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值