引言
- 本文将总结归纳个人搜集关于注意力机制的一些简单通俗理解,在失业期间作为个人充电的起始,本文不包含众多注意力机制以及其组合的变体,只为方便理解后续的一些算法做铺垫。
- 本文首先介绍注意力机制的通俗理解和背景
- 然后介绍目前注意力机制的主要使用场景
- 介绍注意力机制的结构原理和数学原理
- 介绍attention根据不同的划分条件分类介绍类别
- 注意力机制和自注意力机制的区别
注意力机制通俗理解
- 如上图chatgpt回答,通俗来讲注意力机制就是模仿生物将注意力集中到一部分事物而忽略另外的一些事物,比如下图的这张图片当我们第一眼看过去兔子大概率是关注的重点其次才是后面的景色。
- 在深度学习领域,训练模型往往需要大量的数据但是在某特定的情境下只有少部分数据是极为重要的,此时就需要attention机制发光发热了。
- 注意力机制产生的原因
- 计算能力的限制,当要记住很多"历史信息"的时候模型就会变得越来越复杂,但是计算能力不一定能刚好满足
- 优化算法的限制:LSTM只能在一定程度缓解RNN中的长距离依赖关系,且记忆能力并不高,个人理解是觉得记忆的不够精准有点碰运气的成分没有针对性。
Encoder-Decoder框架(编码器-解码器)
- 目前大多数注意力模型是存在于Encoder-Decoder框架中的,但是注意力模型其实可以看作是一种通用的思想,其本身是不依赖于特定框架的,个人理解其更像是数学中的一条定理,我们拿着这个定理去解决数学问题。
- 以下为文本处理领域常用的E-D框架
- 以下为文本处理领域常用的E-D框架
- 对于上图公式的抽象理解 https://zhuanlan.zhihu.com/p/37601161
seq2seq(序列到序列)
- 关于seq2seq模型此处做一个简单的介绍,方便后面举例(具体s2s模型会专门写文章总结),seq2seq其实就是对上述的Encoder-Decoder框架的具体实现和应用
- 参考2
- RNN LSTM
- 注1:其中不管是左边的编码器还是右边的解码器,所用模型可以是CNN/RNN/BiRNN/GRU/LSTM等根据自己场景需要选择(参考上面ED部分的最后一个图的说明)
- 下图中红色文字为个人认为比较LSTM更好是因为在LSTM里遗忘门与下图的文字解释更搭配,RNN虽然先提出的隐状态的概念但是相对理解不够形象,酌情参考
attention结构
- 脱离ED框架的attention结构和引入了注意力模型的ED框架
- 实例说明(参考3)
- attention机制的具体计算分为两大过程
- 根据Query和Key计算权重系数)(又细分为两个部分)
- 根据Query和Key计算两者的相似度或者相关性
- 对上面阶段的原始分值进行归一化处理
- 根据权重系数对Value进行加权求和
- 根据Query和Key计算权重系数)(又细分为两个部分)
- 关于第一阶段可以用不同的函数和计算机制来计算其相关性和相似性
- 第二阶段
关于attention的变体类型划分(下图仅供参考)
计算区域分类
- 1 Self-attention自注意力机制对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。
- 2 Hard Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel-softmax之类的,解决某些情况下不可导的情况)
- 3 Local Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。
所用信息分类
- 关于信息,如果我们需要对一段原文计算attention,是包含外部信息和内部信息的,内部信息就是原文本身的信息,外部信息指的是除了原文以外的额外信息
- 1 General Attention,这种方式利用到了外部信息,常用于需要构建两段文本关系的任务,query一般包含了额外信息,根据外部query对原文进行对齐。
- 如:构建问题和文章的关联,将问题首先转化成一个向量并将其与文章的所有词向量拼接起来,输入到如LSTM中进行建模, 此时文章所有的词向量共享同一个问题向量(此时内部信息还是原文),如果想要同一层级下文章词向量都有一个不同的问题向量,并计算词层级下词向量和问题的attention值,问题属于原文,文章词向量属于外部信息(个人对下面图片中作者例子的理解,仅供参考)
- 如:构建问题和文章的关联,将问题首先转化成一个向量并将其与文章的所有词向量拼接起来,输入到如LSTM中进行建模, 此时文章所有的词向量共享同一个问题向量(此时内部信息还是原文),如果想要同一层级下文章词向量都有一个不同的问题向量,并计算词层级下词向量和问题的attention值,问题属于原文,文章词向量属于外部信息(个人对下面图片中作者例子的理解,仅供参考)
- 2 Local Attention,这种方式只使用内部信息,key和value以及query只和输入原文有关,在self attention中,key=value=query。既然没有外部信息,那么在原文中的每个词可以跟该句子中的所有词进行Attention计算,相当于寻找原文内部的关系。
- 同上面例子,就是对问题的词进行向量化,然后每个词与其他词计算attention,并不引入文章的信息,也可以单独用文章信息(同上的个人理解)
- 同上面例子,就是对问题的词进行向量化,然后每个词与其他词计算attention,并不引入文章的信息,也可以单独用文章信息(同上的个人理解)
结构层次
- 单层Attention,这是比较普遍的做法,用一个query对一段原文进行一次attention(上图中最简单的结构)
- 多层Attention,一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务(个人感觉可能gpt的回答)。
- 多头attention
模型方面
task分析
- 该部分为参考文章作者的心得体会,还有部分内容请看原文链接(已经快原文摘抄了…)
自注意力机制与注意力机制区别
其他参考文章
结尾
- 由于个人对注意力机制只是去学习没有业务实践所以还是停留在表面,本文更像是个人学习途中对参考文章的拆分总结,所以仅供参考,有错误的地方欢迎指正
- 代码部分由于组合比较多,个人决定今后有业务需要会上传相关实现代码,参考资料中部分是包含代码的,有需要的可以自行检验。
- 祝自己找工作顺利!