首页 > 其他分享 >自注意力机制-Self-Attention

自注意力机制-Self-Attention

时间:2024-01-29 09:45:37浏览次数:16  
标签:Attention Self attention 矩阵 向量 注意力 输入

一、注意力机制和自注意力机制的区别

Attention机制与Self-Attention机制的区别

传统的Attention机制发生在Target的元素和Source中的所有元素之间。

简单讲就是说Attention机制中的权重的计算需要Target来参与。即在Encoder-Decoder 模型中,Attention权值的计算不仅需要Encoder中的隐状态而且还需要Decoder中的隐状态。

Self-Attention:

不是输入语句和输出语句之间的Attention机制,而是输入语句内部元素之间或者输出语句内部元素之间发生的Attention机制。

例如在Transformer中在计算权重参数时,将文字向量转成对应的KQV,只需要在Source处进行对应的矩阵操作,用不到Target中的信息。

二、引入自注意力机制的目的
神经网络接收的输入是很多大小不一的向量,并且不同向量向量之间有一定的关系,但是实际训练的时候无法充分发挥这些输入之间的关系而导致模型训练结果效果极差。比如机器翻译问题(序列到序列的问题,机器自己决定多少个标签),词性标注问题(一个向量对应一个标签),语义分析问题(多个向量对应一个标签)等文字处理问题。

针对全连接神经网络对于多个相关的输入无法建立起相关性的这个问题,通过自注意力机制来解决,自注意力机制实际上是想让机器注意到整个输入中不同部分之间的相关性。

三、Self-Attention详解
针对输入是一组向量,输出也是一组向量,输入长度为N(N可变化)的向量,输出同样为长度为N 的向量。

3.1 单个输出

对于每一个输入向量a,经过蓝色部分self-attention之后都输出一个向量b,这个向量b是考虑了所有的输入向量对a1产生的影响才得到的,这里有四个词向量a对应就会输出四个向量b。

下面以b1的输出为例

首先,如何计算sequence中各向量与a1的关联程度,有下面两种方法

 

Dot-product方法是将两个向量乘上不同的矩阵w,得到q和k,做点积得到α,transformer中就用到了Dot-product。

上图中绿色的部分就是输入向量a1和a2,灰色的Wq和Wk为权重矩阵,需要学习来更新,用a1去和Wq相乘,得到一个向量q,然后使用a2和Wk相乘,得到一个数值k。最后使用q和k做点积,得到α。α也就是表示两个向量之间的相关联程度。

上图右边加性模型这种机制也是输入向量与权重矩阵相乘,后相加,然后使用tanh投射到一个新的函数空间内,再与权重矩阵相乘,得到最后的结果。

可以计算每一个α(又称为attention score),q称为query,k称为key

 

另外,也可以计算a1和自己的关联性,再得到各向量与a1的相关程度之后,用softmax计算出一个attention distribution,这样就把相关程度归一化,通过数值就可以看出哪些向量是和a1最有关系。

 

下面需要根据 α′ 抽取sequence里重要的资讯:

先求v,v就是键值value,v和q、k计算方式相同,也是用输入a乘以权重矩阵W,得到v后,与对应的α′ 相乘,每一个v乘与α'后求和,得到输出b1。

如果 a1 和 a2 关联性比较高, α1,2′ 就比较大,那么,得到的输出 b1 就可能比较接近 v2 ,即attention score决定了该vector在结果中占的分量;

3.2 矩阵形式
用矩阵运算表示b1的生成:

Step 1:q、k、v的矩阵形式生成

写成矩阵形式:

把4个输入a拼成一个矩阵,这个矩阵有4个column,也就是a1到a4,乘上相应的权重矩阵W,得到相应的矩阵Q、K、V,分别表示query,key和value。

三个W是我们需要学习的参数

Step 2:利用得到的Q和K计算每两个输入向量之间的相关性,也就是计算attention的值α, α的计算方法有多种,通常采用点乘的方式。

先针对q1,通过与k1到k4拼接成的矩阵K相乘,得到拼接成的矩阵。

同样,q1到q4也可以拼接成矩阵Q直接与矩阵K相乘:

公式为:

矩阵形式:

矩阵A中的每一个值记录了对应的两个输入向量的Attention的大小α,A'是经过softmax归一化后的矩阵。

Step 3:利用得到的A'和V,计算每个输入向量a对应的self-attention层的输出向量b:

写成矩阵形式:

对self-attention操作过程做个总结,输入是I,输出是O:

矩阵Wq、 Wk 、Wv是需要学习的参数。

四、Multi-head Self-attention
self-attention的进阶版本Multi-head Self-attention,多头自注意力机制

因为相关性有很多种不同的形式,有很多种不同的定义,所以有时不能只有一个q,要有多个q,不同的q负责不同种类的相关性。

对于1个输入a

首先,和上面一样,用a乘权重矩阵W得到,然后再用乘两个不同的W,得到两个不同的,i代表的是位置,1和2代表的是这个位置的第几个q。

这上面这个图中,有两个head,代表这个问题有两种不同的相关性。

同样,k和v也需要有多个,两个k、v的计算方式和q相同,都是先算出来ki和vi,然后再乘两个不同的权重矩阵。

对于多个输入向量也一样,每个向量都有多个head:

算出来q、k、v之后怎么做self-attention呢?

和上面讲的过程一样,只不过是1那类的一起做,2那类的一起做,两个独立的过程,算出来两个b。

对于1:

 

 

对于2:

 

 

这只是两个head的例子,有多个head过程也一样,都是分开算b。

最后,把拼接成矩阵再乘权重矩阵W,得到,也就是这个self- attention向量ai的输出,如下图所示:

 

 

五、Positional Encoding
在训练self attention的时候,实际上对于位置的信息是缺失的,没有前后的区别,上面讲的a1,a2,a3不代表输入的顺序,只是指输入的向量数量,不像rnn,对于输入有明显的前后顺序,比如在翻译任务里面,对于“机器学习”,机器学习依次输入。而self-attention的输入是同时输入,输出也是同时产生然后输出的。

如何在Self-Attention里面体现位置信息呢?就是使用Positional Encoding

也就是新引入了一个位置向量,非常简单,如下图所示:

 

 

每一个位置设置一个vector,叫做positional vector,用表示,不同的位置有一个专属的ei。

如果ai加上了ei,就会体现出位置的信息,i是多少,位置就是多少。

vector长度是人为设定的,也可以从数据中训练出来。

六、Self-Attention和RNN的区别
Self-attention和RNN的主要区别在于:

1.Self-attention可以考虑全部的输入,而RNN似乎只能考虑之前的输入(左边)。但是当使用双向RNN的时候可以避免这一问题。
2.Self-attention可以容易地考虑比较久之前的输入,而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。
3.Self-attention可以并行计算,而RNN不同层之间具有先后顺序。

1.Self-attention可以考虑全部的输入,而RNN似乎只能考虑之前的输入(左边)。但是当使用双向RNN的时候可以避免这一问题。

比如,对于第一个RNN,只考虑了深蓝色的输入,绿色及绿色后面的输入不会考虑,而Self-Attention对于4个输入全部考虑

 

 

2.Self-attention可以容易地考虑比较久之前的输入,而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。

比如对于最后一个RNN的黄色输出,想要包含最开始的蓝色输入,必须保证蓝色输入在经过每层时信息都不丢失,但如果一个sequence很长,就很难保证。而Self-attention每个输出都和所有输入直接有关。

 

 

3.Self-attention可以并行计算,而RNN不同层之间具有先后顺序。

Self-attention的输入是同时输入,输出也是同时输出。

标签:Attention,Self,attention,矩阵,向量,注意力,输入
From: https://www.cnblogs.com/Eleven-Liu/p/17993844

相关文章

  • SelfCF论文阅读笔记
    Abstract讲述现存的挑战,现有的方法通常采用负抽样来区分不同的项目,也就是观察到的用户-项目对被视为正实例,未观察到的对被称为负实例,并且在一个定义的分布下进行采样以进行训练。在大数据集上进行负采样的计算成本高,所以负项目应该在定义的分布下仔细的进行抽样,避免在数据集中观......
  • 李宏毅《机器学习》总结 - Self-attention
    解决的问题:输入\(n\)个向量,输出相同个数的向量。(如,输入一个句子,输出句子中每个词的词性。每个单词转化成向量可以用one-hotvector、wordembedding方法等)一个比较初级的想法:将每个向量都连上去一个FC(fullyconnectednetwork),但是这样有个问题是,如果遇到一个句子中有两个相......
  • 读论文-基于注意力机制的浅层图像隐写分析模型
    前言今天要读的论文是一篇名为《基于注意力机制的浅层图像隐写分析模型》,文章提出了一种基于注意力机制的浅层图像隐写分析模型,通过使用一个浅层神经网络控制模型参数量和训练时间,引入注意力模块,加速模型收敛,提升模型检测的准确率。要引用本文:请使用如下格式:段明月,李爽,钟小......
  • 注意力机制
    注意力机制有一个字典(Python中称为字典,也叫键值对)。我们记为(key,value)。比方说我们有下列腰围体重数据,我们又有一个样本,他的腰围是57,那么我们预测他的体重值是多少呢?或者说我们怎么预测他的体重值呢?由于57到56和58的距离一样,那么我们可以预测他的体重值为它们对应体重的......
  • 初中英语优秀范文100篇-067I'm Proud of Myself-我为自己感到骄傲
    PDF格式公众号回复关键字:SHCZFW067记忆树1I'mproudofmyselfbecauseofawonderfulexperience.翻译我很骄傲,因为我有一段美好的经历。简化记忆骄傲句子结构"I"是主语,表示句子的行动者。"amproudof"是谓语,表示主语的状态或动作。"myself"是宾语,表示动作......
  • static 和 self 区别
    1,在PHP中,我们可以使用newstatic()结合私有构造函数和一个静态方法来实现单例模式。以下是一个简单的例子classSingleton{//私有化构造函数,防止外部直接实例化privatefunction__construct(){}//静态变量用于存储单一实例privatestatic$instan......
  • 读论文-基于注意力机制的对抗性协同过滤推荐算法
    前言今天读的论文为一篇名叫《基于注意力机制的对抗性协同过滤推荐算法》,文中主要介绍了一种基于相关注意力的协同过滤推荐算法,该算法结合深度学习中的注意力机制为不同物品分配不同的权值来捕获与目标物品最相关的物品,探索不同物品的权重对模型预测的影响并以此提升推荐的准确......
  • tensorflow-gpu error:CUDNN_STATUS_ALLOC_FAILED或者self._traceback = tf_stack.extr
    tensorflow-gpuerror:CUDNN_STATUS_ALLOC_FAILED或者self._traceback=tf_stack.extract_stack() 在有些情况下,因为深度学习框架版本更新,细节的变动会使我们的代码最初对应修改:报错信息(出现其中一种):1.Couldnotcreatecudnnhandle:CUDNN_STATUS_ALLOC_FAILED2.self._trac......
  • 《DREEAM Guiding Attention with Evidence for Improving Document-Level Relation E
    代码 原文地址 预备知识:1.什么是K-L散度(Kullback-LeiblerDivergence)?K-L散度,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布来替代观察数据或太复杂的分布。K-L散度能帮助我们度量使用一个分布来近似另......
  • 什么是注意力机制?
    什么是注意力机制注意力机制(AttentionMechanism)是一种在深度学习模型中模拟人类注意力的技术。它的主要思想是,当我们处理一个任务时,我们不会平等地对待所有的信息,而是会将注意力集中在某些关键的部分。例如,当我们阅读一段文本时,我们会更关注与当前任务相关的词汇和句子,而忽略其......