李宏毅机器学习2022年学习笔记(四)-- 注意力机制

一、 Self-attention

 1. 特点

输出对每一个向量处理后的带黑框的向量(考虑整个序列 sequence 和 单个向量个体 的 信息)。将这些向量再连接一个 FC 全连接层,输出标签,得到对应结果

其中,self-attention 的功能是处理整个 sequence 的信息,而 FC 则是处理某一个位置的信息,Self-attention + FC 可以交替使用,知名文章:Attention is all you need ⇒Transformer

 2. 基本原理

 输入:一串的 Vector,这个 Vector 可能是整个 Network 的 Input,也可能是某个 Hidden Layer 的 Output

输出:处理 Input 以后,每一个 bi 都是考虑了所有的 ai 以后才生成出来的

 

具体步骤如下:

1. 以 a1 为例,根据 a1 这个向量,找出整个 sequence 中跟 a1 相关的其他向量 ⇒ 计算哪些部分是重要的,求出 ai 和 a1 的相关性(影响程度大的就多考虑点资讯),用 α 表示

 2. 计算相关性:有 点积 和 additive 两种方法计算相关性,我们主要讨论 点积 这个方法。输入的两个向量分别乘不同的矩阵,左边这个向量乘上矩阵  Wq 得到矩阵 q(query),右边这个向量乘上矩阵 Wk 得到矩阵 k(key),再把 q 跟 k 做 dot product(点积),逐元素相乘后累加得到一个 scalar 就是 相关性 α

把 a1 乘上 Wq 得到 q叫做 Query(就像是搜寻相关文章的关键字,所以叫做 Query)

然后将 ai 都要乘 Wq 得到 k,叫做 Key,把这个Query q1 和 Key ki 进行 点积操作 就得到 相关性 α( α 叫做 Attention Score,表示 Attention计算出的 vector 之间的相关性)


 

attention score 还要经过一层 softmax 才能用于后续处理,其中 softmax 也可以换成其他的 activation function

 

3. 分别抽取重要信息,根据关联性作加权求和得到  bi (一次性并行计算出 bi ,不需要依次先后得出)

优点:bi 是并行计算得出

 

 

 3. 矩阵的角度表示 Self-attention 计算过程

① 计算 k,q,v (其中 Wq 、Wk 和 Wv 都是要学习的网络参数矩阵)

 

② 计算 α 并 Normalization

 

③ 计算 b

 其中,

  • I 是 Self-attention 的 input(一排 vector),每个 vector 拼起来当作矩阵的 column
  • 这个 input 分别乘上三个矩阵, 得到 Q K V
  • 接下来 Q 乘上 K 的 transpose,得到 A 。可能会做一些处理,得到 A' ,叫做Attention Matrix生成 Q 矩阵就是为了得到 Attention 的 score
  • A' 再乘上 V,就得到 O,O 就是 Self-attention 这个 layer 的输出

 

二、Multi-head Self-attention

1. 特点

使用多个 q  k  v  组合,不同的 q k v 负责不同种类的相关性

例如在下图中,一共有2类, 1类的放在一起算,2类的放在一起算。相关性变多了,所以参数也增加了,原来只需要三个 W 矩阵,现在需要六个 W 矩阵

 

 2. 计算步骤

  • 先把 a 乘上一个矩阵得到 q

  • 再把 q 乘上另外两个矩阵,分别得到  q1 跟  q2,代表有两个 head;同理可以得到 k1, k2,v1, v2

  • 同一个 head 里的  k  q  v 计算 b.

  • 将各个 head 计算得到的  bi 拼接,通过一个 transform得到 bi,然后再送到下一层去

 

 3. Positional Encoding

每个向量所处的“位置”需要被编码

方法:每个位置用一个 vector ei 来表示它是 sequence 的第 i 个。加和到原向量中。

 

三、Self-attention 和 CNN RNN GNN

1. 和CNN的对比

CNN 可以看成简化版的 self-attention,CNN 就是只计算感受域中的相关性的self-attention。

  • CNN:感知域(receptive field)是人为设定的,只考虑范围内的信息
  • Self-attention:考虑一个像素和整张图片的信息 ⇒ 自己学出“感知域”的形状和大小

 

结论:

CNN 就是 Self-attention 的特例,Self-attention 只要设定合适的参数,就可以做到跟 CNN 一模一样的事情

self attention 是更 flexible 的 CNN

⇒ self-attention需要 更多的数据 进行训练,否则会 欠拟合;否则CNN的性能更好

  • Self-attention 它弹性比较大,所以需要比较多的训练资料,训练资料少的时候,就会 overfitting
  • 而 CNN 它弹性比较小,在训练资料少的时候,结果比较好,但训练资料多的时候,它没有办法从更大量的训练资料得到好处

     

 

2. 和 RNN 的对比

  • 对 RNN 来说,最终的输出要考虑最左边一开始的输入 vector,意味着必须要把最左边的输入存到 memory 里面并且在计算过程中一直都不能够忘掉一路带到最右边,才能够在最后一个时间点被考虑(依次按顺序输出)
  • 对 Self-attention 可以在整个 sequence 上非常远的 vector之间轻易地抽取信息(并行输出,速度更快,效率更高)

     

 

3. 和 GNN 的对比

  • 在 Graph 上面,每一个 node 可以表示成一个向量
  • node 之间是有相连的,每一个 edge 标志着 node 跟 node 之间的关联性
  • 比如:在做Attention Matrix 计算的时候,只需计算有 edge 相连的 node
  • 因為这个 Graph 往往是人為根据某些 domain knowledge 建出来的,已知这两个向量彼此之间没有关联(图矩阵中对应结点 i 与 结点 j 之间没有数值),就没有必要再用机器去学习这件事情
    •  

posted @ 2022-05-12 17:20  zyddd915  阅读(1553)  评论(0编辑  收藏  举报