深度学习笔记之Transformer——关于注意力分数的总结
- 引言
- 回顾: Nadaraya-Watson \text{Nadaraya-Watson} Nadaraya-Watson核回归
- 再回首: Seq2seq \text{Seq2seq} Seq2seq中的注意力机制
- 注意力机制的泛化表示
- 加性注意力机制
- 缩放点积注意力机制
引言
上一节介绍了注意力机制的基本逻辑。本节作为过渡文章,归纳注意力分数这个概念。
回顾: Nadaraya-Watson \text{Nadaraya-Watson} Nadaraya-Watson核回归
作为一种懒惰学习
(
Lazy Learnging
)
(\text{Lazy Learnging})
(Lazy Learnging)方法,
Nadaraya-Watson
\text{Nadaraya-Watson}
Nadaraya-Watson核回归基于训练集
D
=
{
(
x
(
i
)
,
y
(
i
)
)
}
i
=
1
N
\mathcal D = \{(x^{(i)},y^{(i)})\}_{i=1}^{N}
D={(x(i),y(i))}i=1N,关于陌生样本
x
x
x的预测过程表示为:
f
(
x
)
=
[
κ
(
x
,
x
(
1
)
)
∑
j
=
1
N
κ
(
x
,
x
(
j
)
)
,
κ
(
x
,
x
(
2
)
)
∑
j
=
1
N
κ
(
x
,
x
(
j
)
)
,
⋯
,
κ
(
x
,
x
(
N
)
)
∑
j
=
1
N
κ
(
x
,
x
(
j
)
)
]
1
×
N
(
y
(
1
)
y
(
2
)
⋮
y
(
N
)
)
N
×
1
=
∑
i
=
1
N
κ
(
x
,
x
(
i
)
)
∑
j
=
1
N
κ
(
x
,
x
(
j
)
)
⋅
y
(
i
)
\begin{aligned} f(x) & = \left[\frac{\kappa(x,x^{(1)})}{\sum_{j=1}^N \kappa(x,x^{(j)})},\frac{\kappa(x,x^{(2)})}{\sum_{j=1}^N \kappa(x,x^{(j)})},\cdots,\frac{\kappa(x,x^{(N)})}{\sum_{j=1}^N \kappa(x,x^{(j)})}\right]_{1 \times N} \begin{pmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(N)} \end{pmatrix}_{N \times 1} \\ & = \sum_{i=1}^N \frac{\kappa(x,x^{(i)})}{\sum_{j=1}^N \kappa(x,x^{(j)})} \cdot y^{(i)} \end{aligned}
f(x)=[∑j=1Nκ(x,x(j))κ(x,x(1)),∑j=1Nκ(x,x(j))κ(x,x(2)),⋯,∑j=1Nκ(x,x(j))κ(x,x(N))]1×N
y(1)y(2)⋮y(N)
N×1=i=1∑N∑j=1Nκ(x,x(j))κ(x,x(i))⋅y(i)
在训练集
D
\mathcal D
D给定的条件下,已知一个未知样本
x
x
x,那么
∑
j
=
1
N
κ
(
x
,
x
(
j
)
)
\sum_{j=1}^N \kappa(x,x^{(j)})
∑j=1Nκ(x,x(j))必然是一个确定的值。因而导致
y
(
i
)
y^{(i)}
y(i)的系数
κ
(
x
,
x
(
i
)
)
∑
j
=
1
N
κ
(
x
,
x
(
j
)
)
\begin{aligned}\frac{\kappa(x,x^{(i)})}{\sum_{j=1}^{N} \kappa(x,x^{(j)})}\end{aligned}
∑j=1Nκ(x,x(j))κ(x,x(i))必然仅与
x
,
x
(
i
)
x,x^{(i)}
x,x(i)相关,而与其他训练样本无关。这里将其简写为如下形式:
f
(
x
)
=
∑
i
=
1
N
α
(
x
,
x
(
i
)
)
⋅
y
(
i
)
f(x) = \sum_{i=1}^N \alpha(x,x^{(i)}) \cdot y^{(i)}
f(x)=i=1∑Nα(x,x(i))⋅y(i)
而
α
(
x
,
x
(
i
)
)
\alpha(x,x^{(i)})
α(x,x(i))这个函数结果可被称作
x
x
x关于训练样本
x
(
i
)
x^{(i)}
x(i)的注意力权重
(
Attention Weight
)
(\text{Attention Weight})
(Attention Weight);假设
κ
(
x
,
x
(
i
)
)
\kappa(x,x^{(i)})
κ(x,x(i))描述的是径向基核函数
(
Radial Basis Function,RBF
)
(\text{Radial Basis Function,RBF})
(Radial Basis Function,RBF),可以将
f
(
x
)
f(x)
f(x)表示成如下形式:
{
κ
(
x
,
x
(
i
)
)
=
exp
{
−
1
2
σ
2
∣
∣
x
−
x
(
j
)
∣
∣
2
}
f
(
x
)
=
∑
i
=
1
N
κ
(
x
,
x
(
i
)
)
∑
j
=
1
N
κ
(
x
,
x
(
j
)
)
⋅
y
(
i
)
=
∑
i
=
1
N
Softmax
[
−
1
2
σ
2
∣
∣
x
−
x
(
i
)
∣
∣
2
]
⋅
y
(
i
)
\begin{cases} \begin{aligned} \kappa(x,x^{(i)}) & = \exp \left\{-\frac{1}{2\sigma^2} ||x - x^{(j)}||^2 \right\} \\ f(x) & = \sum_{i=1}^N \frac{\kappa(x,x^{(i)})}{\sum_{j=1}^N \kappa(x,x^{(j)})} \cdot y^{(i)} \\ & = \sum_{i=1}^N \text{Softmax} \left[ - \frac{1}{2\sigma^2} ||x - x^{(i)}||^2\right] \cdot y^{(i)} \end{aligned} \end{cases}
⎩
⎨
⎧κ(x,x(i))f(x)=exp{−2σ21∣∣x−x(j)∣∣2}=i=1∑N∑j=1Nκ(x,x(j))κ(x,x(i))⋅y(i)=i=1∑NSoftmax[−2σ21∣∣x−x(i)∣∣2]⋅y(i)
此时再去观察
α
(
x
,
x
(
i
)
)
=
Softmax
[
1
2
σ
2
∣
∣
x
−
x
(
i
)
∣
∣
2
]
\begin{aligned} \alpha(x,x^{(i)}) = \text{Softmax} \left[\frac{1}{2\sigma^2} ||x - x^{(i)}||^2\right] \end{aligned}
α(x,x(i))=Softmax[2σ21∣∣x−x(i)∣∣2],可以发现:
Softmax
\text{Softmax}
Softmax函数仅仅是一个归一化操作——该函数自身并不包含注意力信息。而真正包含注意力信息的只有
−
1
2
σ
2
∣
∣
x
−
x
(
i
)
∣
∣
2
\begin{aligned}-\frac{1}{2\sigma^2}||x - x^{(i)}||^2\end{aligned}
−2σ21∣∣x−x(i)∣∣2。我们将这部分函数的结果称作注意力分数
(
Attention Score
)
(\text{Attention Score})
(Attention Score)。
很明显,注意力分数是指没有被‘标准化’
(
Normalization
)
(\text{Normalization})
(Normalization)的;描述样本/向量间的‘纯粹的信息’。
使用流程图来描述上述过程:
再回首: Seq2seq \text{Seq2seq} Seq2seq中的注意力机制
回过头观察 Seq2seq \text{Seq2seq} Seq2seq: Seq2seq \text{Seq2seq} Seq2seq中的注意力机制是否也满足上述流程 ? ? ?
场景构建:
-
在 Seq2seq \text{Seq2seq} Seq2seq中,编码器中各时刻的序列信息 [ h L ; j , h R ; ( T + 1 − j ) ] ( j = 1 , 2 , ⋯ , T ) \left[h_{\mathcal L;j},h_{\mathcal R;(\mathcal T + 1 -j)}\right](j=1,2,\cdots,\mathcal T) [hL;j,hR;(T+1−j)](j=1,2,⋯,T)视作 Keys \text{Keys} Keys,而对应的 Values \text{Values} Values就是它们自身;
-
在解码器中某一时刻 t ( t ∈ { 1 , 2 , ⋯ , T ′ } ) t(t \in \{1,2,\cdots,\mathcal T'\}) t(t∈{1,2,⋯,T′})的序列信息 h D ( t ) h_{\mathcal D}^{(t)} hD(t)(也可以是上一时刻的 h D ( t − 1 ) h_{\mathcal D}^{(t-1)} hD(t−1),这里用 h D ( t ) h_{\mathcal D}^{(t)} hD(t)示例)视作 Query \text{Query} Query;
将
h D ( t ) h_{\mathcal D}^{(t)} hD(t)作为
Query \text{Query} Query的动机在于:我们主观想要了解
h D ( t ) h_{\mathcal D}^{(t)} hD(t)与各
[ h L ; j , h R ; ( T + 1 − j ) ] ( j = 1 , 2 , ⋯ , T ) \left[h_{\mathcal L;j},h_{\mathcal R;(\mathcal T + 1 -j)}\right](j=1,2,\cdots,\mathcal T) [hL;j,hR;(T+1−j)](j=1,2,⋯,T)之间的相关性信息。因而
h D ( t ) h_{\mathcal D}^{(t)} hD(t)是‘刻意信息’,而
[ h L ; j , h R ; ( T + 1 − j ) ] ( j = 1 , 2 , ⋯ , T ) \left[h_{\mathcal L;j},h_{\mathcal R;(\mathcal T + 1 -j)}\right](j=1,2,\cdots,\mathcal T) [hL;j,hR;(T+1−j)](j=1,2,⋯,T)是句子自身性质产生的‘无意信息’。
关于‘刻意信息’与‘无意信息’详见上一节
注意力机制基本介绍
执行过程:
详细执行过程见
深度学习笔记之
Seq2seq
\text{Seq2seq}
Seq2seq——注意力机制的执行过程
- 通过构建神经网络的方式对
Query
\text{Query}
Query和
Keys
\text{Keys}
Keys进行计算,得到注意力分数
E
t
\mathcal E_t
Et:
{ H B i = { [ h L ; j , h R ; ( T + 1 − j ) ] j = 1 T } T × 1 T O ~ t = W Attn ⋅ [ Concat ( h D ( t ) , H B i ) ] + b Attn O t = Tanh ( O ~ t ) E t = V T O t \begin{cases} \mathcal H_{Bi} = \left\{ [h_{\mathcal L;j},h_{\mathcal R;(\mathcal T + 1 - j)}]_{j=1}^\mathcal T \right\}^T_{\mathcal T \times 1} \\ \quad \\ \widetilde{\mathcal O}_t = \mathcal W_{\text{Attn}} \cdot \left[\text{Concat} \left(h_{\mathcal D}^{(t)},\mathcal H_{Bi}\right)\right] + b_{\text{Attn}} \\ \mathcal O_t = \text{Tanh}(\widetilde{\mathcal O}_t) \\ \mathcal E_t = \mathcal V^T \mathcal O_t \end{cases} ⎩ ⎨ ⎧HBi={[hL;j,hR;(T+1−j)]j=1T}T×1TO t=WAttn⋅[Concat(hD(t),HBi)]+bAttnOt=Tanh(O t)Et=VTOt - 使用
Softmax
\text{Softmax}
Softmax函数对注意力分数
E
t
\mathcal E_t
Et进行标准化,得到各时刻的注意力权重
(
Attention Weights
)
(\text{Attention Weights})
(Attention Weights):
S t = Softmax ( E t ) ⇒ S t = ( s t 1 , s s 2 , ⋯ , s t T ) T × 1 T \mathcal S_t = \text{Softmax}(\mathcal E_t) \Rightarrow \mathcal S_t = (s_{t1},s_{s2},\cdots,s_{t\mathcal T})_{\mathcal T \times 1}^T St=Softmax(Et)⇒St=(st1,ss2,⋯,stT)T×1T - 将注意力权重与编码器各时刻序列信息(此时将其视作
Values
\text{Values}
Values)执行内积操作,得到该时刻的
Context
\text{Context}
Context向量
C
t
\mathcal C_t
Ct:
C t = [ S t ] T H B i = ∑ j = 1 T s t j ⋅ [ h L ; j , h R ; ( T + 1 − j ) ] \begin{aligned} \mathcal C_t & = [\mathcal S_t]^T \mathcal H_{Bi} \\ & = \sum_{j=1}^{\mathcal T} s_{tj} \cdot [h_{\mathcal L;j},h_{\mathcal R;(\mathcal T + 1 - j)}] \end{aligned} Ct=[St]THBi=j=1∑Tstj⋅[hL;j,hR;(T+1−j)]
流程角度观察完全相同。只不过这里的 Keys,Values \text{Keys,Values} Keys,Values是相同信息。
注意力机制的泛化表示
将查询向量
Q
\mathcal Q
Q,
M
\mathcal M
M个键值对
{
(
K
j
,
V
j
)
}
j
=
1
M
\{(\mathcal K_j,\mathcal V_j)\}_{j=1}^{\mathcal M}
{(Kj,Vj)}j=1M映射到高维空间中:
{
Q
∈
R
q
K
j
∈
R
k
V
j
∈
R
v
\begin{cases} \mathcal Q \in \mathbb R^q \\ \mathcal K_j \in \mathbb R^k \\ \mathcal V_j \in \mathbb R^v \end{cases}
⎩
⎨
⎧Q∈RqKj∈RkVj∈Rv
对应的注意力输出可表示为:
f
[
Q
,
(
K
1
,
V
1
)
,
(
K
2
,
V
2
)
,
⋯
,
(
K
M
,
V
M
)
⏟
M
个
]
=
∑
j
=
1
M
α
(
Q
,
K
j
)
V
j
f \left[\mathcal Q,\underbrace{(\mathcal K_1,\mathcal V_1),(\mathcal K_2,\mathcal V_2),\cdots,(\mathcal K_{\mathcal M},\mathcal V_{\mathcal M})}_{\mathcal M个}\right] = \sum_{j=1}^{\mathcal M} \alpha(\mathcal Q,\mathcal K_j) \mathcal V_j
f
Q,M个
(K1,V1),(K2,V2),⋯,(KM,VM)
=j=1∑Mα(Q,Kj)Vj
其中
α
(
Q
,
K
j
)
\alpha(\mathcal Q,\mathcal K_j)
α(Q,Kj)表示注意力权重:
这仅是
Q
\mathcal Q
Q与编号为
j
j
j的
Keys
\text{Keys}
Keys的注意力权重,它的结果是一个标量;基于
Softmax
\text{Softmax}
Softmax函数范围内的标量
⇒
α
(
Q
,
K
j
)
∈
R
\Rightarrow \alpha(\mathcal Q,\mathcal K_j) \in \mathbb R
⇒α(Q,Kj)∈R
α
(
Q
,
K
j
)
=
Softmax
[
a
(
Q
,
K
j
)
]
=
exp
[
a
(
Q
,
K
j
)
]
∑
i
=
1
M
exp
[
a
(
Q
,
K
j
)
]
\begin{aligned} \alpha(\mathcal Q,\mathcal K_j) & = \text{Softmax} \left[a(\mathcal Q,\mathcal K_j)\right] \\ & = \frac{\exp \left[a(\mathcal Q,\mathcal K_j)\right]}{\sum_{i=1}^{\mathcal M} \exp \left[a(\mathcal Q,\mathcal K_j)\right]} \end{aligned}
α(Q,Kj)=Softmax[a(Q,Kj)]=∑i=1Mexp[a(Q,Kj)]exp[a(Q,Kj)]
同上,对应的
a
(
Q
,
K
j
)
a(\mathcal Q,\mathcal K_j)
a(Q,Kj)仅表示
Q
\mathcal Q
Q与编号为
j
j
j的
Keys
\text{Keys}
Keys的注意力分数。与注意力权重相同,它的结果同样是一个标量。
Softmax
\text{Softmax}
Softmax函数仅作为归一化作用,不改变数据格式:
a
(
Q
,
K
j
)
∈
R
a(\mathcal Q,\mathcal K_j) \in \mathbb R
a(Q,Kj)∈R
加性注意力机制
将注意力分数展开,可以得到如下形式:
a
(
Q
,
K
j
)
=
V
j
T
⋅
Tanh
(
W
K
;
j
⋅
K
j
+
W
Q
⋅
Q
)
a(\mathcal Q,\mathcal K_j) = \mathcal V_j^T \cdot \text{Tanh}(\mathcal W_{\mathcal K;j} \cdot \mathcal K_j + \mathcal W_\mathcal Q \cdot \mathcal Q)
a(Q,Kj)=VjT⋅Tanh(WK;j⋅Kj+WQ⋅Q)
对应神经网络结构表示如下:
当然,这仅仅是一项——
K
j
\mathcal K_j
Kj与
Q
\mathcal Q
Q的注意力分数。那么
M
\mathcal M
M个注意力分数并行计算,它的注意力分数表示为:
这里的
W K , W Q \mathcal W_{\mathcal K},\mathcal W_{\mathcal Q} WK,WQ做了分开表示:使用不同权重矩阵单独对
K , Q \mathcal K,\mathcal Q K,Q进行训练,并将各自神经元的输出分布对应元素相加;
更常见的像
Seq2seq \text{Seq2seq} Seq2seq中的表示方式:将
K , Q \mathcal K,\mathcal Q K,Q拼接起来(上图),使用一个权重矩阵
W \mathcal W W进行表示。这两种操作是等价的。
a ( Q , K ) = V T ⋅ Tanh ( W K ⋅ K + W Q ⋅ Q ) a(\mathcal Q,\mathcal K) = \mathcal V^T \cdot \text{Tanh}(\mathcal W_{\mathcal K} \cdot \mathcal K + \mathcal W_{\mathcal Q} \cdot \mathcal Q) a(Q,K)=VT⋅Tanh(WK⋅K+WQ⋅Q)
这种注意力机制的优势在于:即便 K j \mathcal K_j Kj与 Q \mathcal Q Q的大小(维数)不相同,并不影响注意力分数的计算。
缩放点积注意力机制
如果查询向量
Q
\mathcal Q
Q与
K
j
(
j
=
1
,
2
,
⋯
,
M
)
\mathcal K_j(j=1,2,\cdots,\mathcal M)
Kj(j=1,2,⋯,M)的大小(维数)相同:
这里的
d
d
d表示
Q
,
K
j
\mathcal Q,\mathcal K_j
Q,Kj的向量维数。
Q
,
K
j
∈
R
d
\mathcal Q,\mathcal K_j \in \mathbb R^{d}
Q,Kj∈Rd
那么可以使用缩放点积注意力机制
(
Scaled Dot-Product Attention
)
(\text{Scaled Dot-Product Attention})
(Scaled Dot-Product Attention)对注意力分数进行如下计算:
a
(
Q
,
K
j
)
=
⟨
Q
,
K
j
⟩
d
a(\mathcal Q,\mathcal K_j) = \frac{\left\langle\mathcal Q,\mathcal K_j \right\rangle}{\sqrt{d}}
a(Q,Kj)=d⟨Q,Kj⟩
其中
⟨
Q
,
K
j
⟩
\left\langle\mathcal Q,\mathcal K_j \right\rangle
⟨Q,Kj⟩表示向量
Q
,
K
j
\mathcal Q,\mathcal K_j
Q,Kj的内积。而除以
d
\sqrt{d}
d的操作的解释是:注意力分数结果对参数不是非常敏感。
关于这个解释, d d d是 Q , K j \mathcal Q,\mathcal K_j Q,Kj向量的维数,而向量内的信息除以 d \sqrt{d} d,只能想到它将注意力分数的解空间进行了一定程度的压缩/约束(正常情况下, d ≥ 1 \sqrt{d} \geq 1 d≥1,是不小的。谁闲着没事将一个很小的特征向量做这种注意力的复杂操作,不怕模型过拟合吗~)
\quad
如果有更好的解释方式,欢迎小伙伴评论区讨论。
在基于
Seq2seq
\text{Seq2seq}
Seq2seq注意力机制的动机中,我们介绍过内积求解注意力分数,它存在自身的优势:相比于加性注意力机制中神经网络产生的抽象特征,内积操作本身就有物理意义:描述向量
Q
,
K
j
\mathcal Q,\mathcal K_j
Q,Kj之间的相似度。
即便
Q
,
K
j
\mathcal Q,\mathcal K_j
Q,Kj大小不同,实际上依然不影响其执行内积操作。仅需要对其中一个向量乘以一个权重矩阵,使其拉成相同长度并执行内积,后续对该权重矩阵中的参数进行学习即可。这里并没有深挖关于该方向的信息,欢迎小伙伴交流讨论。
上述依然仅是单个向量 Q , K j \mathcal Q,\mathcal K_j Q,Kj的注意力分数,那么多个 Query,Keys \text{Query,Keys} Query,Keys可以得到一个矩阵:
场景构建:
- 查询向量
Q
\mathcal Q
Q内包含
N
N
N个
d
d
d维向量:
Q
∈
R
N
×
d
\mathcal Q \in \mathbb R^{N \times d}
Q∈RN×d;
查询向量也可以是多个。
- 键值对中的 Keys \text{Keys} Keys内依然包含 M \mathcal M M个向量信息: K ∈ R M × d \mathcal K \in \mathbb R^{\mathcal M \times d} K∈RM×d;
- 键值对中的
Values
\text{Values}
Values内包含与
Keys
\text{Keys}
Keys相同数量的向量信息:
V
∈
R
M
×
v
\mathcal V \in \mathbb R^{\mathcal M \times v }
V∈RM×v
上面提到:
K , V \mathcal K,\mathcal V K,V有可能相同,也有可能不同。这里描述的是‘不同’的情况。
对应的注意力分数表示如下:
a
(
Q
,
K
)
=
[
Q
K
T
d
]
N
×
M
a(\mathcal Q,\mathcal K) = \left[\frac{\mathcal Q\mathcal K^T}{\sqrt{d}} \right]_{N \times \mathcal M}
a(Q,K)=[dQKT]N×M
对应的注意力池化过程表示如下:
f
=
{
Softmax
[
a
(
Q
,
K
)
]
}
N
×
M
⋅
V
M
×
v
f
∈
R
N
×
v
f = \left\{\text{Softmax}[a(\mathcal Q,\mathcal K)]\right\}_{N \times \mathcal M} \cdot \mathcal V_{\mathcal M \times v} \quad f \in \mathbb R^{N \times v}
f={Softmax[a(Q,K)]}N×M⋅VM×vf∈RN×v
下一节将介绍自注意力机制 ( Self-Attention ) (\text{Self-Attention}) (Self-Attention)。
相关参考:
注意力分数【动手学深度学习v2】