self-Attention(自注意力)深度解读

Self-Attention

自注意力顾名思义即是让模型观察自身,找到需要注意的内容,这就是较为浅显的理解。其实自注意力的结果包含了在同一个序列中的每一个词与其他词之间的相关性内容,同时还包含了每一个词的”实意特征“与”语意特征“。这两个特征举个例子就是:香蕉这个词,实意特征为一个月牙状的、黄色热带果实;语意特征为猴子喜欢的等。

下面将对如何通过计算从原始的嵌入位置编码的词向量,转变为带有上述两种特征与相关性的向量内容做出解释,其实整个过程几乎都可以包含在以下公式中,先观察这个公式和架构图实际上是一一对应的,唯一的不同为图像中的Mask(opt.)这个模块的选择是在不同情况调用的,是否能理解不重要,后续会对每个部分做出详细的解释。

1.1 Q、K、V and d_k

在上面的公式中可以看到主要的数据内容为Q、K、V、d_k,要想理解为什么这个公式能让一个词向量拥有各种特征就得先明白每一个数据的含义,在自注意力的过程中QKV的来源其实是原始的输入X,这个X就是我们需要获取特征的词向量,通过三个矩阵W^Q、W^K、W^V(又叫做权重矩阵)原始的词向量X转换为计算公式中的Q、K、V。为什么要使用这三个矩阵,这就需要涉及到梯度学习的过程,设计这个网络的初心是为了让模型能够自主的学习我们希望其学习到的特征,并且这个学习到的特征要与我们的预期尽可能相似,这在数学上的表示就是函数求极值得问题,通过梯度的反向传播就能实现这个极值得求取。

说完了为什么要有权重矩阵的过程接下来我们看一下计算Q、K、V具体的计算过程,如图所示:

在图中会发现一个问题,X的维度设置我们可以理解,那么几个权重矩阵W^*的维度是怎么确定的呢,W^*的其中一个维度很好得到,因为它需要与X进行矩阵乘法,所以其第一个维度需要与X的最后一个唯独相同,另一个维度的设定就需要考虑实际的下游任务了。

在自注意力机制中,查询矩阵 W^Q、键矩阵 W^K 和值矩阵 W^V 的维度通常是根据模型的具体设计和需求来确定的。这些矩阵用于将输入向量转换成查询(Query)、键(Key)和值(Value)向量。以下是这些矩阵维度的确定方法:

  1. 输入向量维度 (d_{\text{model}}): 这是指模型的输入特征向量的维度,例如,在Transformer模型中,d_{\text{model}}通常设定为512或1024等值。

  2. 查询、键和值向量维度 (d_k和 d_v​): 查询向量和键向量的维度通常相等,记为 d_k,而值向量的维度记为 d_v​。在很多情况下,d_k和d_v​的值相同或接近。

  3. 头数 (h): 当使用多头注意力(Multi-Head Attention)时,查询、键和值向量会被分成多个头(head),每个头有自己的查询矩阵 W^Q、键矩阵 W^K 和值矩阵 W^V。这意味着查询向量、键向量和值向量的总维度需要能够被头数整除。

综上所述,查询矩阵W^Q、键矩阵 W^K 和值矩阵 W^V的维度通常表示为:

  • W^Q: d_{\text{model}} \times d_k

  • W^K: d_{\text{model}} \times d_k

  • W^V: d_{\text{model}} \times d_v

在完成查询矩阵 W^Q、键矩阵 W^K 和值矩阵 W^V的设计后就能将其与X相乘获取到我们初始状态的Q、K、V了,这里他们分别拥有不同的含义,其中

Q:当前步骤的输入(要关注的内容)

K:检索信息的标识(用于与查询比较计算相关性)、

V:实际需要的信息(使用QK计算出的相关性加权求和),物理含义为:如果这个token对于调整其他内容的含义具有相关性,那么需要向那个内容的embadding嵌入相关性值。

这些向量中的更多含义需要结合注意力公式的计算才能阐述清楚。

1.2 计算注意力得分(MatMul)、scale与SoftMax

自注意力的计算的一个关键步骤就是计算书注意力得分,也就是我们需要根据这个词对输入句子的每个单词进行评分。分数决定了我们在某个位置编码单词时对输入句子其他部分的关注程度。

得分是通过对查询向量与我们要评分的相应单词的键向量进行点积计算得出的。因此,如果我们要处理Thingking中的单词的自注意力,则第一个得分将是q1和k1的点积。第二个得分将是q1和k2的点积。

可以看到上图中求x_1的注意力分数需要使用其q_1与序列中包括其自身在内的k_*相乘,这样的向量乘法可以得到一个注意力分数值,这也和线性代数中向量相乘所得值越大相关性越高是同样的原理,这里得到的相关性是词本身与其他词之间的相关性,即当前词在序列中的重要程度。

而后因为矩阵相乘带来了一定的损失以及后续的计算量的增大,需要对得到的注意力分数进行Scale操作与SoftMax操作,Scale操作就需要使用到\sqrt{d_k},在原文中使用其的原因大致如上描述的一样,从后续操作中描述其作用可以为以下两点:

防止输入softmax的值过大,导致其偏导数为0

在Q、K点积计算过程中,会随着维度d_k增大而增大,这样的除法可以保证其方差为1

softmax函数决定了每个单词在这个位置的表达程度。其原理在于将注意力得分转换为了一个概率分布,不难看出其实每个单词在自身的注意力得分是最大的,同时与当前单词相关的其他单词也具有一定的概率值。其具体的计算公式如下所示

\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}}

在公式中可以看到其会将传入其内的所有值附加进e^{x}中,这个x就代表了输入的值,而后除以所有输入附加后的和以计算出每一个值的概率。

1.3 加权求和

经历了上述自注意力分数的计算、化简与概率分布计算之后,还需要对其输出值进行一个操作,我们可以注意到前面的注意力分数计算过程实际上只是计算了每个向量自身的语意信息与其他向量语意信息的相关性,在其向量表达中只有自身的权重是最大的,这明显是有失偏颇的,因此我们还需要进一步计算其值在序列中不同位置词向量之间的重要性。这个过程实际就是上述注意力分数乘V的过程,具体表现为下图:

图中可以看到是将每个值向量乘以 softmax 分数(准备将它们相加)。这里的直觉是保持我们想要关注的单词的值不变,并淹没不相关的单词(例如,通过将它们乘以 0.001 这样的小数字)。最后将权值向量相加。这将产生此位置(第一个单词)的自注意力层的输出。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值