深度学习笔记之Transformer(二)关于注意力分数的总结

深度学习笔记之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=1Nj=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=1Nα(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∣∣xx(j)2}=i=1Nj=1Nκ(x,x(j))κ(x,x(i))y(i)=i=1NSoftmax[2σ21∣∣xx(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∣∣xx(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∣∣xx(i)2。我们将这部分函数的结果称作注意力分数 ( Attention Score ) (\text{Attention Score}) (Attention Score)
很明显,注意力分数是指没有被‘标准化’ ( Normalization ) (\text{Normalization}) (Normalization)的;描述样本/向量间的‘纯粹的信息’。

使用流程图来描述上述过程:
深度学习笔记之Transformer(二)关于注意力分数的总结_第1张图片

再回首: 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+1j)](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(t1),这里用 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+1j)](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+1j)](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+1j)]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=1Tstj[hL;j,hR;(T+1j)]

流程角度观察完全相同。只不过这里的 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} QRqKjRkVjRv
对应的注意力输出可表示为:
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=1Mα(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)=VjTTanh(WK;jKj+WQQ)
对应神经网络结构表示如下:
深度学习笔记之Transformer(二)关于注意力分数的总结_第2张图片
当然,这仅仅是一项—— 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)=VTTanh(WKK+WQQ)

这种注意力机制的优势在于:即便 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,KjRd
那么可以使用缩放点积注意力机制 ( 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} QRN×d
    查询向量也可以是多个。
  • 键值对中的 Keys \text{Keys} Keys内依然包含 M \mathcal M M个向量信息: K ∈ R M × d \mathcal K \in \mathbb R^{\mathcal M \times d} KRM×d
  • 键值对中的 Values \text{Values} Values内包含与 Keys \text{Keys} Keys相同数量的向量信息: V ∈ R M × v \mathcal V \in \mathbb R^{\mathcal M \times v } VRM×v
    上面提到: K , V \mathcal K,\mathcal V K,V有可能相同,也有可能不同。这里描述的是‘不同’的情况。

对应的注意力分数表示如下:
其中注意力分数 a ( Q , K ) a(\mathcal Q,\mathcal K) a(Q,K)所描述的 N × M N \times \mathcal M N×M矩阵中,每一个元素均是 Q \mathcal Q Q中某向量于 K \mathcal K K中某向量的内积 ( ( (相似性 ) ) )结果。
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)=[d QKT]N×M
对应的注意力池化过程表示如下:
这里的 Softmax \text{Softmax} Softmax是对 a ( Q , K ) a(\mathcal Q,\mathcal K) a(Q,K)中各行 N × 1 N \times 1 N×1元素做归一化。
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×MVM×vfRN×v

下一节将介绍自注意力机制 ( Self-Attention ) (\text{Self-Attention}) (Self-Attention)

相关参考:
注意力分数【动手学深度学习v2】

你可能感兴趣的:(深度学习,深度学习,transformer,注意力分数总结,加性注意力机制,缩放点积注意力机制)