Self-Attention理解

目录

一.Attention机制

Attention用于计算"相关程度", 例如在翻译过程中,不同的英文对中文的依赖程度不同,Attention通常可以进行如下描述,表示为将query (Q)和键值对(key-value pairs) { Ki , Vi | i=1,2,3,…,m} 映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有value的加权,其中权重是由query和每个key计算出来的,计算方法分为三步:

  1. 计算比较Q和K的相似度,用f来表示
    Self-Attention理解
  2. 将得到的相似度进行Softmax操作(归一化)
    Self-Attention理解
  3. 对V中所有的values进行加权求和计算,得到Attention向量
    Self-Attention理解
    其中第一步中的f(Q,Ki)有以下几种
  • dot product
    Self-Attention理解

  • 权重 General
    Self-Attention理解

  • 拼接权重 Concat
    Self-Attention理解

  • 感知器 Perceptron
    Self-Attention理解

二.键值对注意力

首先分析Transformer中最核心的部分,键值对Attention最核心的公式如下图
Self-Attention理解
关于这个公式,便于容易理解,先考虑以下公式
Self-Attention理解
不考虑 Q,K,V,公式便可以退化为上面这样。
XXT 可以理解为,矩阵可以看作由一些向量组成,一个矩阵乘以它自己转置的运算,可以看成这些向量分别与其他向量计算内积。(第一行乘以第一列、第一行乘以第二列,以此相乘下去,矩阵转置以后第一行不就是第一列吗,这是在计算第一个行向量与自己的内积,第一行乘以第二列是计算第一个行向量与第二个行向量的内积,第一行乘以第三列是计算第一个行向量与第三个行向量的内积)

向量的内积表征两个向量的夹角,表征一个向量在另一个向量上的投影,故可以得出结论,两个向量的内积越大,表示相关程度越高,将矩阵相乘的结果进行softmax归一化,得到的矩阵每行的数值之和就是1,最后再乘以V,就相当于给V中的数值进行加权,得到了Attention向量。

现在列出以下图,来举例说明矩阵里的一行所做的操作
Self-Attention理解
首先,行向量分别与自己和其他两个行向量做内积(“早"分别与"上”"好"计算内积),得到了一个新的向量。前文提到的向量的内积表征两个向量的夹角,表征一个向量在另一个向量上的投影。新的向量是行向量在自己和其他两个行向量上的投影。投影的值大,说明两个向量相关度高,如果两个向量夹角是九十度,那么这两个向量线性无关,完全没有相关性。更进一步,这个向量是词向量,是词在高维空间的数值映射。词向量之间相关度高在一定程度上表示,在关注词A的时候,应当给予词B更多的关注。

表示“早”字的一行向量,分别与“早”,“上”,“好” 作内积,得到结果之后,进行softmax操作,得到的就是对应的权重,再经过与原始的相乘,得到了“早”字新的向量,如下图所示
Self-Attention理解

三.Q、K、V矩阵

接下来将上面所说的,简化了的公式还原,就会有QKV三个不同的矩阵
Self-Attention理解
为什么不直接使用X ?因为对X乘以一个矩阵,可以增强拟合能力,矩阵里的参数都是可训练的,起到一个缓冲的作用。
√dk的作用,假设 Q,K 里的元素的均值为0,方差为1,那么 A = Q·KT 中元素的均值为0,方差为d. 当d变得很大时,A中的元素的方差也会变得很大,如果 A中的元素方差很大,那么Softmax(A)的分布会趋于陡峭(分布的方差大,分布集中在绝对值大的区域)。总结一下就是Softmax(A)的分布会和d有关。因此 A 中每一个元素除以√dk后,方差又变为1。这使得Softmax(A)的分布“陡峭”程度与d解耦,从而使得训练过程中梯度值保持稳定。

上一篇:embedding、LSTM、seq2seq+attention的知识总结


下一篇:动手学深度学习 | 自注意力 | 67