1. 注意力机制是什么
假设有一天热爱绘画的你决定去户外写生,你来到一片山坡上,极目远去,心旷神怡。头顶一片蔚蓝,脚踩一席草绿,远处山川连绵,眼前花草送香,暖阳含羞云后,轻风拂动衣襟,鸟啼虫鸣入耳,美景丹青共卷。
你集中精神,拿起画笔将蓝天、白云、青草等等这些元素,按照所思所想纷纷绘入画板。在绘画的过程中,你会持续地关注你构思到画板上的元素(比如蓝天,白云),而不会太多关注那些其他的元素,比如风,虫鸣,阳光等等。即你的精神是聚焦在你关心的那些事物上,这其实就是注意力的体现,这种有意识的聚焦被称为聚焦式注意力(Focus Attention)。
然而,正当你在画板上忘我倾洒的时侯,突然有人在背后喊你的名字,你立马注意到了,然后放下画笔,转头和来人交谈。这种无意识地,往往由外界刺激引发的注意力被称为显著性注意力(Saliency-Based Attention)。
但不论哪一种注意力,其实都是让你在某一时刻将注意力放到某些事物上,而忽略另外的一些事物,这就是注意力机制(Attention Mechanism)。
在深度学习领域,模型往往需要接收和处理大量的数据,然而在特定的某个时刻,往往只有少部分的某些数据是重要的,这种情况就非常适合Attention机制发光发热。
图2 机器翻译任务
举个例子,图2展示了一个机器翻译的结果,在这个例子中,我们想将"who are you"翻译为"你是谁",传统的模型处理方式是一个seq-to-seq的模型,其包含一个encoder端和一个decoder端,其中encoder端对"who are you"进行编码,然后将整句话的信息传递给decoder端,由decoder解码出"我是谁"。在这个过程中,decoder是逐字解码的,在每次解码的过程中,如果接收信息过多,可能会导致模型的内部混乱,从而导致错误结果的出现。
我们可以使用Attention机制来解决这个问题,从图2可以看到,在生成"你"的时候和单词"you"关系比较大,和"who are"关系不大,所以我们更希望在这个过程中能够使用Attention机制,将更多注意力放到"you"上,而不要太多关注"who are",从而提高整体模型的表现。
备注:在深度学习领域,无意识的显著性注意力更加常见。
Attention机制自提出以来,出现了很多不同Attention应用方式,但大道是共同的,均是将模型的注意力聚焦在重要的事情上。本文后续将选择一些经典或常用的Attention机制展开讨论。
2. 经典注意力机制
2.1. 用机器翻译任务来看Attention机制的计算
单独地去讲Attention机制会有些抽象,也有些枯燥,所以不妨以机器翻译任务为例,通过讲解Attention机制在机器翻译任务中的应用方式,来了解Attention机制的使用。
什么是机器翻译任务?以中译英为例,机器翻译是将一串中文语句翻译为对应的英文语句,如图1所示。
图3 机器翻译示例图
图3展示了一种经典的机器翻译结构Seq-to-Seq,并且向其中添加了Attention计算。Seq-to-Seq结构包含两个部分:Encoder和Decoder。其中Encoder用于将中文语句进行编码,这些编码后续将提供给Decoder进行使用;Decoder将根据Encoder的数据进行解码。
还是以上图3为例详细解释一下Decoder的解码过程。
更明确的讲,图3展示的是生成单词"machine"时的计算方式。首先将前一个时刻的输出状态
我们来解释一下,这里的
最后,将这个
图3中采用了继续融合上一步的输出结果,例如上述描述中融合了"love",在有些实现中,并没有融入这个上一步的输出,默认
中已经携带了"love"的信息,这也是合理的。
2.2. 注意力机制的正式引入
前边我们通过机器翻译任务介绍了Attention机制的整体计算。但是还有点小尾巴没有展开,就是那个注意力打分函数的计算,现在我们将来讨论这个事情。但在讲这个函数之前,我们先来对上边的Attention机制的计算做个总结,图4详细地描述了Attention机制的计算原理。
<center>图4 Attention机制图</center>
假设现在我们要对一组输入
最后根据这些注意力分布可以去有选择性的从输入信息
现在我们来解决之前一直没有展开的小尾巴-打分函数,它可以使用以下几种方式来计算:
- 加性模型:
- 点积模型:
- 缩放点积模型:
- 双线性模型:
以上公式中的参数
加性模型引入了可学习的参数,将查询向量
另外,当输入向量的维度比较高的时候,点积模型通常有比较大的方差,从而导致Softmax函数的梯度会比较小。因此缩放点积模型通过除以一个平方根项来平滑分数数值,也相当于平滑最终的注意力分布,缓解这个问题。
最后,双线性模型可以重塑为
3. 注意力机制的一些变体
3.1. 硬性注意力机制
在经典注意力机制章节使用了一种软性注意力的方式进行Attention机制,它通过注意力分布来加权求和融合各个输入向量。
而硬性注意力(Hard Attention)机制则不是采用这种方式,它是根据注意力分布选择输入向量中的一个作为输出。这里有两种选择方式:
- 选择注意力分布中,分数最大的那一项对应的输入向量作为Attention机制的输出。
- 根据注意力分布进行随机采样,采样结果作为Attention机制的输出。
硬性注意力通过以上两种方式选择Attention的输出,这会使得最终的损失函数与注意力分布之间的函数关系不可导,导致无法使用反向传播算法训练模型,硬性注意力通常需要使用强化学习来进行训练。因此,一般深度学习算法会使用软性注意力的方式进行计算,
3.2. 键值对注意力机制
假设我们的输入信息不再是前边所提到的
当计算出在输入数据上的注意力分布之后,利用注意力分布和键值对中的对应值进行加权融合计算:
显然,当键值相同的情况下
3.3. 多头注意力机制
多头注意力(Multi-Head Attention)是利用多个查询向量
假设
最终将所有查询向量的结果进行拼接作为最终的结果:
公式里的