试图带你一文搞懂transformer注意力机制(Self-Attention)的本质

这篇文章主要想搞懂以下几个问题:

1、什么是自注意力(Self-Attention)

2、Q,K,V是什么

好了废话不多说,直接进入正题

Q,K,V分别代表query,key和value,这很容易让人联想到python的字典数据结构,假设我们有一个字典,存放着一个班级的身高(key)和体重(value)关系

{'160':50,'166':57,'173':65,'177':67,...}

这里取前三组,并以表格的形式展现:

        假设接到一个查询(query)身高为162,该查询并未在字典中,想要通过已有的字典数据预测改身高下的体重信息,直观推断,该体重可能会在50-57之间。但是想要定量的计算体重的预测值,我们可以通过加权平均的方式进行求解。

162和160之间的距离为2,162与166之间的距离为4,160与166之间的距离为6,那么162->160取4/6的权重,162->166取2/6的权重。

那么映射到体重上,对体重进行加权,就可以估计出162对应的体重约为50*(4/6)+57*(2/6)=52.33,接近50也符合预期。

因为162在[160,166]之间,所以这里很容易的为他们分配更多的权重,更加的注意他们,越近分配的权重越大,分别为他们分配了2/3和1/3的注意力权重。

但是在字典中,可能其他的键值对(key,value)对该query也存在影响,但是我们没有用上,那么要怎么用上字典中的所有数据,让估计的值更准确呢?

假设用一个函数\alpha(q,k_{i})来表示qk所对应的注意力权重,那么体重的预测值f(q)可以用以下方式得出:

f(q)=\alpha(q,k_{1}) v_{1} + \alpha(q,k_{2}) v_{2} + \alpha(q,k_{3}) v_{3} = \sum_{i=1}^{3}\alpha(q,k_{i}) v_{i}

其中\alpha是能够表征相关性的函数,以高斯核为例,那么

\alpha(q,k_{i})=softmax(-\frac{1}{2}(q-k_{i})^{2})=\frac{e^{-\frac{1}{2}(q-k_{i})^{2}}}{\sum_{j=1}^{3}e^{-\frac{1}{2}(q-k_{j})^{2}}}

其中-\frac{1}{2}(q-k_{i})^{2}为注意力分数,softmax(-\frac{1}{2}(q-k_{i})^{2})为注意力权重。

将对应的数值带入到公式中可得(其中的数字不是张量,所以用了x)

f(162)=\alpha(162,160) \times 50 + \alpha(162,166) \times 57 + \alpha(162,173) \times 65 = \sum_{i=1}^{3}\alpha(162,k_{i})\times v_{i} 

这样我们就可以利用上字典中其他的元素,通过身高来估计体重,这也就是注意力机制。

以上表示的是输入数据为一维的情况,当query,key,value为多维的情况也是类似的。

在介绍多维情况前先介绍注意力分数\alpha(q,k_{i})的计算方式有以下几种:

        目前大多的模型都是缩放点积模型,Transformer模型使用缩放点积注意力机制而不使用加性模型,这是因为缩放点积注意力在实际应用中表现更好。它具有更好的计算效率,适用于长序列,而且有更好的梯度传播性质,使得训练更加稳定。此设计是为了提高模型的性能和效率。这里以点积模型为例。

 对于q_{1}k_{1}

\alpha(q_{1},k_{1})=softmax(q_{1}\cdot k_{1}^{T})

其余的 q_{2}k_{2}以及q_{3}k_{3}以相同的方式处理。

\alpha(q_{2},k_{2})=softmax(q_{2}\cdot k_{2}^{T})

\alpha(q_{3},k_{3})=softmax(q_{3}\cdot k_{3}^{T})

那么就能得到: 

f(q)=\alpha(q_{1},k_{1}^{T}) v_{1} + \alpha(q_{2},k_{2}^{T}) v_{2} + \alpha(q_{2},k_{3}^{T}) v_{3} = \sum_{i=1}^{3}\alpha(q_{i},k_{i}^{T}) v_{i} 

将其转换为矩阵形式:

 即:

f(Q) = softmax(Q\cdot K^{T})\cdot V

还会除以一个特征维度\sqrt{d_{k}}将得分进行缩放,让梯度更稳定,乘法可能会产生梯度爆炸问题。

也就是:

f(Q) = softmax(Q\cdot K^{T}/\sqrt{d_{k}})\cdot V

这就是常见的缩放点积模型。经过softmax后,大值被放大,小值被抑制,这让模型能更加关注权重更大的地方。

如果其中的QKV都是同一个矩阵,那么他就是自注意模型了

X表示其中的一个矩阵

那么f(X) = softmax(X\cdot X^{T}/\sqrt{d_{k}})\cdot X

直接这么做其实没有多大意义的,实际的transformer中会将QKV使用linear做线性变换(可学习参数W),映射到不同的线性空间,并且会将其分成多个head,每个head能学到不同的东西,来增加特征的多样性,从而为模型提供更多的表达能力。

那么就能得到

f(X) = softmax(XW_{q}\cdot X^{T}W_{k}^{T}/\sqrt{d_{k}})\cdot XW_{v}

也就是自注意模型的公式

猜你喜欢

转载自blog.csdn.net/athrunsunny/article/details/133780978