| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【神经网络】学习笔记十六——Attention机制 -> 正文阅读 |
|
[人工智能]【神经网络】学习笔记十六——Attention机制 |
本文介绍Attention机制,其经典使用是在NLP中搭配RNN(一般为LSTM)做编码解码器(Seq2Seq),用于给编码过程中每一步的状态分配权重,然后加权求和得到解码过程中每一步解码时的状态向量,参与计算,得到本步的输出。 在学习笔记十四中,我介绍了Seq2Seq机制,文章的最后也带着说了一点Attention机制,大家可以去看看。 一、Attention的本质是什么Attention(注意力)机制的本质可以概括为以下几句相同意思的话,都解释的很透彻: (1)从关注全局到关注重点:将有限的注意力集中的重点信息上,从而节省资源,快速获得有效信息(后面会说这导致加入RNN时能够并行); (2)高度概括为带权求和:通过某种方法计算得到权重,然后将每个value与其权重相乘,求和,最后得到新的值投入使用; (3)通俗理解,当看东西时,我们会根据需求来观察特定的一部分,即在学习时将注意力放到该部分上,其他的部分少看一点,这就是注意力机制的本质; (4)即一系列注意力分配系数,即一系列权重系数; (5)即从序列中学习到每一个元素的重要程度,然后按重要程度将元素合并。这表明序列元素在编码时,每一步所对应的语义编码C是不一样的。以编码解码器为例如下图: ? ?二、单纯的Attention机制实现及原理?Attention机制并不一定要在Encoder-Decoder框架下使用,下面的图片是脱离框架后的原理图: ?上图描述了Attention value的本质,就是查询(query)到了每一个key-value的映射,然后乘积求和,得到了新的Attention value。 下图为分布图解,介绍了Attention函数的工作实质: 阶段一:Q(query)和K(key)进行相似度计算,得到权值; 阶段二:将上述权值进行归一化,得到直接可用的权重; 阶段三:将权重和value进行加权求和; 此时加权求和的结果就是注意力值。此时计算所得attention value是一个向量,代码了序列元素 x(j) 的编码向量,词向量中包含了元素 x(j) 的上下文关系,即包含全局联系也包含局部联系。它灵活的捕捉了长期依赖和local依赖,一步到位得到了全局信息和重点局部信息。这就如同Attention的发展脉络,RNN是死记硬背的时期,attention模型学会了提纲挈领。他让模型开窍了,学会了提取重点融会贯通。 但这里强调一点,Attention机制以每个单独的词为着力点,但忽略了序列中语序顺序关系,其实在句子中,位置信息也是很重要的一点,但attention机制不能做到这点。不过后来的方法加上了位置向量(postion embedding)后解决了这个问题。 三、Attention的优缺点?Attention机制最早出现在计算机视觉里,随后在NLP领域开始应用并发扬光大,因为2018年BERT和GPT效果出奇的好,进而走红。而Transformer和Attention这些核心重点被大家关注。 Attention机制三大优点: (1)参数少:跟CNN,RNN相比,复杂度小,参数少; (2)速度快:解决了RNN不能并行计算的问题。Attention机制每步不依赖于上一步的计算结果,因此可以和CNN一样并行处理; (3)效果好:Attention是挑重点,就算文本长,也能从中间抓住重点,不丢失重要信息,解决了长距离信息被弱化的问题。 缺点: 缺点前面说了,就是不能捕捉语序顺序(即元素的顺序)。这在NLP里是很糟糕的,因为自然语言的语序包含了太多信息,如果包含不了结果会大打折扣。当然在NLP任务中加上位置信息就可以,所以就有了position-embedding(位置向量)的概念了,这里就不细说了。 四、Attention的类型Attention机制有很多类型,Soft Attention、Hard Attention、静态Attention、动态Attention、Self Attention 等等,文章Attention用于NLP的一些小结 - 知乎 (zhihu.com)总结的很详细,这里直接引用,大家也可以去原文看看。 1.? 计算区域根据Attention的计算区域,可以分成以下几种: (1)Soft?Attention,这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。 (2)Hard?Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的) (3)Local?Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。 2.? 所用信息假设我们要对一段原文计算Attention,这里原文指的是我们要做attention的文本,那么所用信息包括内部信息和外部信息,内部信息指的是原文本身的信息,而外部信息指的是除原文以外的额外信息。 (1)General?Attention,这种方式利用到了外部信息,常用于需要构建两段文本关系的任务,query一般包含了额外信息,根据外部query对原文进行对齐。 比如在阅读理解任务中,需要构建问题和文章的关联,假设现在baseline是,对问题计算出一个问题向量q,把这个q和所有的文章词向量拼接起来,输入到LSTM中进行建模。那么在这个模型中,文章所有词向量共享同一个问题向量,现在我们想让文章每一步的词向量都有一个不同的问题向量,也就是,在每一步使用文章在该步下的词向量对问题来算attention,这里问题属于原文,文章词向量就属于外部信息。 (2)Local?Attention,这种方式只使用内部信息,key和value以及query只和输入原文有关,在self attention中,key=value=query。既然没有外部信息,那么在原文中的每个词可以跟该句子中的所有词进行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计算。 (1)CNN+Attention CNN的卷积操作可以提取重要特征,我觉得这也算是Attention的思想,但是CNN的卷积感受视野是局部的,需要通过叠加多层卷积区去扩大视野。另外,Max Pooling直接提取数值最大的特征,也像是hard attention的思想,直接选中某个特征。 CNN上加Attention可以加在这几方面: ? ? ? ? ?——在卷积操作前做attention,比如Attention-Based BCNN-1,这个任务是文本蕴含任务需要处理两段文本,同时对两段输入的序列向量进行attention,计算出特征向量,再拼接到原始向量中,作为卷积层的输入。 ? ? ? ? ?——在卷积操作后做attention,比如Attention-Based BCNN-2,对两段文本的卷积层的输出做attention,作为pooling层的输入。 ? ? ? ? ?——在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通常需要得到一个向量,再去做任务,常用方式有: ? ? ? ? ?——直接使用最后的hidden state(可能会损失一定的前文信息,难以表达全文) ? ? ? ? ?——对所有step下的hidden state进行等权平均(对所有step一视同仁)。 ? ? ? ? ?——Attention机制,对所有step的hidden state进行加权,把注意力集中到整段文本中比较重要的hidden state信息。性能比前面两种要好一点,而方便可视化观察哪些step是重要的,但是要小心过拟合,而且也增加了计算量。 (3)纯Attention Attention is all you need,没有用到CNN/RNN,乍一听也是一股清流了,但是仔细一看,本质上还是一堆向量去计算attention。 5.? 相似度计算方式在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有: (1)点乘:最简单的方法, (2)矩阵相乘: (3)cos相似度: (4)串联方式:把q和k拼接起来, (5)用多层感知机也可以: 本文参考自 产品经理的AI知识库,原文地址:https://link.zhihu.com/?target=https%3A//easyai.tech/ai-definition/attention/。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 16:39:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |