目录
1.简介
注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。上述机制通常被称为注意力机制
综上,注意力机制主要有两个方面:决定需要关注输入的哪部分;分配有限的信息处理资源给重要的部分。
在深度学习中,注意力可以借助重要性权重向量来实现:在预测或推断一个元素时,如图片中的像素点或句中的一个词,我们使用注意力向量来判断,它与其他元素有多强的关联性,然后对加权后的向量求和以逼近最后的目标值(target)。
2.注意力机制的诞生
注意力机制最早于2014年在计算机视觉中提出。但是本文的讨论以机器翻译任务上的seq2seq模型为例。
Seq2Seq模型: 将一个输入序列(source)转化为另一个序列(target),两个序列都可以是不定长的。
场景:
- 多语言机器翻译(文本或语音)
- 问答对话对话生成系统
- 将句子解析为语法树
结构:循环神经网络结构
- 编码器:处理序列输入并压缩信息到一个固定长度的上下文向量中。上下文向量被当做是输入序列的语义概要。
- 解码器:由上下文向量初始化,并每次产生一个转码输出。
源输入和目标输出的语义对齐问题由上下文向量学习和控制。上下文向量处理三方面的信息:
- 编码器的隐藏状态
- 解码器的隐藏状态
- 源输入和目标输出的对齐
缺点: 固定长度上下文向量无法记忆长句子。
解决方法: 提出注意力机制(Bahdanau 2015)。注意力机制考虑了上下文向量和所有序列输入的信息,构建了“连接”。每一个输出元素下的连接的权重都是自动学习的。上下文向量已经考虑了整体输入序列信息,不需要担心遗忘的问题。
3.不同类别的计算原理
计算步骤:
- 在所有输入信息上计算注意力分布
- 根据注意力分布来计算输入信息的加权平均
3.1.普通模式注意力
定义:
- 和任务有关的查询向量
- 注意力变量表示被选择信息的索引位置。即表示选择了第个输入信息
- 在给定和下,选择第个输入信息的概率称为注意力分布(Attention Distribution)
- 为注意力打分函数
计算注意力分布:
注意力打分函数:
- 加性模型
- 点积模型
- 缩放点积模型
- 双线性模型
其中,为可学习的网络参数,为输入信息的维度。
理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以更好地利用矩阵乘积,从而计算效率更高。但当输入信息的维度比较高,点积模型的值通常有比较大方差,从而导致softmax函数的梯度会比较小。因此,缩放点积模型可以较好地解决这个问题。双线性模型可以看做是一种泛化的点积模型。假设,双线性模型可以写为,即分别对和进行线性变换后计算点积。相比点积模型,双线性模型在计算相似度时引入了非对称性。
加权平均:
注意力分布可以解释为在给定任务相关的查询时,第个信息受关注的程度。
3.1.1.软性注意力
我们采用一种“软性”的信息选择机制对输入信息进行汇总,其选择的信息是所有输入信息在注意力分布下的期望。
注意: 上面这个公式,被称为软性注意力机制(Soft Attention Mechanism)。
3.1.2.硬性注意力
只关注到某一个位置上的信息。
实现方式1: 选取最高概率的输入信息
实现方式2: 在注意力分布式上随机采样
缺点: 基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布之间的函数关系不可导,无法使用在反向传播算法进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。
3.2.键值对模式:键值对注意力
用键值对(key-value pair)格式来表示输入信息,其
中“键”用来计算注意力分布,“值”用来计算聚合信息。
- 个输入信息:
- 给定任务相关的查询向量
- 为打分函数
注意力函数为:
注意: 当时,键值对模式就等价于普通的注意力机制。
3.3.多头注意力(Multi-Head Attention)
利用多个查询,来平行地计算从输入信息中选取多个信息。每个注意力关注输入信息的不同部分。
其中,表示向量拼接。
3.4.结构化注意力
要从输入信息中选取出和任务相关的信息,主动注意力是在所有输入信息上的多项分布,是一种扁平(flat)结构。
如果输入信息本身具有层次(hierarchical)结构,比如文本可以分为词、句子、段落、篇章等不同粒度的层次,我们可以使用层次化的注意力来进行更好的信息选择[Yang et al., 2016]。
此外,还可以假设注意力上下文相关的二项分布,用一种图模型来构建更复杂的结构化注意力分布[Kim et al., 2017]。
4.应用
注意力机制一般可以用作一个神经网络中的组件。
4.1.指针网络
注意力机制主要是用来做信息筛选,从输入信息中选取相关的信息。
注意力机制可以分为两步:一是计算注意力分布,二是根据来计算输入信息的加权平均。
我们可以只利用注意力机制中的第一步,将注意力分布作为一个软性的指针(pointer) 来指出相关信息的位置。
指针网络(Pointer Network)[Vinyals et al., 2015] 是一种序列到序列模型。
输入是长度为的向量序列
输出是输入序列的下标/索引序列,其中。
比如下图中,输入为20, 5, 10,输出为1, 3, 2。
条件概率
其中,条件概率可以通过注意力分布来计算。
假设用一个循环神经网络对进行编码得到向量,则
其中,为可学习的参数,为在解码过程的第步时,每个输入向量的未归一化的注意力分布。
其实我有点没看懂……
4.2.自注意力模型
当使用神经网络来处理一个变长的向量序列时,通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列。它们是一种局部的编码方式,只建模了输入信息的局部依赖关系。
虽然循环网络理论上可以建立长距离依赖关系,但是由于信息传递的容量以及梯度消失问题,实际上也只能建立短距离依赖关系。
建立输入序列之间的长距离依赖关系:
- 增加网络的层数,通过一个深层网络来获取远距离的信息交互
- 使用全连接网络。全连接网络是一种非常直接的建模远距离依赖的模型,但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(Self-Attention Model)。
计算原理:
输入序列
输出序列
- 首先,通过线性变换得到三组向量序列:
,为查询向量序列
,为键向量序列
,为值向量序列
其中,分别为可学习的参数矩阵。 - 计算输出向量:
其中为输出和输入向量序列的位置,连接权重由注意力机制动态生成。
如果使用缩放点积来作为注意力打分函数,输出向量序列可以写为
评价:
自注意力模型可以作为神经网络中的一层来使用,有效地建模长距离依赖问题。既可以用来替换卷积层和循环层[Vaswani et al., 2017],也可以和它们一起交替使用[Shen et al., 2018](比如可以是卷积层或循环层的输出)。
自注意力模型计算的权重只依赖和的相关性,而忽略了输入信息的位置信息。因此在单独使用时,自注意力模型一般需要加入位置编码信息来进行修正[Vaswani et al., 2017]。
参考
https://www.jianshu.com/p/c9490f9e59ba
https://blog.csdn.net/joshuaxx316/article/details/70665388
https://www.jianshu.com/p/9b922fb83d77
https://blog.csdn.net/tg229dvt5i93mxaq5a6u/article/details/78422216