attention

attention机制人如其名,确实是关于注意力,它的目的是关注一个数据的重点,就像人看照片总是会忽略一些边角的信息。

1. 参数少

2. 速度快

3. 效果好

**参数少**

模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小。

**速度快**

Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。

**效果好**

在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。

Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。下图红色的预期就是被挑出来的重点。

![v2-09ed8523a47249430d6d49ade119924f_b](D:\CS learning\algorithm\rnn&attention\v2-09ed8523a47249430d6d49ade119924f_b.jpg)

Attention 的原理

Attention 经常会和 [Encoder](https://link.zhihu.com/?target=https%3A//easyai.tech/ai-definition/encoder-decoder-seq2seq/)–[Decoder](https://link.zhihu.com/?target=https%3A//easyai.tech/ai-definition/encoder-decoder-seq2seq/) 一起说,之前的文章《[一文看懂 NLP 里的模型框架 Encoder-Decoder 和 Seq2Seq](https://link.zhihu.com/?target=https%3A//easyai.tech/ai-definition/encoder-decoder-seq2seq/)》 也提到了 Attention。

下面的动图演示了attention 引入 Encoder-Decoder 框架下,完成机器翻译任务的大致流程。

<video src="D:\CS learning\algorithm\rnn&amp;attention\3f6e9014-2384-11eb-85d7-66d486dab038.mp4"></video>

**但是,Attention 并不一定要在 Encoder-Decoder 框架下使用的,他是可以脱离 Encoder-Decoder 框架的。**

下面的图片则是脱离 Encoder-Decoder 框架后的原理图解。![v2-06923154e9895a36d613a2b17022c7e2_b](D:\CS learning\algorithm\rnn&attention\v2-06923154e9895a36d613a2b17022c7e2_b.jpg)

图书管(source)里有很多书(value),为了方便查找,我们给书做了编号(key)。当我们想要了解漫威(query)的时候,我们就可以看看那些动漫、电影、甚至二战(美国队长)相关的书籍。

为了提高效率,并不是所有的书都会仔细看,针对漫威来说,动漫,电影相关的会看的仔细一些(权重高),但是二战的就只需要简单扫一下即可(权重低)。

当我们全部看完后就对漫威有一个全面的了解了。

**Attention 原理的3步分解:**

![v2-3253118aa50731664f9d284600e82002_b](D:\CS learning\algorithm\rnn&attention\v2-3253118aa50731664f9d284600e82002_b.jpg)

第一步: query 和 key 进行相似度计算,得到权值

第二步:将权值进行归一化,得到直接可用的权重

第三步:将权重和 value 进行加权求和

从上面的建模,我们可以大致感受到 Attention 的思路简单,**四个字“带权求和”就可以高度概括**,大道至简。做个不太恰当的类比,人类学习一门新语言基本经历四个阶段:死记硬背(通过阅读背诵学习语法练习语感)->提纲挈领(简单对话靠听懂句子中的关键词汇准确理解核心意思)->融会贯通(复杂对话懂得上下文指代、语言背后的联系,具备了举一反三的学习能力)->登峰造极(沉浸地大量练习)。

这也如同attention的发展脉络,RNN 时代是死记硬背的时期,attention 的模型学会了提纲挈领,进化到 [transformer](https://link.zhihu.com/?target=https%3A//easyai.tech/ai-definition/transformer/),融汇贯通,具备优秀的表达学习能力,再到 GPT、BERT,通过多任务大规模学习积累实战经验,战斗力爆棚。

要回答为什么 attention 这么优秀?是因为它让模型开窍了,懂得了提纲挈领,学会了融会贯通。

——阿里技术

Attention 的 N 种类型

Attention 有很多种不同的类型:Soft Attention、Hard Attention、[静态Attention](https://www.zhihu.com/search?q=静态Attention&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A"91839581"})、动态Attention、Self Attention 等等。下面就跟大家解释一下这些不同的 Attention 都有哪些差别。![v2-7dfae91f2a921fd62eb0a1845fae2b52_b](D:\CS learning\algorithm\rnn&attention\v2-7dfae91f2a921fd62eb0a1845fae2b52_b.jpg)

**1. 计算区域**

根据Attention的计算区域,可以分成以下几种:

1)**Soft** Attention,这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。

2)**Hard** Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用[gumbel softmax](https://www.zhihu.com/search?q=gumbel+softmax&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A"91839581"})之类的)

3)**Local** Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个[窗口区域](https://www.zhihu.com/search?q=窗口区域&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A"91839581"}),在这个小区域内用Soft方式来算Attention

**3. 结构层次**

结构方面根据是否划分层次关系,分为单层attention,多层attention和多头attention:

1)[单层Attention](https://www.zhihu.com/search?q=单层Attention&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A"91839581"}),这是比较普遍的做法,用一个query对一段原文进行一次attention。

2)多层Attention,一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务。

3)多头Attention,这是Attention is All You Need中提到的multi-head attention,用到了多个query对一段原文进行了多次attention,每个query都关注到原文的不同部分,相当于重复做多次单层attention:![v2-132f774f1f144487c8f15c96661e63c5_b](D:\CS learning\algorithm\rnn&attention\v2-132f774f1f144487c8f15c96661e63c5_b.jpg)

最后再把这些结果拼接起来:

![v2-8a207952a127905dc4edc90ef4d1cd6a_b](D:\CS learning\algorithm\rnn&attention\v2-8a207952a127905dc4edc90ef4d1cd6a_b.jpg)

作者:赵强

链接:https://zhuanlan.zhihu.com/p/91839581

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

**4. 模型方面**

从模型上看,Attention一般用在CNN和LSTM上,也可以直接进行纯Attention计算。

**1)CNN+Attention**

CNN的卷积操作可以提取重要特征,我觉得这也算是Attention的思想,但是CNN的卷积感受视野是局部的,需要通过叠加多层卷积区去扩大视野。另外,Max Pooling直接提取数值最大的特征,也像是[hard attention](https://www.zhihu.com/search?q=hard+attention&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A"91839581"})的思想,直接选中某个特征。

CNN上加Attention可以加在这几方面:

a. 在卷积操作前做attention,比如Attention-Based BCNN-1,这个任务是文本蕴含任务需要处理两段文本,同时对两段输入的[序列向量](https://www.zhihu.com/search?q=序列向量&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"article"%2C"sourceId"%3A"91839581"})进行attention,计算出特征向量,再拼接到原始向量中,作为卷积层的输入。

b. 在卷积操作后做attention,比如Attention-Based BCNN-2,对两段文本的卷积层的输出做attention,作为pooling层的输入。

c. 在pooling层做attention,代替max pooling。比如Attention pooling,首先我们用LSTM学到一个比较好的句向量,作为query,然后用CNN先学习到一个特征矩阵作为key,再用query对key产生权重,进行attention,得到最后的句向量。

**2)LSTM+Attention**

LSTM内部有Gate机制,其中input gate选择哪些当前信息进行输入,forget gate选择遗忘哪些过去信息,我觉得这算是一定程度的Attention了,而且号称可以解决长期依赖问题,实际上LSTM需要一步一步去捕捉序列信息,在长文本上的表现是会随着step增加而慢慢衰减,难以保留全部的有用信息。

LSTM通常需要得到一个向量,再去做任务,常用方式有:

a. 直接使用最后的hidden state(可能会损失一定的前文信息,难以表达全文)

b. 对所有step下的hidden state进行等权平均(对所有step一视同仁)。

c. Attention机制,对所有step的hidden state进行加权,把注意力集中到整段文本中比较重要的hidden state信息。性能比前面两种要好一点,而方便可视化观察哪些step是重要的,但是要小心过拟合,而且也增加了计算量。

**3)纯Attention**

Attention is all you need,没有用到CNN/RNN,乍一听也是一股清流了,但是仔细一看,本质上还是一堆向量去计算attention。

**5. 相似度计算方式**

在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有:

1)点乘:最简单的方法,![v2-99acc6f169ff04f3ebb4063902b0b073_b](D:\CS learning\algorithm\rnn&attention\v2-99acc6f169ff04f3ebb4063902b0b073_b.jpg)

2)矩阵相乘:![v2-99acc6f169ff04f3ebb4063902b0b073_b](D:\CS learning\algorithm\rnn&attention\v2-99acc6f169ff04f3ebb4063902b0b073_b.jpg)

3)cos相似度:![v2-3b89be131c692b3ec40e5124d1457556_b](D:\CS learning\algorithm\rnn&attention\v2-3b89be131c692b3ec40e5124d1457556_b.jpg)

4)串联方式:把q和k拼接起来,![v2-dd7209a97331755894d493aef0760eb5_b](D:\CS learning\algorithm\rnn&attention\v2-dd7209a97331755894d493aef0760eb5_b.jpg)

5)用多层感知机也可以:![v2-2e293590be35dff07e0a9668c13880fa_b](D:\CS learning\algorithm\rnn&attention\v2-2e293590be35dff07e0a9668c13880fa_b.jpg)