Transformer中的attention的来龙去脉

论文原文Attention is all you need:
https://arxiv.org/pdf/1706.03762.pdf

参考的链接:
https://zhuanlan.zhihu.com/p/46990010
https://www.tensorflow.org/tutorials/text/transformer
https://segmentfault.com/a/1190000020021078
https://blog.csdn.net/mpk_no1/article/details/72862348

0 经典attention机制 generalized

以下均已翻译模型为例子:
attention涉及的变量主要分为三部分,编码层的输入变量 h i h_i hi,解码器隐层状态相当于系统当前时间 t t t状态 s t s_t st,以及对于 ( h 1 , h 2 , ⋯   , h T x ) (h_1,h_2, \cdots, h_{T_x}) (h1,h2,,hTx)这一输入的隐状态 z z z用来预测 t + 1 t+1 t+1时刻的 s s s

attention的计算总的来说分为三步

  1. 计算 s i s_i si h j h_j hj的适配程度(compatibility function),相似度
    f i j = F ( s i , h j ) f_{ij} = F(s_i,h_j) fij=F(si,hj)

  2. 归一化求出权重,通常使用softmax
    w i j = e f i j ∑ k = 1 T x e f i k w_{ij} = \frac {{\rm e}^{f_{ij}}} {\sum_{k=1}^{T_x} {\rm e}^{f_{ik}}} wij=k=1Txefikefij
    其中 T x T_x Tx为源语句长度。 h j h_j hj s i s_i si的相似度。

  3. 将对应的attettion分配给对应的value,并求和得到最终的输出值
    c i = ∑ j = 1 T x w i j ∗ h j c_i = \sum_{j=1}^{T_x} {w_{ij}*h_j} ci=j=1Txwijhj

1 attention的不同类型

其中根据不同的compatibility function,attention主要分为additive和dot-procduct两种

additive attention

f i j = F ( s i , h j ) = v T t a n h ( W [ s i h j ] ) = v T t a n h ( W 1 s i + W 2 h j ] ) f_{ij} = F(s_i,h_j)=v^Ttanh(W[s_i \quad h_j]) = v^Ttanh(W_1s_i+W_2h_j]) fij=F(si,hj)=vTtanh(W[sihj])=vTtanh(W1si+W2hj])

doc-product attention

f i j = F ( s i , h j ) = s i T h j f_{ij} = F(s_i,h_j)=s_i^Th_j fij=F(si,hj)=siThj
或者加入另外的参数矩阵(Multiplicative attention)
f i j = F ( s i , h j ) = s i T W h j f_{ij} = F(s_i,h_j)=s_i^TWh_j fij=F(si,hj)=siTWhj

这是transformer中解释的选择dot-product类型的原因
加性注意力和乘法注意力在复杂度上是相似的,但是乘法注意力在实践中往往要更快速、具有更高效的存储,因为它可以使用矩阵操作更高效地实现。两个变体在低维度 d k d_k dk 解码器状态中性能相似,但加性注意力机制在更高的维度上相对于没有scaled的乘法注意力性能更优,这也是scaled使用的原因。

2 self-attention

自己关注自己,没有额外信息输入,简言之 s s s h h h同源即可

3 key-value pairs attention

在self attention的基础上将 h j h_j hj拆分一个 k j k_j kj和对应的 v j v_j vj
【以下为原文的翻译】
注意力函数可视为将一个 q u e r y query query和一组 k e y − v a l u e key-value keyvalue pairs映射到 o u t p u t output output,其中 q u e r y query query, k e y s keys keys, v a l u e s values values, o u t p u t output output都是向量。 o u t p u t output output v a l u e s values values的加权和,其中的权重是由 q u e r y query query v a l u e value value对应的 k e y key key的"适配"函数(compatibility)得到的。
attention常见的有两种 additive attention 和 dot-product(multi-plicative)
总的来说,共分为三步

  1. 计算 k e y key key q u e r y query query的适配程度(compatibility function)
    F ( Q , K 1 ) , F ( Q , K 2 ) , ⋯   , F ( Q , K n ) F(Q,K_1),F(Q,K_2),\cdots,F(Q,K_n) F(Q,K1),F(Q,K2),,F(Q,Kn)
  2. softmax
    w i = e F ( Q , K i ) ∑ j = 1 n e F ( Q , K j ) w_i = \frac {{\rm e}^{F(Q,K_i)}} {\sum_{j=1}^n {\rm e}^{F(Q,K_j)}} wi=j=1neF(Q,Kj)eF(Q,Ki)
  3. 将对应的attettion分配给对应的value,并求和得到最终的输出值
    o u t p u t = ∑ i = 1 n w i ∗ V i output = {\sum_{i=1}^n w_i*V_i} output=i=1nwiVi

2 Scaled Dot-Product Attention

预定义 Q Q Q K K K的维度为 d k d_k dk, V V V的维度为 d v d_v dv。很容易理解,dot-product说明"适配"函数选取的是点乘,并且进一步scaled一下:
F ( Q , K ) = Q K T d k F(Q,K)=\frac {QK^T} {\sqrt {d_k}} F(Q,K)=dk QKT
分子 d k \sqrt {d_k} dk 在原文中有解释:
如上文所讲,对于较大的 d k {d_k} dk,点乘的值会增加,会使得进行softmax计算的时候偏移到梯度很小的地方,训练停滞。从统计学上来讲,对于均值为0和方差为1的独立变量 q q q k k k,他们的点乘 q k qk qk均值为0方差变为 d k d_k dk,除以 d k \sqrt {d_k} dk 之后,可以保证方差始终为1

你可能感兴趣的:(算法工程师面试,NLP,自然语言处理)