前言:Attention是很多内容的重点,因此需要详细了解一下 Attention 的内部逻辑,一般情况attention分为很多种类型,不同的技术涉及不同类型,这里单介绍Attention的基本逻辑。
资料:
- Attention is All You Need:Attention Is All You Need
- 基础介绍:https://zhuanlan.zhihu.com/p/53036028
- 视频介绍:https://www.bilibili.com/video/BV1Ff4y187nr?p=1&vd_source=f27f081fc77389ca006fcebf41bede2d
一、什么是注意力机制?
Attention(注意力)机制如果浅层的理解,核心逻辑就是**「从关注全部到关注重点」**。
案例辅助理解:
- Attention 机制很像人类看图片的逻辑,当我们看一张图片的时候,我们并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。视觉系统就是一种Attention机制,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。
- 销售在销售东西的时候,不同角色关注到的重点不一样。

Attention 机制最早是在计算机视觉里应用的,随后在 NLP 领域也开始应用了,真正发扬光大是在 NLP 领域,因为 2018 年 BERT 和 GPT 的效果出奇的好,进而走红。而 Transformer 和 Attention 这些核心开始被大家重点关注。

补充:关于理解attention和人类生存机制的关联关系

二、注意力机制结构
Attention机制跟人类翻译文章时候的思路有些类似,即将注意力关注于我们翻译部分对应的上下文。同样的,Attention模型中,当我们翻译当前词语时,我们会寻找源语句中相对应的几个词语,并结合之前的已经翻译的部分作出相应的翻译,如上图所示,当我们翻译“knowledge”时,只需将注意力放在源句中“知识”的部分,当翻译“power”时,只需将注意力集中在"力量“。这样,当我们decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。



Attention运算阶段:


- 阶段一:query 和 key 进行相似度计算,得到权值系数;
- 阶段二:将权值进行归一化,得到直接可用的权重
- 阶段三:将权重和 value 进行加权求和,具体见下:

Attention 机制听起来高大上,其关键就是学出一个权重分布,然后作用在特征上。如图片描述任务:给你一张图片,请输出一句话去描述它。一般会用 CNN 来对图片进行特征提取,Decoder 部分使用 RNN 或者 LSTM 来输出描述语句。此时如果加入注意力机制,能够大大改善输出效果。


- 这个权重可以保留所有的分量,叫加权(Soft Attention),也可以按某种采样策略选取部分分量(Hard Attention)。
- 这个权重可以作用在原图上,如目标物体检测;也可以作用在特征图上,如 Image-Caption;
- 这个权重可以作用在空间尺度上,也可以作用于 Channel 尺度上,给不同通道的特征加权;
- 这个权重可以作用在不同时刻上,如机器翻译
三、Attention分类
Attention 有很多种不同的类型:Soft Attention、Hard Attention、静态Attention、动态Attention、Self Attention 等等。不同的技术模型会运用到不同的Attention类型,如transorformer用的是Self Attention,这里不深入。
下面按照计算区域,所用信息,使用模型,模型结构,权值计算方式来解释一下这些不同的Attention的概念。

-
按计算区域划分
- soft-attention:对所有key求相似度权重,每个key都有一个对应的权重,是一种全局的计算方式(也叫Global Attention)。优点是这种方式考虑全面,参考了所有key的内容,再进行加权。缺点是计算量较大。
- hard-attention:这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此,这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。而且,因为不可导,一般需要用强化学习的方法进行训练。
- local-attention:这种方式其实是soft-attention和hard-attention的综合,首先用hard-attention的方式定位到一个小的区域,然后在这个小区域内用soft-attention。
-
按所用信息划分:如果我们要对一段文本计算Attention,那么所用信息包括内部信息和外部信息,内部信息指的是文本本身的信息(也叫原文),而外部信息指的是除文本以外的额外信息。
- general-attention:这种方式利用到了外部信息,常用于需要构建两段文本之间关系的任务,query一般包含了额外信息,根据外部信息对文本进行对齐。比如在阅读理解任务中,需要构建问题和文章的关联。假设现在baseline是,对问题计算出一个问题向量q,把这个问题向量q和所有的文章词向量拼接起来,输入到LSTM中进行建模。那么此时问题属于内部信息(文本本身),文章词向量就属于外部信息。
- self-attention:这种方式只使用内部信息,key和value以及query只和输入原文有关。在self-attention中key=value=query,在原文中的每个词可以跟该句子中的所有词进行Attention计算,相当于寻找原文内部的关系。对应阅读理解任务,就可以理解成直接利用问题作答而不利用文章信息。
-
按使用模型划分
- CNN+Attention:可以在卷积层前加,也可以在卷积层后加,还可以在pooling层加attention。首先我们用LSTM学到一个比较好的句向量,作为query,然后用CNN先学习到一个特征矩阵作为key,再用query对key产生权重,进行attention,得到最后的句向量。其实,类似max pooling以及卷积提取特征操作也可以看作是attention的一种形式。
- LSTM+Attention:人们用LSTM获得向量的常用方式是用最后一层hidden state值或者平均用每一层的hidden state值作为LSTM的输出向量,但是这样效果并不理想,长距离信息容易遗忘。因此,我们可以采取Attention机制,对所有step的hidden state进行加权,把注意力集中到整段文本中比较重要的hidden state信息。使用attention的结果进行接下来的计算。这比直接用最后一层或者平均用每一层都会有更好结果。
-
按照模型结构划分
- 单层attention:很普通的做法,用一个query对一段原文进行一次attention。
- 多层attention:一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务(合起来就是一个多层attention)。
- 多头attention:采用多个query对一段原文进行了多次attention,每个query都关注到原文的不同部分,相当于重复做多次单层attention,再把结果拼接起来。
-
按照权值计算方式划分:

四、Attention的优缺点
之所以要引入 Attention 机制,主要是3个原因:
-
参数少:模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小。
-
速度快:Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
-
效果好:在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。
五、应用
在NLP领域几乎到处都能见到attention,尤其是近几年self-attention的兴起,基于self-attention的机器翻译、机器阅读理解、文本情感分析、文本生成、语音识别等方法相继出现,使得NLP领域近些年来火了一把。
- 机器翻译

attention机制除了在NLP各类任务中应用广泛之外,在图像领域也有很多应用,例如图片描述(Image-Caption)领域,输入一张图片,人工智能系统输出一句描述句子,语义等价地描述图片所示内容。通过attention机制就能够动态捕捉到整张图像中的重要信息,通过这些信息对图像内容进行描述。
- 图片描述生成

总结:关于Attention的技术实现还是建议大家走一遍代码,对于产品了解技术出现的背景、解决什么问题、如何解决、有什么优缺点以及都要用到什么地方原理即可!