注意力机制的一些变体
1. 硬性注意力机制
在经典注意力机制章节我们使用了一种软性注意力的方式进行Attention机制,它通过注意力分布来加权求和融合各个输入向量。而硬性注意力(Hard Attention)机制则不是采用这种方式,它是根据注意力分布选择输入向量中的一个作为输出。这里有两种选择方式:
-
选择注意力分布中,分数最大的那一项对应的输入向量作为Attention机制的输出。
-
根据注意力分布进行随机采样,采样结果作为Attention机制的输出。
硬性注意力通过以上两种方式选择Attention的输出,这会使得最终的损失函数与注意力分布之间的函数关系不可导,导致无法使用反向传播算法训练模型,硬性注意力通常需要使用强化学习来进行训练。因此,一般深度学习算法会使用软性注意力的方式进行计算,
2. 键值对注意力机制
假设我们的输入信息不再是前边所提到的\[H = \left[ {h\_1,h\_2,h\_3,...,h\_n} \right]\] 而是更为一般的键值对(key-value pair)形式 (K,V)=[(k1,v1),(k2,v2),...,(kn,vn)](K,V)=[(k1,v1),(k2,v2),...,(kn,vn)] ,相关的查询向量仍然为 qq。这种模式下,一般会使用查询向量 qq和相应的键 kiki进行计算注意力权值 aiai。
当计算出在输入数据上的注意力分布之后,利用注意力分布和键值对中的对应值进行加权融合计算:
\[context = \sum\limits_{i = 1}^n {{a_i}} \cdot {v_i}\]
显然,当键值相同的情况下\[k = v\],键值对注意力就退化成了普通的经典注意力机制。
3. 多头注意力机制
多头注意力(Multi-Head Attention)是利用多个查询向量 Q=[q1,q2,...,qm]Q=[q1,q2,...,qm],并行地从输入信息\[\left( {K,V} \right) = \left[ {\left( {k\_1,v\_1} \right),\left( {k\_2,v\_2} \right),...,\left( {k\_n,v\_n} \right)} \right]\]中选取多组信息。在查询过程中,每个查询向量 qiqi 将会关注输入信息的不同部分,即从不同的角度上去分析当前的输入信息。
假设 aijaij代表第 ii 各查询向量 qiqi 与第 jj 个输入信息 kjkj 的注意力权重, contexticontexti 代表由查询向量qiqi计算得出的Attention输出向量。其计算方式为:
\[\begin{array}{*{20}{l}}
{{a_{ij}} = softmax(s({k_j},{q_i}))}&{ = \frac{{exp(s({k_j},{q_i}))}}{{\sum\limits_{t = 1}^n e xp(s({k_t},{q_i}))}}}\\
{contex{t_i}}&{ = \sum\limits_{j = 1}^n {{a_{ij}}} \cdot {v_j}}
\end{array}\]
最终将所有查询向量的结果进行拼接作为最终的结果:
\[context = contex{t_1} \oplus contex{t_2} \oplus contex{t_3} \oplus ... \oplus contex{t_m}\]
公式里的 \[ \oplus \]表示向量拼接操作。