Attention ia all you need论文原文

仅供自我学习使用

Self-attention想要解决的问题:目前input都是一个向量,输出可能是一个数值,一个类别,那么如果输入是一排向量呢,且输入的向量数可以改变的话,如何处理。

1.输入为一排向量

例子:一句英文,一段声音信号,图

比如输入一句英文,那么句子单词数不一样,每次输入的向量数就不同。

如何把单词看作向量

(1)One-hot Encoding

一个单词可以看作一个向量,比如这个世界上有100个单词,开一个100维的向量,每一个维度对应一个词汇,把他们不同位置上搞成1,那么就可以把这100个单词搞成不同的向量,但是有一个问题就是,他们之间没啥关系

(2)Word Embedding

给每一个词汇一个向量,向量有语义的咨询,意思就是,画出来的话,所有的动物都在一坨,植物都在一坨

2.输出

2.1 输入输出长度相同:每一个输入向量都有一个对应的label(Sequence Labeling)

各个击破,把每一个向量分别输入到全连接网络中,全连接网络就会有对应的输出。但有问题,比如词性标记问题,I saw a saw,前后两个单词相同,但我们想得到的词性是不同的,但对于Fully-connected network来说,两个saw一样,输出也会相同。那我们就想让Fully-connected network考虑上下文的信息,让前后几个向量合成一个window进入Fully-connected network,就好很多,但是还不够好,提出的解决办法就是,让window大点,覆盖整个Sequence都进入Fully-connected network,但是Sequence有长有短,覆盖整个Sequence的话,Fully-connected network参数就会很大,所以更好的方法就是Self-attention。

经过Self-attention的四个输入考虑了一整个的Sequence,在经过Fully-connected network得到的结果会更好,且Self-attention可以叠加使用。

2.2 一整个sequence只需要输出一个label

2.3 不到输出几个label,机器自己决定(sequence to sequence)

3.Self-attention如何输出

这部分就是讲一下上图中的小长方形如何变成带黑边的小长方形(为方便:输入a1,a2,a3,a4经过Self-attention输出b1,b2,b3,b4)

根据a1找出这个sequence中跟a1相关的其他向量,每一个向量跟a1的关联程度用 α 来表示,那么就有一个问题:Self-attention的module怎么自动决定两个向量之间的关联性呢?

这就需要一个计算的attention模组,这个模组需要两个向量的输入,然后直接输出 α 的数值。

3.1 Dot-product

输入的两个向量分别乘上两个不同的矩阵得到q , k两个向量,然后将得到的向量相乘得到 α

3.2 Additive

输入的两个向量分别乘上两个不同的矩阵得到q , k两个向量,然后将得到的向量相加穿串起来,经过两个啥玩意,在得到α

3.3 Self-Attention中的α的求解方法:

分别计算a1,a2,a3,a4的关联性

q:query,后续会去和每一个k kk进行匹配
k :key,后续会被每个q qq匹配
v:从a 中提取得到的信息

得到了四个α 之后,我们分别对其进行softmax,得到四个α尖,增加模型的非线性。(此处的Softmax也可以是其他的,比如ReLU)

然后根据α尖抽取句子中重要的东西,X{i}乘上W^{v}得到v^{i},v^{i}再乘上α尖,再相加得到b^{1},关联性强的话,同样的计算过程,我们对剩下的 a 都进行一次,就可以得到其他的 b。每个b 都是综合了每个 a 之间的相关性计算出来的,这个相关性就是我们所说的注意力机制,。那么我们将这样的计算层称为self-attention layer。

从矩阵方面来看,I为输入,与矩阵相乘得到Q,K,V,Q与K的转置相乘得到A,A经过进一步的处理得到A‘,A'我们称之为attention matrix注意力矩阵,A’乘上V得到O,O就是Self-Attention的输出。其中,Self-Attention的参数需要修改的:W^{q}W^{k}W^{v}

4. 进阶版本:multi-head attention

有些情况下,相关性有多种不同的定义,因此就需要multi-head attention。即使用多个k , q , v,得到多个相似度之后拼接起来然后乘以一个矩阵得到最终的输出。

5. positional encoding位置编码

但是问题在于: 这样的机制没有考虑输入sequence的位置信息。就是说我们上面标出的1,2,3,4这几个对于他来说都一样,即将位置打乱后没有任何差别。所以你输入"A打了B"或者"B打了A"的效果其实是一样的,因此需要将位置的信息加入进去, 在self-attention中使用positional encoding位置编码方法。

每一个位置都有一个位置矢量e^{i},把e^{i}加到a^{i}上,相当于告诉他,现在出现的位置在i这个位置。

如果sequence过长,可以使用truncated self-attention,即计算相似度时限制范围。

6.Self-Attention 对比

6.1 Self-Attention 对比 CNN

参考文献:https://arxiv.org/abs/1911.03584
CNN可以看成是简化版的Self-Attention,CNN只计算了receptive field范围内的相似度, self-attention考虑了整张图像的相似度。self-attention是复杂版本的CNN,即self-attention是自动学习receptive field,CNN是self-attention的特例。但是self-attention需要更多的数据集,而CNN需要的数据量相对较少。

6.2 self-attention对比RNN

参考文献: https://arxiv.org/abs/2006.16236

RNN会存在长期记忆遗忘的问题,self-attention没有。RNN是串行输出, 而self-attention则可以并行处理,可以一次性一起输出。因此self-attention计算效率更高。

自注意力机制超级详解(Self-attention)相关推荐

  1. NLP中的Attention注意力机制+Transformer详解

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者: JayLou娄杰 知乎链接:https://zhuanlan.zhihu. ...

  2. 【李宏毅】注意力机制+transformer详解

    Transformer 背景 关于RNN详解可以看这篇博客:循环神经网络 RNN一般被用来处理序列输入的,但是它有一个缺点就是不能并行化,后面一个神经元的输入要依赖与之前神经元的输出. 然后就有人提出 ...

  3. Transformer和自注意力机制Self-Attention详解和时间复杂度计算+Image Transformer简介

    Transformer 背景 注意力机制已经在编码器解码器模型中广泛应用,极大提升了模型性能.我们为什么不能尝试完全抛开RNN.CNN等传统结构,直接尝试使用注意力机制来捕捉输入和输出之间的依赖呢? ...

  4. 注意力机制基本原理详解及应用

    注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理.语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影.所以,了解注意力机制的工作原理对于关注深度学习技术发展的技 ...

  5. 图片的描述生成任务、使用迁移学习实现图片的描述生成过程、CNN编码器+RNN解码器(GRU)的模型架构、BahdanauAttention注意力机制、解码器端的Attention注意力机制

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  6. 在VM虚拟机中 CentOS7安装VMware Tools(超级详解)

    ** 在VM虚拟机中的CentOS7的linux系统中安装VMware Tools(超级详解) ** 一.明白为什么这么做? 为什么要安装vmtools? vmtools 安装后,可以让我们在wind ...

  7. mysql select 缓存_mysql select缓存机制使用详解

    mysql Query Cache 默认为打开.从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过qu ...

  8. java 委托机制_通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...

  9. java委托机制教程_通过反射实现Java下的委托机制代码详解

    简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...

最新文章

  1. 华理c语言设计网上作业,华东理工大学第一学年第二学期网上作业参考答案C语言设计1...
  2. Windows上的音频采集技术
  3. Anaconda——安装与添加 Anaconda Python 免费仓库
  4. 【Luogu3932】浮游大陆的68号岛
  5. 2020年11月3日 星期二 工作日志 github登陆不了了,晕
  6. JS控制锚点打开新窗口
  7. sap事务代码_「SAP技术」SAP MM 事务代码ME17的用法
  8. [浪风分享]推荐一些不错的计算机书籍
  9. MATLAB与Excel文件的交换
  10. Viojs P1484 ISBN号码
  11. 致翔OA漏洞复现手册
  12. 权变理论计算机管理理论,现代管理理论的主要学派
  13. spring security实现注解式权限管理时不成功,注解@Secured 无效
  14. 梅西明明有高薪为什么还努力踢球?
  15. ThreadX分析(一)
  16. 再谈SG函数和SG定理
  17. .net 后台数据校验,电话号码,邮箱地址,IP有效性
  18. 杀毒软件引起共享打印机不能打印
  19. “指定的网络名不再可用的”新解决案例
  20. PHP基础面试问题汇总

热门文章

  1. 全地形比赛小车制作分享
  2. JAVA怎么才能强制换行_Java利用POI生成Excel强制换行(转载)
  3. 强制换行Java_HTML连续英文字符串强制换行
  4. QBXT 2018春季DP图论班 2018.4.29 --- 图论基础
  5. mysql截取字符串去重_mysql函数之截取字符串
  6. Python程序设计与科学计算精录总结Episode.4 Python进阶:自动化办公应用(基于Michael导师Python课程与VS2019)
  7. 深度主动学习综述2020
  8. Mybatis学习(二):初窥秘境
  9. B站设置NFT小钻石头像教程
  10. python将数字转字符串_python中如何将数字转字符串