- b1 ,b2...不是依序产生,而是同时被计算好的
从矩阵乘法角度看待self-attention运作过程
- 矩阵运算表示每一个a都要产生 a k v的操作如下:
- 矩阵运算表示的计算如下:
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
因为一张图可以用向量表示,所以我们就可以用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)。 接下来当第二个向量作为输入的时候,前一个时间点“吐”出来的东西也会作为输入丢进循环神经网络里面产生新的向量,再拿去给全连接网络。输入第三个向量时,第三个向量跟前 一个时间点的输出,一起丢进循环神经网络再产生新的输出。输入第四个向量输入时,把第四向量跟前一个时间点产生出来的输出再一起做处理,得到新的输出再通过全连接网络的层。
- 自注意力的每一个向量都考虑了整个输入的序列,而循环神经网络的每一个向量只考虑了左边已经输入的向量,它没有考虑右边的向 量。但循环神经网络也可以是双向的,所以如果用双向循环神经网络(Bidirectional Recurrent Neural Network,Bi-RNN),那么每一个隐状态的输出也可以看作是考虑了整个输入的序列。 但是假设把循环神经网络的输出跟自注意力的输出拿来做对比,就算使用双向循环神经 网络还是有一些差别的。如图 6.40(b) 所示,对于循环神经网络,如果最右边黄色的向量要 考虑最左边的输入,它就必须把最左边的输入存在记忆里面,才能不“忘掉”,一路带到最右 边,才能够在最后一个时间点被考虑。但自注意力输出一个查询,输出一个键,只要它们匹配 (match)得起来,“天涯若比邻”。自注意力可以轻易地从整个序列上非常远的向量抽取信息。
- 自注意力跟循环神经网络还有另外一个更主要的不同是,循环神经网络在处理输入、输 出均为一组序列的时候,是没有办法并行化的。比如计算第二个输出的向量,不仅需要第二 个输入的向量,还需要前一个时间点的输出向量。当输入是一组向量,输出是另一组向量的 时候,循环神经网络无法并行处理所有的输出,但自注意力可以。自注意力输入一组向量,输 出的时候,每一个向量是同时并行产生的,因此在运算速度上,自注意力会比循环神经网络 更有效率。
- 很多的应用已经把循环神经网络的架构逐渐改成自注意力的架构了。
Self-attention for Graph
- 图也可以看作是一堆向量,如果是一堆向量,就可以用自注意力来处理。
- 把自注意力用在图上面,会有些地方不一样:
- 图中的每一个节点(node)可以表示成一个向量。但图还有边(edge)的信息。
- 如果节点之间是有相连的,这些节点也就是有关联的。