企业网站建设要多,虚拟电脑主机平台,企业网站备案收费,iis网站做文件下载按钮NLP入门系列—Attention 机制 
Attention 正在被越来越广泛的得到应用。尤其是 [BERT]火爆了之后。 
Attention 到底有什么特别之处#xff1f;他的原理和本质是什么#xff1f;Attention都有哪些类型#xff1f;本文将详细讲解Attention的方方面面。 
Attention 的本质是什…NLP入门系列—Attention 机制 
Attention 正在被越来越广泛的得到应用。尤其是 [BERT]火爆了之后。 
Attention 到底有什么特别之处他的原理和本质是什么Attention都有哪些类型本文将详细讲解Attention的方方面面。 
Attention 的本质是什么 
Attention注意力机制如果浅层的理解跟他的名字非常匹配。他的核心逻辑就是「从关注全部到关注重点」。 
‘ 
Attention 机制很像人类看图片的逻辑当我们看一张图片的时候我们并没有看清图片的全部内容而是将注意力集中在了图片的焦点上。大家看一下下面这张图 
我们一定会看清「锦江饭店」4个字如下图 
’ 
但是我相信没人会意识到「锦江饭店」上面还有一串「电话号码」也不会意识到「喜运来大酒家」如下图 
‘ 
所以当我们看一张图片的时候其实是这样的 
’ 
上面所说的我们的视觉系统就是一种 Attention机制将有限的注意力集中在重点信息上从而节省资源快速获得最有效的信息。 
AI 领域的 Attention 机制 
Attention 机制最早是在计算机视觉里应用的随后在 NLP 领域也开始应用了真正发扬光大是在 NLP 领域因为 2018 年 BERT 和 GPT 的效果出奇的好进而走红。而 Transformer 和 Attention 这些核心开始被大家重点关注。 
如果用图来表达 Attention 的位置大致是下面的样子 这里先让大家对 Attention 有一个宏观的概念下文会对 Attention 机制做更详细的讲解。在这之前我们先说说为什么要用 Attention。 
Attention 的3大优点 
之所以要引入 Attention 机制主要是3个原因 
参数少速度快效果好 参数少 
模型复杂度跟 CNN、RNN 相比复杂度更小参数也更少。所以对算力的要求也就更小。 
速度快 
Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果因此可以和CNN一样并行处理。 
效果好 
在 Attention 机制引入之前有一个问题大家一直很苦恼长距离的信息会被弱化就好像记忆能力弱的人记不住过去的事情是一样的。 
Attention 是挑重点就算文本比较长也能从中间抓住重点不丢失重要的信息。下图红色的预期就是被挑出来的重点。 Attention 的原理 
Attention 经常会和 Encoder–Decoder 一起说下面的动图演示了attention 引入 Encoder-Decoder 框架下完成机器翻译任务的大致流程。 但是Attention 并不一定要在 Encoder-Decoder 框架下使用的他是可以脱离 Encoder-Decoder 框架的。 
下面的图片则是脱离 Encoder-Decoder 框架后的原理图解。 小故事讲解 
上面的图看起来比较抽象下面用一个例子来解释 attention 的原理 图书管source里有很多书value为了方便查找我们给书做了编号key。当我们想要了解漫威query的时候我们就可以看看那些动漫、电影、甚至二战美国队长相关的书籍。 
为了提高效率并不是所有的书都会仔细看针对漫威来说动漫电影相关的会看的仔细一些权重高但是二战的就只需要简单扫一下即可权重低。 
当我们全部看完后就对漫威有一个全面的了解了。 
Attention 原理的3步分解 第一步 query 和 key 进行相似度计算得到权值 
第二步将权值进行归一化得到直接可用的权重 
第三步将权重和 value 进行加权求和 从上面的建模我们可以大致感受到 Attention 的思路简单四个字“带权求和”就可以高度概括大道至简。做个不太恰当的类比人类学习一门新语言基本经历四个阶段死记硬背通过阅读背诵学习语法练习语感-提纲挈领简单对话靠听懂句子中的关键词汇准确理解核心意思-融会贯通复杂对话懂得上下文指代、语言背后的联系具备了举一反三的学习能力-登峰造极沉浸地大量练习。 这也如同attention的发展脉络RNN 时代是死记硬背的时期attention 的模型学会了提纲挈领进化到 transformer融汇贯通具备优秀的表达学习能力再到 GPT、BERT通过多任务大规模学习积累实战经验战斗力爆棚。 要回答为什么 attention 这么优秀是因为它让模型开窍了懂得了提纲挈领学会了融会贯通。 想要了解更多技术细节可以看看下面的文章或者视频 
「文章」深度学习中的注意力机制 
「文章」遍地开花的 Attention你真的懂吗 
「文章」探索 NLP 中的 Attention 注意力机制及 Transformer 详解 
「视频」李宏毅 – transformer 
「视频」李宏毅 – ELMO、BERT、GPT 讲解 
Attention 的 N 种类型 
Attention 有很多种不同的类型Soft Attention、Hard Attention、静态Attention、动态Attention、Self Attention 等等。下面就跟大家解释一下这些不同的 Attention 都有哪些差别。 由于这篇文章《Attention用于NLP的一些小结》已经总结的很好的下面就直接引用了 
本节从计算区域、所用信息、结构层次和模型等方面对Attention的形式进行归类。 
1. 计算区域 
根据Attention的计算区域可以分成以下几种 
1Soft Attention这是比较常见的Attention方式对所有key求权重概率每个key都有一个对应的权重是一种全局的计算方式也可以叫Global Attention。这种方式比较理性参考了所有key的内容再进行加权。但是计算量可能会比较大一些。 
2Hard Attention这种方式是直接精准定位到某个key其余key就都不管了相当于这个key的概率是1其余key的概率全部是0。因此这种对齐方式要求很高要求一步到位如果没有正确对齐会带来很大的影响。另一方面因为不可导一般需要用强化学习的方法进行训练。或者使用gumbel softmax之类的 
3Local Attention这种方式其实是以上两种方式的一个折中对一个窗口区域进行计算。先用Hard方式定位到某个地方以这个点为中心可以得到一个窗口区域在这个小区域内用Soft方式来算Attention。 
2. 所用信息 
假设我们要对一段原文计算Attention这里原文指的是我们要做attention的文本那么所用信息包括内部信息和外部信息内部信息指的是原文本身的信息而外部信息指的是除原文以外的额外信息。 
1General Attention这种方式利用到了外部信息常用于需要构建两段文本关系的任务query一般包含了额外信息根据外部query对原文进行对齐。 
比如在阅读理解任务中需要构建问题和文章的关联假设现在baseline是对问题计算出一个问题向量q把这个q和所有的文章词向量拼接起来输入到LSTM中进行建模。那么在这个模型中文章所有词向量共享同一个问题向量现在我们想让文章每一步的词向量都有一个不同的问题向量也就是在每一步使用文章在该步下的词向量对问题来算attention这里问题属于原文文章词向量就属于外部信息。 
2Local Attention这种方式只使用内部信息key和value以及query只和输入原文有关在self attention中keyvaluequery。既然没有外部信息那么在原文中的每个词可以跟该句子中的所有词进行Attention计算相当于寻找原文内部的关系。 
还是举阅读理解任务的例子上面的baseline中提到对问题计算出一个向量q那么这里也可以用上attention只用问题自身的信息去做attention而不引入文章信息。 
3. 结构层次 
结构方面根据是否划分层次关系分为单层attention多层attention和多头attention 
1单层Attention这是比较普遍的做法用一个query对一段原文进行一次attention。 
2多层Attention一般用于文本具有层次关系的模型假设我们把一个document划分成多个句子在第一层我们分别对每个句子使用attention计算出一个句向量也就是单层attention在第二层我们对所有句向量再做attention计算出一个文档向量也是一个单层attention最后再用这个文档向量去做任务。 
3多头Attention这是Attention is All You Need中提到的multi-head attention用到了多个query对一段原文进行了多次attention每个query都关注到原文的不同部分相当于重复做多次单层attention 最后再把这些结果拼接起来 4. 模型方面 
从模型上看Attention一般用在CNN和LSTM上也可以直接进行纯Attention计算。 
1CNNAttention 
CNN的卷积操作可以提取重要特征我觉得这也算是Attention的思想但是CNN的卷积感受视野是局部的需要通过叠加多层卷积区去扩大视野。另外Max Pooling直接提取数值最大的特征也像是hard attention的思想直接选中某个特征。 
CNN上加Attention可以加在这几方面 
a. 在卷积操作前做attention比如Attention-Based BCNN-1这个任务是文本蕴含任务需要处理两段文本同时对两段输入的序列向量进行attention计算出特征向量再拼接到原始向量中作为卷积层的输入。 
b. 在卷积操作后做attention比如Attention-Based BCNN-2对两段文本的卷积层的输出做attention作为pooling层的输入。 
c. 在pooling层做attention代替max pooling。比如Attention pooling首先我们用LSTM学到一个比较好的句向量作为query然后用CNN先学习到一个特征矩阵作为key再用query对key产生权重进行attention得到最后的句向量。 
2LSTMAttention 
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点乘最简单的方法  
2矩阵相乘  
3cos相似度  
4串联方式把q和k拼接起来  
5用多层感知机也可以