6

理解『注意力机制』的本质 - 茴香豆的茴

 7 months ago
source link: https://www.cnblogs.com/xing9/p/18006019/attention
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

理解『注意力机制』的本质

假设有这样一组数据,它们是腰围和体重一一对应的数据对。我们将根据表中的数据对去估计体重。

表1. 腰围体重表

如果现在给出一个新的腰围 62 ,那么体重的估计值是多少呢?

凭经验,我们认为腰围和体重是正相关的,所以我们会自然地『关注』和 62 差距更小的那些腰围,来去估计体重。也就是更加关注表格中腰围是 60 和 64 的『腰围-体重对』(waistline-weight pairs)。即,我们会估计此人的体重在 110 ~ 115 之间。这是一种定性的分析。
3361035-20240204131744351-1834125884.png
下面我们来算一下具体值。我们选取一种简单直观的方法来计算:
由于 62 距离 60 和 64 的距离是相等的,所以我们取 110 和 115 的平均值作为 62 腰围对应的体重。

110+1152=112.5

也可以这样认为,由于 62 距离 60 和 64 是最近的,所以我们更加『注意』它们,又由于 62 到它俩的距离相等,所以我们给这两对『腰围-体重对』各分配 0.5 的权重。

0.5×110+0.5×115=112.5

但是,我们到现在还没有用到过 68 --> 126 这个『腰围-体重对』,我们应该再分一些权重给它,让我们的估计结果更准确。

我们上面的讨论可以总结为公式:体重估计值权重体重权重体重权重体重体重估计值权重体重权重体重权重体重体重估计值=权重1×体重1+权重2×体重2+权重3×体重3

这个权重应该如何计算呢?


二、注意力机制

我们把『腰围-体重对』改写成 Python 语法中(字典)的『键-值对』(key-value pairs),把给出的新腰围 62 叫请求(query),简称 q .
3361035-20240204134507446-1096129259.png

现在我们给那些值起了新的名字,所以公式可以写为:f(q)=α(q,k1)⋅v1+α(q,k2)⋅v2+α(q,k3)⋅v3=Σi=13α(q,ki)⋅vi
这个公式描述了『注意力机制』。其中,f(q) 表示注意力机制的输出。 α(q,ki) 表示『注意力权重』。它和 q,ki 的相似度有关,相似度越高,注意力权重越高。
它是如何计算的呢?方法有很多,在本例中,我们使用高斯核计算:

GS(q,ki)=e−12(q−ki)2

我们取(−12(q−ki)2)部分进行下一步计算,并把它叫做『注意力分数』。显然,现在这个注意力分数是个绝对值很大的数,没法作为权重使用。所以下面我们要对其进行归一化,把注意力分数转换为 [0, 1] 间的注意力权重(用 α(q,ki) 表示)。本例选用 Softmax 进行归一化:

α(q,ki)=Softmax(−12(q−ki)2)=e−12(q−ki)2Σi=13e−12(q−ki)2

我们发现,好巧不巧地,α(q,ki) 最终又变成高斯核的表达式。

本例中的高斯核计算的相似度为:GS(62,68)=1.52×10−8GS(62,60)=0.135GS(62,64)=0.135
GS(q,k1) 太小了,我们直接近似为 0 .
注意力权重计算结果为:α(62,68)=0α(62,60)=0.5α(62,64)=0.5
体重估计值为:f(q)=α(62,68)×126+α(62,60)×110+α(62,64)×115=112.5


三、多维情况

当 q, k, v 为多维时
3361035-20240204144307550-1522524894.png
3361035-20240204144820858-789617717.png
注意力分数 α(qi,ki) 可以用以下方法计算:

模型 公式
加性模型 α(qi,ki)=softmax(Wqqi+Wkki+b)
点积模型 α(qi,ki)=qi⋅kid
缩放点积模型 α(qi,ki)=qi⋅kidk

我们以『点积模型』为例
3361035-20240204145621742-1124460582.png
3361035-20240204145629509-1825868668.png

q1=[64,85]
k1T=[6891]
α(q1,k1)=Softmax(q1k1T)=64×68+85×91=4352+7735=12087

其他注意力分数同理。
那么现在,多维情况下的注意力输出 f(q) 可以表示为下式:

f(q)=Σi=13α(qi,kiT)⋅vi=Softmax(qikiT)⋅vi

为了方便计算,我们写成矩阵形式。

Q=[64856180]
KT=[686064918788]
V=[126180110172115170]
f(Q)=Softmax(QKT)V

为了缓解梯度消失的问题,我们还会除以一个特征维度 dk ,即:

f(Q)=Softmax(QKT/dk)V

这一系列操作,被称为『缩放点积注意力模型』(scaled dot-product attention)

如果 Q, K, V 是同一个矩阵,会发生什么?


四、自注意力机制

我们用 X 表示这三个相同的矩阵:

X=Q=K=V=[679160876484]

则上述的注意力机制表达式可以写成:

f(X)=Softmax(XXT/dk)X

这个公式描述了『自注意力机制』(Self-Attention Mechanism)。在实际应用中,可能会对 X 做不同的线性变换再输入,比如 Transformer 模型。这可能是因为 X 转换空间后,能更加专注注意力的学习。
三个可学习的权重矩阵 WQ, WK, WV 可以将输入 X 投影到查询、键和值的空间。

f(X)=Softmax(XWQ(XWK)T/dk)XWV

该公式执行以下步骤:

  1. 使用权重矩阵 WQ 和 WK 将输入序列 X 投影到查询空间和键空间,得到 XWQ 和 XWK。
  2. 计算自注意力分数:(XWQ)(XWK)T,并除以 dk 进行缩放。
  3. 对自注意力分数进行 Softmax 操作,得到注意力权重。
  4. 使用权重矩阵 WV 将输入序列 X 投影到值空间,得到 XWV。
  5. 将 Softmax 的结果乘以 XWV,得到最终的输出。

这个带有权重矩阵的自注意力机制允许模型学习不同位置的查询、键和值的映射关系,从而更灵活地捕捉序列中的信息。在Transformer等模型中,这样的自注意力机制广泛用于提高序列建模的效果。


相关概念推荐阅读:高斯核是什么?Softmax 函数是什么?
推荐B站视频:注意力机制的本质(BV1dt4y1J7ov),65 注意力分数【动手学深度学习v2】(BV1Tb4y167rb)


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK