self attention

Self-Attention 模型

Self Attention 是一种给定 n 个输入,给出 n 个输出的模型,通过全连接层进行预测和分类。Self Attention 内部的架构会在下面进行讲解。

全连接网络的局限性

不擅长处理多个向量作为输入

全连接网络不擅长处理将多个向量作为输入,产生数值或者分类。但存在很多的任务需要输入多个向量,用来产生数值或者是分类。

多向量作为输入

文字处理

文字处理任务需要将多个向量输入到模型,输入的每个向量可以是通过 One-Hot 编码过的向量(向量之间的相关性无法体现),也可以是通过词嵌入形成的向量(在高维空间中相关的单词会汇聚在一起)。

语音处理

语音处理也是把多个向量作为输入,一般是每 25ms 对音频采样一次,但是会向右移动 10ms 位置(这就意味着会有 15ms 的音频信息会被重复采样),然后利用 400 sample points (16KHz)、39-dim MFCC 或者是 80-dim filter bank output 3 种方法提取声学特征。这样每 25ms 提取到的声学特征组成一个向量,这样的一个向量称为一个 frame。

图信息是把每个节点作为一个向量进行输入,一个图存在多个节点,所以是多输入问题。

输出的形式

输出向量的个数可以是跟输入向量的个数相同的,例如在词性标注问题上,输入 N 个单词,就要给出这 N 个单词的词性。在语音识别问题上,输入 n 个向量就要给出这 n 个向量的 Grapheme 表示。

可以是输入 n 个向量,输出一个向量。例如在情感预测上,给出一个句子,判断句子的情感是消极的还是积极的。在语者识别任务中,给出一段录音,识别这断录音是谁讲的。

也可以是输入 n 个向量,输出 m 个向量,例如机器翻译任务。

上下文无关

上下文无关

当前的输入没有依赖上下文的输入,上图中的两个 saw 在不依赖上下文的情况下是一样的,但是在原文中,第一个 saw 是动词,而第二个 saw 是名词,所以上下的信息是重要的信息。

在这种情况下虽然把上下文信息加入到了当前输入,但是窗口的大小是无法确定的,一方面是由于句子的大小无法确定,另一方面是因为窗口太小,上下文信息考虑的不全面,窗口太大,导致参数过多,训练困难。

Self Attention 的优势

全局性

Self Attention 在产生一个输出的时候,会考虑到所有的输入。

Self Attention 在经过全连接层之后可以再接多个 Self Attention

并行运算

Self Attention 可以轻松的做到并行运算,提升效率。

Self Attention 的计算

Self Attention 中的每个向量都会跟其他向量计算产生一个 $\alpha$ 值,在上图中只显示了 $a^1$ 与 $a^2$、$a^3$、$a^4$ 的计算,实际上 $a^1 与 a^1 $ 自己也会计算 $\alpha$ 值。另外 $a^2、a^3、a^4$ 都会与每个向量计算 $\alpha$ 值,图中也没有画出,下面会讲解。

$\alpha$ 值的计算主要有两种方法,但是下面的计算使用的是第一种方法。

首先按照红框计算出 $q^1$,按照黄色框计算出 $k^1、k^2、k^3、k^4$,然后$q^1 和 k^1、k^2、k^3、k^4$ 分别做内积计算出 $\alpha_{1,1},\alpha_{1,2},\alpha_{1,3},\alpha_{1,4}$(上面说的步骤都是根据 Dot-product 计算出来的),$\alpha_{1,1},\alpha_{1,2},\alpha_{1,3},\alpha_{1,4}$ 每个值都称为 Attention 得分,将 Attention 得分输入到 softmax,得到概率值$\alpha_{1,1}’、\alpha_{1,2}’、\alpha_{1,3}’、\alpha_{1,4}’$。

按照橙色框计算出 $v_1、v_2、v_3、v_4$,然后按照粉色框计算出 $b^1$

$b^2$ 的计算与 $b^1$ 是一样的,按照同样的步骤计算出 $b^3、b^4$。

Self Attention 的并行计算

并行获取 $q^i、k^i、v^i$的值

并行获取 $\alpha_{i,j} 和 \alpha_{i,j}’$ 的值。

并行的获取 $b^i$ 的值

上图的 3 个步骤对 Self Attention 做了总结,在整个运算过程中只有$W^q、W^k、W^v$ 是未知的,是需要求解的参数。

Multi-head Self-attention

根据红框部分的公式计算产生 $q^i 和 q^j$,根据黄框部分的公式计算产生 $q^{i,1},q^{i,2},q^{j,1},q^{j,2}$,根据绿框部分的公式计算产生$v^{i,1},v^{i,2},v^{j,1},v^{j,2}$,根据粉框部分的公式计算产生$k^{i,1},k^{i,2},k^{j,1},k^{j,2}$,接下来就跟前面的一样了,使用下面公式计算 $\alpha_{i,1},\alpha_{j,1}$

让 $\alpha_{i,1},\alpha_{j,1}$ 通过 softmax 计算 $\alpha_{i,1}’,\alpha_{j,1}’$,根据下面公式计算 $b^{i,1}$

可以将看出在计算 $b^{i,1}$ 的时候是与 $k^{i,2},k^{j,2},v^{i,2},v^{j,2}$ 无关的。

计算 $b^{i,2}$ 与计算 $b^{i,1}$ 的步骤是一样的。

最后将两个向量合并起来,通过矩阵乘法,求取 $b^i$。

位置编码

上面介绍的 Self Attention 都没有包含位置信息,只包含了相似性信息,所以可以通过在输入时加入位置信息来提升 Self Attention 的表现。

Self-attention v.s. CNN

只用 Self Attention 是拿着一个像素信息,和整张图片的其他像素做 Self Attention,而是用了 CNN 之后相当于一个像素与接收视野内的像素做 Self Attention。

所以 Self Attention 是复杂版本的 CNN,CNN 是简化版本的 Self Attention。

从上图可以看出 Self Attention 是包含 CNN 的,相对来说 Self Attention 模型是比 CNN 模型复杂的。

所以在数据量较少时,Self Attention 会出现欠拟合。当数据量达到一定的数量时,Self Attention 的表现优于 CNN,这是因为 Self Attention 的模型复杂,可以更好的拟合数据。

Self-attention v.s. RNN

1、单向的 RNN 网络是只能捕获上文信息,而无法捕获下文信息,而 Self Attention 能够非常容易的捕获上下文信息。
2、虽然双向 RNN 也能够捕获到上下文信息,但是存在梯度消失和梯度爆炸问题,
当两个信息距离非常远时,是很难捕获有用信息的,但是在 Self Attention 中,
捕获上下文信息是通过相似程度来实现的,无论两条信息距离多远,
只要两条信息的相似度越高,那就能越多的捕获到两者的信息。
3、上面已经介绍过 Self Attention 是可以做并行计算的,而 RNN 无法实现并行计算。
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信