热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【自然语言处理】:自注意力机制(selfattention)原理介绍

一.最常见的self-attention对于自注意力机制而言,我们有的时候会遇到词性分类的任务,比如说给定一句话,我想知道这句话当中每一个单词的词性。但是使用双向lstm呢,会有很

一.最常见的self-attention  

  对于自注意力机制而言,我们有的时候会遇到词性分类的任务,比如说给定一句话,我想知道这句话当中每一个单词的词性。但是使用双向lstm呢,会有很多信息被忽略掉,尤其是一些位于后面的词很可能前面的词对它的影响没有那么大,即使我们的lstm考虑了一些遗忘门,增强记忆的一些机制,位于最前面的单词和最后面的单词之间始终是具有一定距离的,而self-attnetion则可以直接对收尾的单词计算其相关性,没有任何的数据损失。因此我们可以采用自注意力机制,也就是self-attention来解决这个问题。同时self-attention在transformer当中也有着广泛的应用。

【自然语言处理】:自注意力机制(self-attention)原理介绍

 

 

   如上图所示,蓝色部分表示self-attention,首先我们self-attention找到每一个向量之间的联系,看是否考虑某一个向量对第一个向量a1会产生影响。而我们可以通过如下的方法来计算两个向量之间的相关联程度。如下图所示:

【自然语言处理】:自注意力机制(self-attention)原理介绍

 

 

  首先,我们拿到绿色的部分 。绿色的部分表示的就是我们输入的向量,a1和a2 ,灰色的Wq和Wk表示我们用a1去和Wq相乘,得到一个向量q,然后使用a2和Wk相乘,得到一个数值k。最后使用q和k进行一个dot product。得到我们的a,a也就是表示两个向量之间的相关联程度。在 transformer当中使用了这样的结构来计算向量之间的相关联性。另外一种方法我们有事也会用到,如下图所示:

【自然语言处理】:自注意力机制(self-attention)原理介绍

 

 这种机制也是想相乘,后相加,然后使用tanh投射到一个新的函数空间内,再相乘,得到最后的结果。我们对每一个输入的向量都做这样的操作。

当然在得到这个相关程度的结果之后,我们使用softmax计算出一个attention distribution。当然你也可以使用relu来计算,完全看你自己的意愿了。拥有了这个attention distribution我们就知道了哪些向量和我们的a1是最有关系的。

【自然语言处理】:自注意力机制(self-attention)原理介绍

 

 接下来,就来到了我们self-attention当中的一个难点,既然我们目前已经得到了每一个向量和a1之间的相关联程度,那么我们通过这些相关联的程度,再做一次计算。得到一个唯一的数值,再将所有的相关联程度和这个唯一的数值b1相比较,就可以得到最终我们某个向量和某个向量之间的相似程度了。越接近b1的数值,那么我们就越和a1相似。

【自然语言处理】:自注意力机制(self-attention)原理介绍

 

 如上图所示,我们使用新的矩阵WV乘上原始矩阵a1,得到一个新的矩阵v1,然后这个矩阵a1再和上main的矩阵相乘,最后每一个向量都做这样的一个操作,就可以得到最后的矩阵,也就是b1了!

二.Multi-Head Self-Attention

在transformer当中,其中应用最广泛的一种self-attention机制,还有一种叫做multi-head self-attention。

这种attention也就是说,对于同一个向量a而言,我们可以具备多组q,k,v来描述a这同一个向量。之前我们仅仅才用了一组q,k,v来描述我们的向量。采用多组向量之后,我们分别对每一组进行计算其b的值,如果有两组,则有两个b的值。如下图所示:

【自然语言处理】:自注意力机制(self-attention)原理介绍

 

由于这张图我们只对v2做了一个weighted sum,得到一个b1的值。当然我们由于两组这样的值,因此我们会得到两个b值。最后的结果如下所示

【自然语言处理】:自注意力机制(self-attention)原理介绍最后我们将两个b的值一起乘以一个矩阵W0,得到最终的bi的值,也就是这个self- attention向量ai的输出。

三.Positional Encoding

由于我们在训练self attention的时候,实际上对于位置的信息是缺失的,对于lstm或者rnn而言,位置的信息是非常明显的。因此我们可以对每个输入的向量进行positianl encoding,也就是说,在每个输入的向量之间我们可以新建立一个向量,对我们的position进行相应的描述。下面是positianl encoding的一个定义:
【自然语言处理】:自注意力机制(self-attention)原理介绍

 

 也就是说我们可以在插入向量的左边,插入一个有关位置信息的向量ei,插入后的向量如下所示:

【自然语言处理】:自注意力机制(self-attention)原理介绍而这个技术经常会在我们的transformer当中所采用到。


推荐阅读
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
author-avatar
爱情de眷恋_558
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有