一、引例
假设有这样一组数据,它们是腰围和体重一一对应的数据对。我们将根据表中的数据对去估计体重。
如果现在给出一个新的腰围 62 ,那么体重的估计值是多少呢?
凭经验,我们认为腰围和体重是正相关的,所以我们会自然地『关注』和 62 差距更小的那些腰围,来去估计体重。也就是更加关注表格中腰围是 60 和 64 的『腰围-体重对』(waistline-weight pairs)。即,我们会估计此人的体重在 110 ~ 115 之间。这是一种定性的分析。
下面我们来算一下具体值。我们选取一种简单直观的方法来计算:
由于 62 距离 60 和 64 的距离是相等的,所以我们取 110 和 115 的平均值作为 62 腰围对应的体重。
110
+
115
2
=
112.5
\frac{110 + 115}{2}=112.5
2110+115=112.5
也可以这样认为,由于 62 距离 60 和 64 是最近的,所以我们更加『注意』它们,又由于 62 到它俩的距离相等,所以我们给这两对『腰围-体重对』各分配 0.5 的权重。
0.5
×
110
+
0.5
×
115
=
112.5
0.5\times 110+0.5\times 115=112.5
0.5×110+0.5×115=112.5
但是,我们到现在还没有用到过 68 --> 126 这个『腰围-体重对』,我们应该再分一些权重给它,让我们的估计结果更准确。
我们上面的讨论可以总结为公式: 体重估计值 = 权重 1 × 体重 1 + 权重 2 × 体重 2 + 权重 3 × 体重 3 体重估计值=权重1×体重1+权重2×体重2+权重3×体重3 体重估计值=权重1×体重1+权重2×体重2+权重3×体重3
这个权重应该如何计算呢?
二、注意力机制
我们把『腰围-体重对』改写成 Python 语法中(字典)的『键-值对』(key-value pairs),把给出的新腰围 62 叫请求(query),简称
q
q
q .
现在我们给那些值起了新的名字,所以公式可以写为:
f
(
q
)
=
α
(
q
,
k
1
)
⋅
v
1
+
α
(
q
,
k
2
)
⋅
v
2
+
α
(
q
,
k
3
)
⋅
v
3
=
Σ
i
=
1
3
α
(
q
,
k
i
)
⋅
v
i
f(q)=\alpha (q, k_1)\cdot v_1 + \alpha (q, k_2)\cdot v_2 + \alpha (q, k_3)\cdot v_3=\Sigma _{i=1}^{3}\alpha (q, k_i)\cdot v_i
f(q)=α(q,k1)⋅v1+α(q,k2)⋅v2+α(q,k3)⋅v3=Σi=13α(q,ki)⋅vi
这个公式描述了『注意力机制』。其中,
f
(
q
)
f(q)
f(q) 表示注意力机制的输出,
α
(
q
,
k
i
)
\alpha (q, k_i)
α(q,ki) 表示『注意力权重』。它和
q
q
q,
k
i
k_i
ki 的相似度有关,相似度越高,注意力权重越高。
它是如何计算的呢?方法有很多,在本例中,我们使用高斯核计算:
G
S
(
q
,
k
i
)
=
e
−
1
2
(
q
−
k
i
)
2
GS(q, k_i)=e^{-\frac{1}{2}(q-k_i)^2}
GS(q,ki)=e−21(q−ki)2
我们取
(
−
1
2
(
q
−
k
i
)
2
)
(-\frac{1}{2}(q-k_i)^2)
(−21(q−ki)2)部分进行下一步计算,并把它叫做『注意力分数』。显然,现在这个注意力分数是个绝对值很大的数,没法作为权重使用。所以下面我们要对其进行归一化,把注意力分数转换为 [0, 1] 间的注意力权重(用
α
(
q
,
k
i
)
\alpha (q, k_i)
α(q,ki) 表示)。本例选用 Softmax 进行归一化:
α
(
q
,
k
i
)
=
Softmax
(
−
1
2
(
q
−
k
i
)
2
)
=
e
−
1
2
(
q
−
k
i
)
2
Σ
i
=
1
3
e
−
1
2
(
q
−
k
i
)
2
\alpha (q, k_i) = \text{Softmax}(-\frac{1}{2}(q-k_i)^2) = \frac{e^{-\frac{1}{2}(q-k_i)^2}}{\Sigma _{i=1}^{3}e^{-\frac{1}{2}(q-k_i)^2}}
α(q,ki)=Softmax(−21(q−ki)2)=Σi=13e−21(q−ki)2e−21(q−ki)2
我们发现,好巧不巧地,
α
(
q
,
k
i
)
\alpha (q, k_i)
α(q,ki) 最终又变成高斯核的表达式。
本例中的高斯核计算的相似度为:
G
S
(
62
,
68
)
=
1.52
×
1
0
−
8
GS(62, 68)= 1.52×10^{-8}
GS(62,68)=1.52×10−8
G
S
(
62
,
60
)
=
0.135
GS(62, 60)= 0.135
GS(62,60)=0.135
G
S
(
62
,
64
)
=
0.135
GS(62, 64)= 0.135
GS(62,64)=0.135
G
S
(
q
,
k
1
)
GS(q, k_1)
GS(q,k1) 太小了,我们直接近似为 0 .
注意力权重计算结果为:
α
(
62
,
68
)
=
0
\alpha (62, 68) = 0
α(62,68)=0
α
(
62
,
60
)
=
0.5
\alpha (62, 60) = 0.5
α(62,60)=0.5
α
(
62
,
64
)
=
0.5
\alpha (62, 64) = 0.5
α(62,64)=0.5
体重估计值为:
f
(
q
)
=
α
(
62
,
68
)
×
126
+
α
(
62
,
60
)
×
110
+
α
(
62
,
64
)
×
115
=
112.5
f(q) = \alpha (62, 68) \times 126 + \alpha (62, 60) \times 110 + \alpha (62, 64) \times 115 = 112.5
f(q)=α(62,68)×126+α(62,60)×110+α(62,64)×115=112.5
三、多维情况
当
q
q
q,
k
k
k,
v
v
v 为多维时
注意力分数
α
(
q
i
,
k
i
)
\alpha (q_i, k_i)
α(qi,ki) 可以用以下方法计算:
模型 | 公式 |
---|---|
加性模型 | α ( q i , k i ) = softmax ( W q q i + W k k i + b ) \alpha(q_i, k_i) = \text{softmax}(W_q q_i + W_k k_i + b) α(qi,ki)=softmax(Wqqi+Wkki+b) |
点积模型 | α ( q i , k i ) = q i ⋅ k i d \alpha(q_i, k_i) = \frac{q_i \cdot k_i}{\sqrt{d}} α(qi,ki)=dqi⋅ki |
缩放点积模型 | α ( q i , k i ) = q i ⋅ k i d k \alpha(q_i, k_i) = \frac{q_i \cdot k_i}{\sqrt{d_k}} α(qi,ki)=dkqi⋅ki |
我们以『点积模型』为例
q
1
=
[
64
,
85
]
q_1=[64, 85]
q1=[64,85]
k
1
T
=
[
68
91
]
k_1^T= \begin{bmatrix} 68 \\ 91 \end{bmatrix}
k1T=[6891]
则有
α
(
q
1
,
k
1
)
=
Softmax
(
q
1
k
1
T
)
=
64
×
68
+
85
×
91
=
4352
+
7735
=
12087
\alpha(q_1, k_1) = \text{Softmax}(q_1 k_1^T) = 64 \times 68 + 85 \times 91 = 4352 + 7735 = 12087
α(q1,k1)=Softmax(q1k1T)=64×68+85×91=4352+7735=12087
其他注意力分数同理。
那么现在,多维的
f
(
q
)
f(q)
f(q) 公式可以表示为:
f
(
q
)
=
Σ
i
=
1
3
α
(
q
i
,
k
i
T
)
⋅
v
i
=
Softmax
(
q
i
k
i
T
)
⋅
v
i
f(q)=\Sigma _{i=1}^{3}\alpha (q_i, k_i^T)\cdot v_i=\text{Softmax}(q_i k_i^T)\cdot v_i
f(q)=Σi=13α(qi,kiT)⋅vi=Softmax(qikiT)⋅vi
为了方便计算,我们写成矩阵形式。
Q
=
[
64
85
61
80
]
Q = \begin{bmatrix} 64 & 85 \\ 61 & 80 \\ \end{bmatrix}
Q=[64618580]
K
T
=
[
68
60
64
91
87
88
]
K^T = \begin{bmatrix} 68 & 60 & 64 \\ 91 & 87 & 88 \\ \end{bmatrix}
KT=[689160876488]
V
=
[
126
180
110
172
115
170
]
V = \begin{bmatrix} 126 & 180 \\ 110 & 172 \\ 115 & 170 \\ \end{bmatrix}
V=
126110115180172170
f
(
Q
)
=
Softmax
(
Q
K
T
)
V
f(Q)=\text{Softmax}(QK^T)V
f(Q)=Softmax(QKT)V
为了缓解梯度消失的问题,我们还会除以一个特征维度
d
k
\sqrt{d_k}
dk ,即:
f
(
Q
)
=
Softmax
(
Q
K
T
/
d
k
)
V
f(Q)=\text{Softmax}(QK^T/\sqrt{d_k})V
f(Q)=Softmax(QKT/dk)V
这一系列操作,被称为『缩放点积注意力模型』(scaled dot-product attention)
如果 Q Q Q, K K K, V V V 是同一个矩阵,会发生什么?
四、自注意力机制
我们用
X
X
X 表示这三个相同的矩阵:
X
=
Q
=
K
=
V
=
[
67
91
60
87
64
84
]
X=Q=K=V=\begin{bmatrix} 67 & 91 \\ 60 & 87 \\ 64 & 84 \\ \end{bmatrix}
X=Q=K=V=
676064918784
则上述的注意力机制表达式可以写成:
f
(
X
)
=
Softmax
(
X
X
T
/
d
k
)
X
f(X)=\text{Softmax}(XX^T/\sqrt{d_k})X
f(X)=Softmax(XXT/dk)X
这个公式描述了『自注意力机制』(Self-Attention Mechanism)。在实际应用中,可能会对
X
X
X 做不同的线性变换再输入,比如 Transformer 模型。这可能是因为
X
X
X 转换空间后,能更加专注注意力的学习。
三个可学习的权重矩阵
W
Q
W_Q
WQ,
W
K
W_K
WK,
W
V
W_V
WV 可以将输入
X
X
X 投影到查询、键和值的空间。
f
(
X
)
=
Softmax
(
X
W
Q
(
X
W
K
)
T
/
d
k
)
X
W
V
f(X)=\text{Softmax}(XW_Q(XW_K)^T/\sqrt{d_k})XW_V
f(X)=Softmax(XWQ(XWK)T/dk)XWV
该公式执行以下步骤:
- 使用权重矩阵 W Q W_Q WQ 和 W K W_K WK 将输入序列 X X X 投影到查询空间和键空间,得到 X W Q XW_Q XWQ 和 X W K XW_K XWK。
- 计算自注意力分数: ( X W Q ) ( X W K ) T (XW_Q)(XW_K)^T (XWQ)(XWK)T,并除以 d k \sqrt{d_k} dk 进行缩放。
- 对自注意力分数进行 Softmax 操作,得到注意力权重。
- 使用权重矩阵 W V W_V WV 将输入序列 X X X 投影到值空间,得到 X W V XW_V XWV。
- 将 Softmax 的结果乘以 X W V XW_V XWV,得到最终的输出。
这个带有权重矩阵的自注意力机制允许模型学习不同位置的查询、键和值的映射关系,从而更灵活地捕捉序列中的信息。在Transformer等模型中,这样的自注意力机制广泛用于提高序列建模的效果。
相关概念推荐阅读:高斯核是什么?,Softmax 函数是什么?
推荐B站视频:注意力机制的本质(BV1dt4y1J7ov),65 注意力分数【动手学深度学习v2】(BV1Tb4y167rb)