首先对注意力机制而言,很重要的两个概念是Query和Values,注意力只有相对于特定的Query才有意义,这样才能够通过Query从Values中筛选出重要信息。
对于注意力模型来讲,可以分为三个阶段:
首先需要通过 α \alpha α 找到几个向量之间的相似度, 如下图所示,分别以 a 1 , a 2 , a 3 , a 4 a^1,a^2,a^3,a^4 a1,a2,a3,a4 作为query,根据其它的 a i a^i ai 关键词key求出相关度 α \alpha α:
关于这个 α \alpha α 的计算,主要有以下几种方式:
将其应用到self-attention中,求 α \alpha α 的过程如下图所示
在这里 q 1 q^1 q1 相当于查询内容, k 2 , k 3 , k 4 k^2,k^3,k^4 k2,k3,k4 相当于关键词,这里做点乘之后计算出的 α \alpha α 就是相似度。
这里使用的公式是这样的:
α i ′ = s o f t m a x ( f ( Q , K i ) d k ) \alpha_i'=softmax(\frac{f(Q,K_i)}{\sqrt{d_k}}) αi′=softmax(dkf(Q,Ki))
这里除以 d k \sqrt{d_k} dk 的作用:假设 Q , K 里的元素的均值为0,方差为 1,那么 A T = Q T K A^T=Q^TK AT=QTK 中元素的均值为 0,方差为 d。当 d 变得很大时, A 中的元素的方差也会变得很大,如果 A 中的元素方差很大(分布的方差大,分布集中在绝对值大的区域),在数量级较大时, softmax 将几乎全部的概率分布都分配给了最大值对应的标签,由于某一维度的数量级较大,进而会导致 softmax 未来求梯度时会消失【梯度消失为啥呢我没明白】。总结一下就是 softmax(A) 的分布会和d有关。因此 A 中每一个元素乘上 1 d k \frac{1}{\sqrt{d_k}} dk1 后,方差又变为 1,并且 A 的数量级也将会变小。
小补充:这里在运算的时候,全部是使用的矩阵运算,即 Q = q 1 q 2 q 3 q 4 Q=q^1q^2q^3q^4 Q=q1q2q3q4,这样就可以实现矩阵的并行运算,使用GPU大大提高运算效率。
得到Attention向量: A t t e n t i o n = ∑ i = 1 m α i ′ V i Attention=\sum_{i=1}^m \alpha_i'V_i Attention=∑i=1mαi′Vi
多头注意力机制在transformer中应用很多,以双头注意力机制为例:
双头注意力机制即将每个 q i q^i qi 分为两个,分别为 q i , 1 q^{i,1} qi,1 和 q i , 2 q^{i,2} qi,2 ,再分别对所有上标为1的进行计算得到 b i , 1 b^{i,1} bi,1,对 所有上标为2的进行计算得到 b i , 2 b^{i,2} bi,2。
之后对两个矩阵级联再与权重矩阵相乘,得到 b i b^i bi
多头注意力机制的好处在于把原始信息放入了多个子空间中,保证attention可以注意到不同子空间的信息, 捕捉到更加丰富的特征信息。
self-attention对于语言模型最大的缺陷在于 它没有编码位置信息,即便将输入的词汇序列改变,注意力机制仍然会在对应位置上赋予其相应的权重,所以self-attention是与位置没有关系的,此时就需要添加一些位置信息,添加方法也很简单,就是用简单的相加就可以:
X f i n a l _ e m b e d d i n g = E m b e d d i n g + P o s i t i o n a l E m b e d d i n g X_{final\_embedding}=Embedding+Positional Embedding Xfinal_embedding=Embedding+PositionalEmbedding
位置编码的公式如下:
P E p o s , 2 i = sin ( p o s / 1000 0 2 i / d m o d e l ) P E p o s , 2 i + 1 = cos ( p o s / 1000 0 2 i / d m o d e l ) PE_{pos,2i}=\sin (pos/10000^{2i/d_{model}})\\ PE_{pos,2i+1}=\cos (pos/10000^{2i/d_{model}}) PEpos,2i=sin(pos/100002i/dmodel)PEpos,2i+1=cos(pos/100002i/dmodel)
上面这组公式中, p o s pos pos 表示位置, i i i 表示维度, d m o d e l d_{model} dmodel 表示位置向量的向量维度, 2 i 2i 2i、 2 i + 1 2i+1 2i+1 表示的奇偶维度,偶数位置用 s i n sin sin,奇数位置用 c o s cos cos 函数。
由上面这个公式可以看到, P E PE PE 是一个绝对位置的编码,但事实上,它其中也蕴含了相对编码,下面进行说明:
首先我们知道三角函数的性质有:
sin ( α + β ) = sin α cos β + cos α sin β cos ( α + β ) = cos α cos β − sin α sin β \sin (\alpha+\beta)=\sin \alpha\cos\beta+\cos\alpha\sin\beta\\ \cos (\alpha+\beta)=\cos \alpha\cos\beta-\sin\alpha\sin\beta sin(α+β)=sinαcosβ+cosαsinβcos(α+β)=cosαcosβ−sinαsinβ
假设相对位置为 k k k ,那么位置编码的公式可以写成:
P E ( p o s + k , 2 i ) = P E ( p o s , 2 i ) × P E ( k , 2 i + 1 ) + P E ( p o s , 2 i + 1 ) × P E ( k . 2 i ) P E ( p o s + k , 2 i + 1 ) = P E ( p o s , 2 i + 1 ) × P E ( k , 2 i + 1 ) − P E ( p o s , 2 i ) × P E ( k . 2 i ) PE(pos+k,2i)=PE(pos,2i)\times PE(k,2i+1)+PE(pos,2i+1)\times PE(k.2i)\\ PE(pos+k,2i+1)=PE(pos,2i+1)\times PE(k,2i+1)-PE(pos,2i)\times PE(k.2i) PE(pos+k,2i)=PE(pos,2i)×PE(k,2i+1)+PE(pos,2i+1)×PE(k.2i)PE(pos+k,2i+1)=PE(pos,2i+1)×PE(k,2i+1)−PE(pos,2i)×PE(k.2i)
这样对于pos+k位置的位置向量某一维 2 i 2i 2i 或 2 i + 1 2i+1 2i+1 而言,可以表示为pos位置与k位置的位置向量的 2 i 2i 2i 与 2 i + 1 2i+1 2i+1 维的线性组合,这样的线性组合意味着位置向量中蕴含了相对位置信息。
某个单词的位置信息是其它单词位置信息的线性组合,这种线性组合就意味着位置向量中蕴含了相对位置信息。