余弦相似度的取值范围_向量余弦相似度

余弦相似度的取值范围_向量余弦相似度关于Attention的总结学习NLP的同学,Bert可以认为是必学的一个模型,而Bert中self-attention同样是必不可少的一个知识点。接下来,咱们就对self-attention和其他attention结构

关于Attention的总结   学习NLP的同学,Bert可以认为是必学的一个模型,而Bert中self-attention同样是必不可少的一个知识点。接下来,咱们就对self-attention和其他attention结构进行总结。   1、什么是Attention   Attention机制最早是在视觉图像领域提出来的(上世纪90年代),但是真正热门起来是由google mind团队于2014年的论文《Recurrent Models of Visual Attention》,他们在RNN模型上使用了Attention机制来进行图像分类。   Recurrent Models of Visual Attention   Attention机制也叫注意力机制,之所以在图像分类中起作用,主要是模拟人类看图片的逻辑,当我们看一张图片的时候,其实并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。看一下下面这张图:   
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   看这张图片的时候,从整体上看到,有小孩,有电脑,有两颗歪脖子树,还有山。大家可能发现了,随着我的描述,我的注意力在不断转移或者更加聚焦。比如,我想看看他们穿的鞋子,那我们可能才会把注意力聚焦的四个小孩的鞋子上,而在这之前,我想并不是所有人都会意识到这四个小孩鞋子的款式不相同,颜色也分布不同。所以可以认为我们的视觉系统就是一种Attention机制,将注意力放在不同的区域,那我们就能够得到更多的关于不同角度的信息,这也是Attention机制在图像分类中的作用。   而最早将Attention机制应用到NLP领域中的是Bahdanau等人,他们在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用类似attention的机制应用在机器翻译任务中。   接着Attention机制被广泛应用在基于RNN/CNN等神经网络模型的各种NLP任务中。2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(Self-Attention)机制来学习文本表示。   接下来,我们看一下,Attention在自然语言任务中是如何起作用的?   
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   比如说上面的这句话,“她正在吃一个绿色的苹果”,我们在看到‘吃’这个词语的时候,我们的注意力会集中到某种食物的名字上,而对其形容词的注意力会降低。如果把高的注意力用数学方式表达,就是赋予高的权重,低的注意力赋予低的权重,那么可以认为,Attention 的本质是权重的分配问题,可以理解成一种对输入进行重新加权分配的问题。   那么在Attention之前,不能解决这样的问题吗?LSTM,RNN不行吗?为什么要用Attention,这个问题可以留在后面回答。我们先看一下Attention是如何实现的。   2 、Self-Attention   Google在《Attention is all you need》中是将Attention看作是一个编码序列的层,并定义了一种自己对自己的注意力机制。首先看一下它对于Attention的定义:   
 \operatorname{Attention}(\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V})=\operatorname{sof} \operatorname{tmax}\left(\frac{Q \boldsymbol{K}^{\top}}{\sqrt{d_{k}}}\right) \boldsymbol{V}\\   其中:
\boldsymbol{Q} \in \mathbb{R}^{n \times d_{k}}, \boldsymbol{K} \in \mathbb{R}^{m \times d_{k}}, \boldsymbol{V} \in \mathbb{R}^{m \times d_{v}} ,如果忽略激活函数softmax的话,可以看作是
n \times d_{k}, d_{k} \times m, m \times d_{v} 的矩阵相乘,得到了一个
n \times d_{v} 的矩阵。于是我们可以认为:Attention层将
n \times d_{k} 的序列Q编码成了一个新的
n \times d_{v} 的序列。看一下原论文中的计算结构图:
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   上面我们说到了Attention的本质是权重的分配问题,但是从它的定义上并不能很好的理解。所以我们还是要从栗子上来学习Attention的实现过程。现在有Thinking Machines两个单词组成的句子来展示整个的注意力计算过程。   
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   整个计算过程是从上到下的:   第一步:两个词的Embedding向量分别乘初始化的Q,K,V矩阵,分别得到对应的query,key,value向量,表示为
q_1,k_1,v_1
q_2,k_2,v_2 ,其实我们可以看到q,k,v是等价的。可以看作是把Embedding向量映射了三次,分别记作为q,k,v。   第二步:query 和 key 进行相似度计算,得到一个query 和 key 相关性的分值。
q_{1}\times k_{1} 可以看作是thinking自己和自己的相似度(点积运算可以衡量两个向量的相关性),
q_{1}\times k_{2} 可以看作thinking 和mathines的相关性,在图中分别是
q_{1}\times k_{1}=112
q_{1}\times k_{2}=96 。   第三步:将两个相似度进行归一化,得到一个注意力分布。虽然对两个相关性的数值经过softmax可以进行归一化,但还是除了
\sqrt(d_{k}) ,这个缩放操作是因为在数量级较大时,softmax将几乎全部的概率分布都分配给了最大值对应的标签,这样同时也会导致反向传播时,梯度消失。详细的解释可以参考https://www.zhihu.com/question/。在图中分别得到了0.88和0.12。   第四步:使用注意力分布和value进行计算,得到一个融合注意力更好的value值。在图中可以得到
z_{1} = 0.88v_1+0.12v_2 。这样我们就得到了thinking,mathines对于thinking的权重。   如果一个词是
X = (x_1,x_2,...x_n)中的
x_i ,那么Self-Attention是为了得到词与词之间的权重关系(重要程度),在这里可以理解为
X
X 之间的关系。   这就是self Attention主要干的事情。虽然我们明白了self-attention的实现过程,但是我相信有同学会想问一下为什么这么做?我们想要得到两个词对于其中一个词的重要程度(相关性),我们只需要将这两个词直接相乘,得到相关性分别加权到原来的词向量中,为什么要定义query,key,value三个tensor呢。以下的解释来自于lllltdaf同学在深度学习attention机制中的Q,K,V分别是从哪来的?的回答。   注意力机制说白了就是要通过训练得到一个加权,自注意力机制就是要通过权重矩阵来自发地找到词与词之间的关系。因此肯定需要给每个input定义tensor,然后通过tensor间的乘法来得到input之间的关系。那这么说是不是给每个input定义1个tensor就够了呢?不够啊!如果每个input只有一个相应的q,那么q1和q2之间做乘法求取了a1和a2的关系之后,这个结果怎么存放怎么使用呢?而且a1和a2之间的关系是对偶的吗?如果a1找a2和a2找a1有区别怎么办?只定义一个这模型是不是有点太简单了。   
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   一个不够就定义两个,于是有了q和k。q你可以理解为代表自己用的,用q去和别的输入找关系;k理解为给别人用的,专门对付来跟你找关系的输入。这样子,用自己的q去和别人的k(当然和自己的k也行)做乘法,就可以得到找出的关系:权重
\alpha 了。   
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   仅定义q和k两个够吗?可能也还是不够的。找出来的关系是要用的,不用等于白找。权重
\alpha   是要对输入信息做加权,才能体现找到的关系的价值的。那跟输入直接加权行吗?这么做也不是不行,就是显得直接和生硬了点。所以又定义了个v。要知道,v和q、k一样,都是通过系数矩阵对输入a做乘法得到的。所以定义了个v大概等于又对a加了一层可以学习的参数,然后对经过参数调整后的a再去做加权、把通过注意力机制学到的关系给用上。所以,通过
\alpha   和v的乘法进行加权操作,最终得到输出o。   
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   综上,定义这3个tensor,一方面是为了学习输入之间的关系、找到和记录谁和谁的关系权重,一方面也是在合理的结构下引入了可学习的参数,使得网络具有更强的学习能力。   3、Attention分类   上面的例子是使用两个向量的乘积作为相似度的,在我们的认知里肯定还有其他方法(余弦相似度等),所以肯定还存在着其他类型的Attention,所以查阅了一些资料,才发现Attention不仅可以根据计算方式分类,还可以根据计算区域,所用信息,结构层次等多种分类方法。分类依据有很多,以下是我感觉比较详细的一种,从大佬的文章中摘录出来,以供学习。   3.1 按计算区域分类   –soft attention:保留所有分量均做加权,输出注意力分布的概率值。这也是上面介绍的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。   –hard attention:在分布中以某种采样策略选取部分分量,输出onehot向量。这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的)   –Local Attention:这种方式是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。   3.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.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:   
 head _{i}= Attention \left(q_{i}, K, V\right)\\   最后再把这些结果拼接起来:   
MultiHead(Q,K,V) =Concat(head_1,...,head_h)W^O\\   3.4 根据相似度计算方式分类   在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有:   1)点积模型:   
 s(x_i, q)=x_{i}^{T} q\\   2)缩放点积:   
 s(x_i, q)=x_{i}^{T} q/\sqrt(d)\\   3)加性模型(理论上也可以进行拼接):   
 s(x_i, q)=V^T tanh(Wx_i+Uq)\\   4)双线性模型:   
s(x_i, q)=x_{i}^{T} Wq\\   3.5 从Attention对象上分类   其实在大佬中的文章中,这一部分应该是按照模型分类,但感觉这只是Attention在不同模型中的应用,所以这块省略这部分,但是学过transformer结果的同学都知道,transformer里面有两个不同的Attention结构,所以下来说一下这两种Attention。   1)第一种就是上面栗子中的Self-attention(这里不多解释了)。   2)transformer是encoder-decoder结构,而连接这两种结构的正是Attention部分。比如说,Encoder-Decoder attention采用传统的attention机制,其中的Query是self-attention mechanism已经计算出的上一时间i处的编码值,Key和Value都是Encoder的输出。   4、序列编码   我们已经了解了Attention的分类和计算方法,以及self-Attention为什么使用了3个Tensor。那么我们现在回到第一部分留下的问题,在Attention出现之前,Lstm,RNN能否解决权重的分配问题,为什么要使用Attention?   在NLP中,一般都是先将句子分词,然后每个词转换成对应的词向量。所以每个句子就可以得到一个矩阵
\boldsymbol{X}=\left(\boldsymbol{x}_{1}, \boldsymbol{x}_{2}, \ldots, \boldsymbol{x}_{t}\right) ,其中
x_i 是第
i 个词的词向量。   因此RNN在进行想要表示
x_{t-1}
x_t 的权重,   在RNN的计算图中可以看到,在
t 时刻,为了得到
o_t ,输入是
x_t 和包含
x_{t-1} 信息的
s_{t-1} ,可以认为模型会根据权重信息调整
t 时刻
x_t
x_{t-1} 对于输出
o_t 的权重。有没有那么一点attention的感觉。   
余弦相似度的取值范围_向量余弦相似度
余弦相似度的取值范围_向量余弦相似度   但是,但是很重要,我们看一下RNN递归表达式   
 \boldsymbol{y}_{t}=f\left(\boldsymbol{y}_{t-1}, \boldsymbol{x}_{t}\right)\\   在这个表达式中,可以看到,想要预测y_t的信息,需要依赖y_{t-1}的信息,这种机制就意味着RNN没有办法并行。因此速度会很慢,当然LSTM,GRU都是这样的。   而我们再看看Attention的表达式:   
\boldsymbol{y}_{t}=f\left(\boldsymbol{x}_{t}, \boldsymbol{A}, \boldsymbol{B}\right)\\   RNN需要逐步递归才能获得全局信息(可以使用双向),而Attention可以一步获得全局信息。其中A,B是另外一个序列(矩阵)。如果
A=B=X ,那么就成为Self Atention,这个操作可以将
x_t 和原来的每个词进行权重计算,并且可以并行,计算出
y_t 。   5、总结   文章总结了Attention的几种类型,Self Attention的计算过程,和在学习过程中的一些问题(为什么要定义query,key,value三个tensor;RNN也可以解决权重问题,为什么要使用Self Attention),针对这两个进行了回答总结,希望对大家有所帮助。   参考   一文看懂 Attention(本质原理+3大优点+5大类型)   nlp中的Attention注意力机制+Transformer详解   当我们在聊Attention的时候,我们实际在聊什么?   Transformer 一篇就够了(一): Self-attenstion   苏剑林. (Jan. 06, 2018). 《《Attention is All You Need》浅读(简介+代码) 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/4765

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/42440.html

(0)
上一篇 2024年 9月 6日 下午8:47
下一篇 2024年 9月 6日 下午8:53

相关推荐

关注微信