前情提要🤓:
在NLP领域早期引入注意力机制的是论文Neural Machine Translation by Jointly Learning to Align and Translate,通过引入对齐这一思想,将软注意力(通过应用注意力权重)机制添加到解码器中,使文本翻译能够更好地在源语言和目标语言上对齐,从而提高翻译性能。

传统注意力机制

首先对于这个 Seq2Seq 模型,其编码器解码器都基于RNN,将注意力添加在解码器时,它接受 $t$ 时间步的RNN的隐藏层输出 $h_t$ 和所有编码器的隐藏层向量 $hs$

使用目前最经常说的 $QKV$ 模式来说,$t$ 时间步的RNN的隐藏层输出 $h_t$ 就可以看做一个查询向量 $q$,它要去查询编码器向量中哪个向量与自己的相关性最高,那么 $q$ 要查询的对象就是 $hs$($K$)

通过计算得到注意力权重 $\alphan$ 后,再将 $hs$ 与 $\alpha_n$ 加权求和最终得到上下文向量 $c_t$(此时并没有用到 $V$,在键值对注意力中将 $(k{1…n},v{1…n})$ 作为输入,则加权求和时使用的就是 $v$ ,这里的输入可以简单视为 $(k{1…n})$,关于注意力的详细介绍与键值对注意力具体可见:关于注意力机制的详细理解与公式介绍

这个上下文向量就包含了对输入源语言序列的全局理解与加权信息(可以判断自己与源序列哪里更相关),从而为生成目标语言提供更好的依据

简单来说就是,走到当前需要输出某个翻译出来的词的时间步时,经过RNN处理的 $h_t$ 去编码器里的所有隐藏向量里都看一下对比一下,根据全局比较和集中注意生成一个上下文向量,这个上下文向量包含了与之最相关的源语言信息,其主要来源于源语言序列(例如,待翻译的英文句子)的编码器隐藏状态,这意味着每个上下文向量都专注于源语言中与当前解码步骤最相关的部分

自注意力机制

与传统注意力机制对应的,对于自注意力机制而言,上下文向量则是包含了与自身序列的上下文最相关的信息,上下文向量来源于同一序列内部的不同位置,这使得每个输出向量不仅包含了自身的信息,还融合了与其相关的其他位置的信息,从而实现对整个序列的全局理解

假设有一个输入序列 $X=[x{1…n}]$,每一个向量 $x_i$ 都向整个序列($k$)去发出查询($q$),得到一系列的注意力权重 $\alpha{ni}$,再将其与输入序列对应的值向量 $v$ 加权求和,最后得到一系列的上下文向量 $c_{tn}$

这里有一个问题,就是为什么需要有一个与 $k$ 不同的 $v$ 向量来进行加权求和,而不是继续使用 $k$,这也是一道比较常见的面试题了,挖个坑以后回来补

接下来我们来看自注意力的具体计算过程:

输入序列 $X=[x{1…N}] \in \mathbb{R}^{D_x \times N}$,输出序列 $H=[h{1…N}] \in \mathbb{R}^{D_v \times N}$
有三个线性变换矩阵 $W_q,W_k,W_v$
将输入序列 $X$ 分别与 $W_q,W_k,W_v$ 矩阵进行线性变换:

$QKV$ 矩阵分别是由查询向量,键向量与值向量构成的矩阵

对于每一个查询向量 $q_n \in Q$,利用键值对注意力机制的计算:

其中 $score$ 为注意力打分函数

如果使用缩放点积注意力,则输出 $H$ 可简单表示为:

其中 $\text{softmax}(\cdot)$ 为按列归一化的函数

自注意力计算的权重 $a_{ij}$ 只依赖于 $q_i$ 和 $k_j$ 的相关性,而忽略了输入信息的位置信息,因此在单独使用时需要引入位置编码信息进行修正(Transformer),自注意力也可以扩展为多头自注意力,在多个不同的投影空间中捕捉不同的交互信息