简单描述

注意力机制(attention mechanism)说起来玄乎,其实就是根据某些 query 信息对 context 信息进行缩放,包括增强(即「注意力集中在这里」)或衰减。这里的 query 与 context 可以是相同的,举例来说:

  • 在回答问题时,根据「吃了什么」对「我今天在饭堂吃了包子,有点难吃」进行关注,结果聚焦在了「包子」。
  • 在生成句子时,根据「The policeman on the road is chasing a」对同一句话进行关注,结果聚焦在了「policeman」和「chasing」上。

以 context 为一维展开(例如文本)为例,假设 query 信息为向量 $q$,context 信息为矩阵 $X = [x_1, x_2, \cdots, x_k]$,$k$ 为 context 的长度。那么我们可以定义一个 attention score $s_i$ 为 query 与 context 的第 $i$ 个单元(例如单词)的注意力分数,该分数表示了 context 第 $i$ 个单元的信息对 query 的影响程度(可以理解为「关注程度」)。其计算可以有多种方式:

$$ \begin{aligned} s_i &= x_i^T q \\ s_i &= \frac{x_i^T q}{\sqrt{d}} \\ s_i &= x_i^T W q \\ &\cdots \\ \end{aligned} $$

然后我们使用 softmax 函数对 context 的所有 attention score 进行处理,得到注意力权重 attention weight $\alpha$:

$$ \alpha_i = \frac{e^{s_i}}{\sum_{j=1}^k e^{s_j}} $$

最后我们基于该注意力权重进行「focus」得到此时关注的信息 attention output $y$:

$$ y = \sum_{i = 1}^k \alpha_i x_i $$

各式变种

硬注意力(Hard Attention)

上一节描述的 attention 其实可以被称为软注意力(soft attention),其关注的是所有 context 信息在该 attention distribution 下的期望;与此相对应的还有一种硬注意力(hard attention),其只选择 context 中一个单元的信息,一般有两种实现方式:

  1. 将 soft attention 的最后一步替换为以 $\alpha$ 为概率分布进行随机采样;
  2. 去掉 softmax 层,直接取 $s$ 中的最大值对应的单元。

与 soft attention 相比,hard attention 无法反向传播,很少使用。

键值对注意力(Key-Value Attention)

上一节我们描述注意力机制为「根据某些 query 信息对 context 信息进行缩放」,其实可以将 context 再分为 key 和 value,我们基于 query 与 context key 计算 attention score,然后在 context value 上进行缩放关注,即为键值对注意力(key-value attention)。

多头注意力(Multi-Head Attention)

一个 query 可以聚焦 context 的部分信息,那么多个 query 就可以聚焦 context 的多个不同部分的信息。然后我们可以将这些提取出来的注意力输出 concat 起来,就是多头注意力(multi-head attention)。

自注意力(Self-Attention)

所谓自注意力(Self-Attention),就是上文中的 query、context key、context value 都是来自于同样的信息:

参考