4.1 Self-attention

1. 问题引入

  我们在之前的课程里遇到的都是输入是一个向量,输出是类别或者标量.但如果输入是向量的集合且向量长度还会变化,又应该怎么处理呢?
image

1.1 应用实例

1.1.1 文字处理

  文字处理问题就是一个典型的例子.如果将每一个词汇表示成一个向量,那么model的输入就会是一个vector set,且vector set大小每次都不一样.
image
  文字处理的对象是单词,怎么用向量表示不同的单词,不同的向量组合在一起成为句子?

  • 方法一:one-hot 编码;one-hot vector 的维度就是所有单词的数量,每个单词都是一样长度的向量,只是不同单词在不同位置用 1 表示.这个方法不可取,因为单词很多,每一个vector 的维度就会很长,需要的空间太大了,而且看不到单词之间的资讯.
  • word embedding,每个词汇对应的向量不一定一样长,而且类型接近的单词,向量会更接近,考虑到了单词之间的资讯.word embedding怎么实现的可以参照下面链接.

1.1.2 声音信号处理

  会把一段声音讯号取一个范围,这个范围叫做一个窗口(window),把该窗口里面的讯息描述成一个向量,这个向量称为一帧(frame).一小段的声音讯号,它里面包含的讯息量非常可观
image
  frame旁边的三行就是将语音变成向量的做法,想了解可以去搜.
  将window向右移动10ms,又可以形成一个frame.

1.1.3 图

  社交网路是一个图,在社交网路上面每一个节点就是一个人。每一个节点可以看作是一个向量。每一个人的讯息(性别、年龄及工作等等)都可以用一个向量来表示。因此一个社交网路可以看做是一堆的向量所组成
image
  把一个分子当做是模型的输入,每一个分子可以看作是一个图,分子上面的每一个球就是一个原子,每个原子就是一个向量,而每个原子可以用独热向量来表示.
image

1.2 输出的三种可能性

1.2.1 每一个向量都有一个对应的标签

  比如,当模型输入是4个向量的适合,可能就需要输出4个label.
image
  举例:
*
*
*

  • 词性标註(POS tagging):机器会自动决定每一个词彙的词性,判断该词是名词还是动词还是形容词等等
  • 语音辨识
  • 社交网络:每个节点(人)进行标注(是否推送商品)

1.2.2 一组向量序列输出一个标签

  整个序列只需要输出一个标签就好.
image
  举例:

  • 文本情感分析:给机器看一段话,模型要决定这段话是积极的(positive)还是消极的(negative)
  • 语音辨识
  • 分子的疏水性:给定一个分子,预测该分子的亲水性

1.2.3 模型自行决定输出多少个标签

  输入是 N 个向量,输出可能是 N′ 个标签,而N′ 是机器自己决定的.此种任务被称作序列到序列.
image
  举例:

  • 翻译
  • 语音辨识

  本小节只讲第一种类型.

2. Self-attention的基本原理

2.1 以Sequence Labeling为例

  第一种类型也可以叫Sequence Labeling,需要给Sequence里的每一个向量一个label.
  我们可以用Fully-connected network处理这个set vector.把set里的vector都输入进network,得到一个个输出.
image
  但这个方法有很大的瑕疵.因为忽略了序列上下文的关系。同一个词汇在句子中不同的位置、不同的上下文环境下,词汇的词性有可能是不一样的,但此方法的输出会因是同个词汇而永远只有同个输出.
  对上个方法加以改进.一串联若干个向量后丢进 Fully-connected network.给 Fully-connected network 一整个 window 的讯息,让它可以考虑一些上下文,即与该向量相邻的其他向量的讯息.
image
  但是仍然存在一些问题.如果我们需要考虑整个Sequence的资讯,就需要将window开得很大.序列的长度有长有短,输入给模型的序列的长度,每次可能都不一样.开一个 window 比数据集的最长的序列还要长,才可能把整个序列盖住.但是开一个大的窗口,意味著 Fully-connected network 需要非常多的参数,可能运算量会很大,此外还容易过拟合.

2.2 Self-attention model

  这个模型可以解决上面提出的问题.考虑整个序列的所有向量.综合向量序列整体和单个向量个体,得到对每一个向量处理后的向量,将这些向量个别连接一个 FC,FC 可以专注于处理这一个位置的向量,得到对应结果.
image
  自注意力模型不是只能用一次,可以叠加很多次,与 FC 可以交替使用
image

2.2.1 Self-attention 内部架构

  • 输入:一串的 vector,这些 vector 可能是整个 network 的 input,也可能是某个 hidden layer 的output
  • 输出:处理 input 以后,每一个 b 都是考虑了所有的 a 以后才生成出来的
    image
      那么b1是怎么综合考虑a1a2...a4呢?

2.2.2 Self-attention 具体步骤

  1. 根据 a1 这个向量找出跟其他向量的相关程度 α.
  2. 借由一个计算 attention 的模组来得到 α.(q = query、k = key)
    image
      计算α有多种方法.这里介绍两种.
  • Dot-product:把输入的两个向量分别乘上 WqWk,得到两个向量 qk 后做点积,把它们做逐元素(element-wise)的相乘,再全部加起来得到一个 α(常用,也被用在 Transformer 中).
  • Addtive:两个向量通过 WqWk 得到 qk 后,把 qk 串起来丢到 tanh 函数(activation function),再乘上矩阵 W 得到 α.
      虽然方法很多,但接下来的讨论里,我们更偏向左边的方法.
  1. 计算完 a1 跟其他向量的相关性 α 后(也必须计算 a1 跟自己的 α),把所有的 α 经过 softmax(也可使用其他激励函数,如:ReLu)得到.

image
4. 把向量 a1 ~ a4 乘上 Wv 得到新的向量:v1v2v3v4(为了抽取重要资讯),接下来把每一个向量都去乘上 α 后再求和得到b1.
image
  如果 a1a2 有高相关性,即 α1,2 的值很大,再做加权和后,得到的 b1 就可能会比较接近 v2.所以谁的注意力的分数最大,谁的 v 就会主导(dominant)抽出来的结果.

注意:b1b4 是同时被计算出来的

2.2.3 从矩阵角度讲解内部实现

  1. 先计算 q,k,v,合併后以 Q,K,V 表示.ai的合并可以用I表示,每个col都表示一个ai.
    image
  2. 根据 Q,KT 计算 α,经过一激励函数,如:softmax 或 ReLu,得到 A(称做 attention matrix).因为需要将k向量转置一下,再去和 q向量做计算,这样得出的α才会是一个数值,而不是向量!
      先看左边四个式子,转置后的 k向量:1x n;q向量:n x1,所以两者相乘后的 α :1x1.再看右边四个式子,转置后的 K矩阵:4x n;q向量:n x1,所以两者相乘后的 α 组成矩阵:4x1.
    image
      上面只涉及q1,而没有q2 q3,现在把这三个q加进来,变成下图最下面的式子.
    image
  3. V 再乘以 A 得到 b,以 O 表示.
    image

  综合:

  • 每 vector 以 column 并起来称做 I 矩阵,I 是 Self-attention 的一组 vector input
  • 这些 input 分别乘上 Wq,Wk,Wv 矩阵得到 Q,K,V
  • 接下来 Q 乘上 KT 得到 A,再经过激励函数得到 AAttention Matrix(生成 Q 就是为了得到 attention 的 score)
  • A 再乘上 V,就得到 OO 就是 Self-attention 这个 layer 的输出
  • Wq,Wk,Wv 是三个要学习的矩阵参数
    image

3. Multi-head Self-attention

  Multi-head Self-attention 的使用非常广泛,有一些任务,如翻译、语音识别等,用该方法可以得到较好的结果.需要多少的 head 是需要调的 hyperparameter.
  那么为什么使用Multi-head Self-attention?在使用 Self-attention 计算相关性的时,是用 q 去找相关的 k。但是"相关"有很多种不同的形式,所以也许可以有多个 q,不同的 q 负责不同种类的相关性,这就是 Multi-head Self-attention.
image
  实现步骤:

  1. 先把 a 乘上一个矩阵得到 q.
  2. 再把 q 乘上另外两个矩阵,分别得到 q1q2,代表有两个 head;同理可以得到 k1, k2,v1,v2.
  3. 从同一个 head 里的 k,q,v 计算 b.
    image
  4. 将各个 head 计算得到的 b 拼接,通过一个 transform 得到 bi 然后再送到下一层.
    image

4. Positional Encoding

  到目前为止,Self-attention 的操作里面没有位置的讯息,但有时候位置的讯息很重要.举例,在做词性标注时,动词较不容易出现在句首,如果某一词汇是放在句首,其为动词的可能性就比较低,所以位置的讯息往往也是有用的.
  方法:

  • 每个位置用一个 vector ei来表示它是 sequence 的第 i 个,然后加到原向量中.每个不同的位置就有不同的vector
    image
      产生 positional encoding vector 的方法有很多种,如人工设置、根据资料训练出来等,目前还不知道哪一种方法最好,仍是一个尚待研究的问题.

5. application

5.1 NLP

  在自然语言处理领域,除了 Transformer 外,BERT 也用到了 Self-attention.
image

5.2 语音

  把一段声音讯号表示成一组向量的话,这组向量可能会非常地长.假如输入的向量集有 L个向量,那么计算出的 attention score 组成的矩阵大小将是L×L.L太大,矩阵就会太大,不易于训练!
  所以考虑资讯的时候,限制计算相关性的范围,而不是整个sequence!有点类似CNN中感受域的思想.
  准确来说,延伸 Self-attention 的概念,运用 Truncated Self-attention.使用 Truncated Self-attention 只考虑一个小范围(人为设定)语音,而不考虑一整个句子,如此就可以加快运算的速度.
image

5.3 图像

  图片也可以看成由不同向量组成的向量集.图下表示了一个pixel可以被表示成一个三维的向量.
image
  下面这个模型就是利用Self-attention来处理图片的例子.
image

5.4 Graph

  Self-attention 也可以在图中使用,把 node 当作 vector.然而,图中的 edge 意味著节点之间的关系,所以我们就可只计算有 edge 相连的 node 的 attention,若两个 node 之间没有 edge,代表两个 node 没有关系,就不必计算 attention.这种方法也被称为图神经网路(GNN).
image

6. 模型对比

6.1 Self-attention vs CNN

  CNN 可以看成简化版的 self-attention,CNN 就是只计算感受域中的相关性的self-attention.CNN 是人为决定感受域的形状大小,self-attention 的感受域是机器自己学出来的(自己决定其他pixel向量的权重),可以是奇奇怪怪形状的.
image
  结论:

  CNN 就是 self-attention 的特例,可说是更 flexible 的 CNN,Self-attention 只要设定合适的参数,它可以做到跟 CNN 一模一样的事情。根据 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 这篇 paper 显示的结果,给出以下解释:

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

6.2 Self-attention vs RNN

  Recurrent Neural Network 跟 Self-attention 做的事情非常像,它们的 input 都是一个 vector sequence,前一个时间点的输出也会作为输入丢进 RNN 产生新的向量,也同时会输入到 FC。很多的应用往往都把 RNN 的架构逐渐改成 Self-attention 的架构.
image
  主要区别:

  • 对 RNN 来说,假设最右边黄色的 vector 要考虑最左边的输入,那它必须要把最左边的输入存在 memory 中都不能够忘掉一路带到最右边,才能够在最后的时间点被考虑
  • 对 Self-attention 来说没有这个问题,它可以在整个 sequence 上非常远的 vector之间轻易地抽取讯息

7. Learn More

  elf-attention 有多种变形,由于其计算成本高,减少其计算量是未来的研究方向。Long Range Arena: A Benchmark for Efficient Transformers 这篇论文比较了各种不同的自注意力的变形,许多 Self-attention 的变形如:Linformer、Performer、Reformer 等等,往往比原来的 Transformer 性还能差一些,但是速度会比较快。想进一步研究可参考 Efficient Transformers: A Survey 这篇论文.
image

posted @   acmloser  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-07-02 Count on a tree SPOJ - COT
2021-07-02 AcWing 255. 第K个数
点击右上角即可分享
微信分享提示