深度学习(8)Attention

Attention-注意力机制

注意力机制

如何理解attention中的Q,K,V? - 林亿的回答 - 知乎 https://www.zhihu.com/question/298810062/answer/2274132657

Self-attention中dot-product操作为什么要被缩放:https://www.zhihu.com/question/339723385/answer/782509914

一、注意力机制是什么

假设有一天热爱绘画的你决定去户外写生,你来到一片山坡上,极目远去,心旷神怡。头顶一片蔚蓝,脚踩一席草绿,远处山川连绵,眼前花草送香,暖阳含羞云后,轻风拂动衣襟,鸟啼虫鸣入耳,美景丹青共卷。

你集中精神,拿起画笔将蓝天、白云、青草等等这些元素,按照所思所想纷纷绘入画板。在绘画的过程中,你会持续地关注你构思到画板上的元素(比如蓝天,白云),而不会太多关注那些其他的元素,比如风,虫鸣,阳光等等。即你的精神是聚焦在你关心的那些事物上,这其实就是注意力的体现,这种有意识的聚焦被称为聚焦式注意力(Focus Attention)。

在深度学习领域,模型往往需要接收和处理大量的数据,然而在特定的某个时刻,往往只有少部分的某些数据是重要的,这种情况就非常适合Attention机制发光发热。

image-20220529190526010

举个例子,上图展示了一个机器翻译的结果,在这个例子中,我们想将”who are you”翻译为”你是谁”,传统的模型处理方式是一个seq-to-seq的模型,其包含一个encoder端和一个decoder端,其中encoder端对”who are you”进行编码,然后将整句话的信息传递给decoder端,由decoder解码出”我是谁”。在这个过程中,decoder是逐字解码的,在每次解码的过程中,如果接收信息过多,可能会导致模型的内部混乱,从而导致错误结果的出现。

我们可以使用Attention机制来解决这个问题,从图中可以看到,在生成”你”的时候和单词”you”关系比较大,和”who are”关系不大,所以我们更希望在这个过程中能够使用Attention机制,将更多注意力放到”you”上,而不要太多关注”who are”,从而提高整体模型的表现。

备注:在深度学习领域,无意识的显著性注意力更加常见。

Attention机制自提出以来,出现了很多不同Attention应用方式,但大道是共同的,均是将模型的注意力聚焦在重要的事情上。本文后续将选择一些经典或常用的Attention机制展开讨论。

二、经典注意力机制

2.1 用机器翻译任务带你看Attention机制的计算

单独地去讲Attention机制会有些抽象,也有些枯燥,所以我们不妨以机器翻译任务为例,通过讲解Attention机制在机器翻译任务中的应用方式,来了解Attention机制的使用。

什么是机器翻译任务?以中译英为例,机器翻译是将一串中文语句翻译为对应的英文语句,如图1所示。

image-20220529201640683

图1展示了一种经典的机器翻译结构Seq-to-Seq, 并且向其中添加了Attention计算。Seq-to-Seq结 构包含两个部分:Encoder和Decoder。其中Encoder用于将中文语句进行编码, 这些编码后续将提 供给Decoder进行使用; Decoder将根据Encoder的数据进行解码。我们还是以图1为例详细解释一 下Decoder的解码过程。 更明确的讲, 图1展示的是生成单词"machine"时的计算方式。首先将前一个时刻的输出状态 \(q_{2}\) 和 Encoder的输出 \(h=\left[h_{1}, h_{2}, h_{3}, h_{4}\right]\) 进行Attention计算, 得到一个当前时刻的 context, 用公式可 以这样组织: \[ \begin{aligned} {\left[a_{1}, a_{2}, a_{3}, a_{4}\right] } &=\operatorname{softmax}\left(\left[s\left(q_{2}, h_{1}\right), s\left(q_{2}, h_{2}\right), s\left(q_{2}, h_{3}\right), s\left(q_{2}, h_{4}\right)\right]\right) \\ \text { context } &=\sum_{i=1}^{4} a_{i} \cdot h_{i} \end{aligned} \] 我们来解释一下, 这里的 \(s\left(q_{i}, h_{j}\right)\) 表示注意力打分函数, 它是个标量, 其大小描述了当前时刻在这 些Encoder的结果上的关注程度, 这个函数在后边会展开讨论。然后用softmax对这个结果进行归一 化, 最后使用加权评价获得当前时刻的上下文向量 context。这个context 可以解释为:截止到当前 已经有了"I love", 在此基础上下一个时刻应该更加关注源中文语句的那些内容。这就是关于 Attention机制的一个完整计算。

最后, 将这个context和上个时刻的输出”love"进行融合作为当前时刻RNN单元的输入。图1中采用了继续融合上一步的输出结果, 例如上述描述中融合了"love", 在有些实现中, 并没 有融入这个上一步的输出, 默认 \(q_{2}\) 中已经携带了"love"的信息, 这也是合理的。

2.2 注意力机制的正式引入

前边我们通过机器翻译任务介绍了Attention机制的整体计算。但是还有点小尾巴没有展开,就是那个注意力打分函数的计算,现在我们将来讨论这个事情。但在讲这个函数之前,我们先来对上边的Attention机制的计算做个总结,图2详细地描述了Attention机制的计算原理。

image-20220529202937945

假设现在我们要对一组输入 \(H=\left[h_{1}, h_{2}, h_{3}, \ldots, h_{n}\right]\) 使用Attention机制计算重要的内容, 这里往 往需要一个查询向量 \(q\) (这个向量往往和你做的任务有关, 比如机器翻译中用到的那个 \(q_{2}\) ), 然后通 过一个打分函数计算查询向量 \(q\) 和每个输入 \(h_{i}\) 之间的相关性, 得出一个分数。接下来使用softmax 对这些分数进行归一化, 归一化后的结果便是查询向量 \(q\) 在各个输入 \(h_{i}\) 上的注意力分布\(a=\left[a_{1}, a_{2}, a_{3}, \ldots, a_{n}\right]\), 其中每一项数值和原始的输入\(H=\left[h_{1}, h_{2}, h_{3}, \ldots, h_{n}\right]\) 一一对应。以 \(a_{i}\) 为例, 相关计算公式如下: \[ a_{i}=\operatorname{softmax}\left(s\left(h_{i}, q\right)\right)=\frac{\exp \left(s\left(h_{i}, q\right)\right)}{\sum_{j=1}^{n} \exp \left(s\left(h_{j}, q\right)\right)} \] 最后根据这些注意力分布可以去有选择性的从输入信息 \(H\) 中提取信息, 这里比较常用的信息提取方式, 是一种”软性”的信息提取(图2展示的就是一种"软性"注意力), 即根据注意力分布对输入信 息进行加权求和,最终的这个结果 context 体现了模型当前应该关注的内容: \[ \text { context }=\sum_{i=1}^{n} a_{i} \cdot h_{i} \] 现在我们来解决之前一直没有展开的小尾巴-打分函数, 它可以使用以下几种方式来计算: - 加性模型: \(s(h, q)=v^{T} \tanh (W h+U q)\) - 点积模型: \(s(h, q)=h^{T} q\) - 缩放点积模型: \(s(h, q)=\frac{h^{T} q}{\sqrt{D}}\) - 双线性模型: \(s(h, q)=h^{T} W q\)

以上公式中的参数 \(W 、 U\)\(v\) 均是可学习的参数矩阵或向量, \(D\) 为输入向量的维度。下边我们来分 析一下这些分数计算方式的差别。

加性模型引入了可学习的参数, 将查询向量 \(q\) 和原始输入向量 \(h\) 映射到不同的向量空间后进行计算打分, 显然相较于加性模型, 点积模型具有更好的计算效率。

另外, 当输入向量的维度比较高的时候, 点积模型通常有比较大的方差, 从而导致Softmax函数的 梯度会比较小。因此缩放点积模型通过除以一个平方根项来平滑分数数值, 也相当于平滑最终的注意力分布, 缓解这个问题。

最后, 双线性模型可以重塑为 \(s\left(h_{i}, q\right)=h^{T} W q=h^{T}\left(U^{T} V\right) q=(U h)^{T}(V q)\), 即分别对查询向量 \(q\) 和原始输入向量 \(h\) 进行线性变换之后, 再计算点积。相比点积模型, 双线性模型在计算相似度时 引入了非对称性