李宏毅 X 苹果书 自注意力机制 学习笔记下

  • b1 ,b2...不是依序产生,而是同时被计算好的

从矩阵乘法角度看待self-attention运作过程

  •  矩阵运算表示每一个a都要产生 a k v的操作如下:

  •  矩阵运算表示\alpha的计算如下:

A‘是A的normalization ,用softmax

 

  •  矩阵运算表示b计算步骤如下:

 

  •  矩阵运算表示self-attention的全过程: 

    Self-attention的进阶版本---->Multi-head Self-attention

  •  是今天广泛使用的
  • head数是个超参数
  • 多个q,不同q负责不同领域的相关性
  • Multi-head Self-attention操作过程:

得到qi之后,再乘以n个W,qi,n(=head):i表示位置,n表示这个位置的第一个q,有几个qi,n就说明有几个不同的相关性

 


 Self-attention少了位置信息:每一个input出现在sequence的位置确定不了,没有相关的资讯,对于Self-attention,所有的input的位置都是一样的

添加Self-attention中input资讯的方法---Positional Encoding

为每一个位置设置一个vector---positional vector

 


 Truncated self-attention

Truncated self-attention引入

  • self-attention在NLP应用比较广泛,也可以应用到speech中,但是在speech中,要对self-attention做一点改动,如下:
  • 语言变成向量,这个向量级会很长,在计算注意力矩阵的时候,其复杂度(complexity)是长度的平方。假设该矩阵的长度为 L,计算注意力矩阵 A 需要做 L × L 次的内积,如果 L 的值很大,计算量就很可观,并且需要很大内存(memory)才能够把该矩阵存下来。所以如果在做语音识别的时候,我们讲一句话,这一句话所产生的这个注意力矩阵可能会太大,大到不容易处理,不容易训练。为了解决以上问题,我们采用Truncated self-attention

Truncated self-attention操作过程:

不看整个sequence,只看一个小的范围(这个范围是个超参数)=》可以加快运算速度

只看一个小的范围的原因取决于你对问题的理解,该问题需要sequence的哪一处,我们就截取那一处前后的资讯


Self-attention for lmage

一张图像可以看作是一个向量序列,如下图   所示,一张分辨 率为 5 × 10 的图像(图 a )可以表示为一个大小为 5 × 10 × 3 的张量(图 b ), 3 代 表 RGB 3 个通道( channel ),每一个位置的像素可看作是一个三维的向量,整张图像是 5 × 10 个向量。

 

 因为一张图可以用向量表示,所以我们就可以用self-attention处理图像


 self-attention  vs CNN

  •  CNN是简化版的self-attention:self-attention一次性考虑全部的sequence,而CNN的滤波器只是sequence的一个子集。
  • self-attention会以pixel为中心,去考虑哪些pixel是相关的,此时的receptive field不再是人工划定的,而是机器自己学出来的
  • CNN是self-attention的特例,self-attention只要设定合适的参数,进行一些限制,就能做到CNN做到的事

 比较大的model就需要更多的data,要不然就可能overfitting;比较小的model在data比较小的时候就比较不容易overfitting

用不同的data量训练CNN和self-attention,会得到如下的实验结果:(只是众多实验数据中的一个哈,不是绝对结果),原因是 :比较大的model就需要更多的data,要不然就可能overfitting;比较小的model在data比较小的时候就比较不容易overfitting


Self-attention vs.RNN 

  • 目前,循环神经网络的角色很大一部分都可以用自注意力来取代了。
  • 循环神经网络跟自注意力输入都是一个序列的状况。
  • 简述RNN:在RNN中有一个输入序列、一个隐状态的向量、一个循环神经网络的(block)。循环神经网络的块“吃”记忆的向量,输出一个东西。这个东西会输入全连接网络来进行预测。 循环神经网络中的隐状态存储了历史信息,可以看作一种记忆(Memory)。 接下来当第二个向量作为输入的时候,前一个时间点“吐”出来的东西也会作为输入丢进循环神经网络里面产生新的向量,再拿去给全连接网络。输入第三个向量时,第三个向量跟前 一个时间点的输出,一起丢进循环神经网络再产生新的输出。输入第四个向量输入时,把第四向量跟前一个时间点产生出来的输出再一起做处理,得到新的输出再通过全连接网络的层。
Self-attention vs.RNN :
  1. 自注意力的每一个向量都考虑了整个输入的序列,而循环神经网络的每一个向量只考虑了左边已经输入的向量,它没有考虑右边的向 量。但循环神经网络也可以是双向的,所以如果用双向循环神经网络(Bidirectional Recurrent Neural NetworkBi-RNN),那么每一个隐状态的输出也可以看作是考虑了整个输入的序列。 但是假设把循环神经网络的输出跟自注意力的输出拿来做对比,就算使用双向循环神经 网络还是有一些差别的。如图 6.40(b) 所示,对于循环神经网络,如果最右边黄色的向量要 考虑最左边的输入,它就必须把最左边的输入存在记忆里面,才能不“忘掉”,一路带到最右 边,才能够在最后一个时间点被考虑。但自注意力输出一个查询,输出一个键,只要它们匹配 match)得起来,“天涯若比邻”。自注意力可以轻易地从整个序列上非常远的向量抽取信息。
  2. 自注意力跟循环神经网络还有另外一个更主要的不同是,循环神经网络在处理输入、输 出均为一组序列的时候,是没有办法并行化的。比如计算第二个输出的向量,不仅需要第二 个输入的向量,还需要前一个时间点的输出向量。当输入是一组向量,输出是另一组向量的 时候,循环神经网络无法并行处理所有的输出,但自注意力可以。自注意力输入一组向量,输 出的时候,每一个向量是同时并行产生的,因此在运算速度上,自注意力会比循环神经网络 更有效率。
  • 很多的应用已经把循环神经网络的架构逐渐改成自注意力的架构了。

 


Self-attention for Graph 

  • 图也可以看作是一堆向量,如果是一堆向量,就可以用自注意力来处理。
  • 把自注意力用在图上面,会有些地方不一样:
  • 图中的每一个节点(node)可以表示成一个向量。但图还有边(edge)的信息。
  • 如果节点之间是有相连的,这些节点也就是有关联的。
之前在做自注意力的时候,所谓的关联性是网络自己找出来的。但是现在既然有了图的信息,
关联性就不需要机器自动找出来,图上面的边已经暗示了节点跟节点之间的关联性。所以当
把自注意力用在图上面的时候,我们可以在计算注意力矩阵的时候,只计算有边相连的节点
就好。
举个例子,如下图所示,在这个图上,节点 1 只和节点 5 6 8 相连,因此只需要计 算节点 1 和节点 5 、节点 6 、节点 8 之间的注意力分数;节点 2 之和节点 3 相连,因此只需要计算节点 2 和节点 3 之间的注意力的分数,以此类推。如果两个节点之间没有相连,这个节点之间就没有关系。既然没有关系,就不需要再去计算它的注意力分数,直接把它设为 0 就好了。因为图往往是人为根据某些领域知识(domain knowledge )建出来的,所以从领域知识可知这两个向量之间没有关联,就没有必要再用机器去学习这件事情。当把自注意力按照这种限制用在图上面的时候,其实就是一种图神经网络(Graph Neural Network GNN

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值