对于Transformer中Self-attention机制的理解

Attention Mechanism

attention机制理解

将人的感知方式,注意力的行为应用在机器上,让机器学会感知数据中重要的和不重要的部分。

attention分类

  • Soft/Global Attention(软注意/全局注意)

    对每个输入项分配的权重在0-1之间,也就是某些部分关注的多一点,某些部分关注的少一点,因为对大部分信息都关注,但关注程度不同。所以计算量相对来说较大

  • Hard/Local Attention (硬注意/局部注意)

    对每个输入项分配的权重非0即1,只关注需要的部分,舍弃掉无关的部分。好处是可以减少一定的时间和计算成本,缺点是有可能丢失信息。

  • Self/Intra Attention (自注意力机制/内注意)

    对每个输入项分配的权重取决于输入项之间的相互作用,即通过输入项内部的“表决”来决定应该关注哪些输入项。与前两者相比,自注意力机制在处理很长的输入时,具有并行计算的优势。

Self-Attention

Self-Attention的挑战与目标

The animal didn’t cross the street because it was too tired

The animal didn’t cross the street because it was too wide

两个句子中的it指代的对象并不一样,但是这对于机器来说很难判断。

self-attention机制通过计算单词it与其他词之间的联系得知it的具体指代。

Self-Attention的计算过程概述

对于一系列输入向量a,经过self-attention 后得到一系列向量b,输出的每个token是考虑了输入的所有token后得到的。所以4个向量token对应4个向量的token

  1. 对于每个向量a,分别乘上三个矩阵系数W得到三个值:Q, K, V,分别表示query, key, value
  2. 利用得到的Q和K计算每两个输入向量之间的相关性,也就是计算attention的a,常用点乘方法计算。A= K·Q,矩阵A中的每一个值记录了对应的两个输入向量的Attention大小
  3. 对A矩阵进行softmax或者Relu得到A'
  4. 利用得到的A’和V计算得到每个输入向量a对应的self-attention层的输出向量b

Attention核心公式的理解

$$ Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V $$

1、对公式计算步骤的理解

抛开Q,K,V三个矩阵,self-attention的最原始形态的公式如下: $$ Softmax(XX^T)X $$ 其中 $$ XX^T代表什么 $$ 一个矩阵是由一些向量组成的,当一个矩阵乘以自己的转置矩阵时,(将矩阵中的向量以多个行向量组成的方式表示)可以看作这些向量分别与其他向量计算内积。

而向量内积的几何意义是:表征两个向量的家教,即表征一个向量在另一个向量上的投影。投影的值越大,说明两个向量的相关度越高。

如果两个向量的夹角是90°,那么这两个向量线性无关,完全没有相关性。

将词向量代入其中进行理解,若两个词向量计算内积得到的投影的值越大,可以理解为两个词向量的相关性就越高。

接下来,进一步理解 $$ Softmax(XX^T)中softmax的意义 $$ softmax的意义是进行归一化。而Attention 机制的核心是正是加权求和

接下来我们再看这个公式 $$ Softmax(XX^T)X $$ 我们取经过内积与softmax运算后的一个行向量举例,将其与X的一个列向量相乘,新得到的向量与原来X的向量维度相同。

在新的向量中,每一个维度的数值都是由三个词向量在这一维度的数值加权求和得到的,这个新的行向量就是原来的“早”字向量经过注意力机制加权求和之后的表示。

2、对Q、K、V矩阵的理解

Q、K、V矩阵都是矩阵X与权重矩阵W的乘积得到的,即他们本质上都是X的线性变换

为什么不直接用矩阵X进行计算呢?是为了提升模型的拟合能力。因为矩阵W是可以训练的,可以起到一个缓冲的作用。

3、对根号d_k的理解

$$ \sqrt{d_k} $$

假设Q,K里的元素均值为0,方差为1,那么 $$ A^T = Q^TK $$ 中的元素的均值为0,方差为d.

当d很大时,A中的元素的方差也很大,此时Softmax(A)的分布会趋于陡峭。

也就是说Softmax(A)的分布和d有关,因此A中的内一个元素除以根号d_k后,方差又变为1.这使得Softmax(A)的分布陡峭程度与d解耦,从而使训练过程中梯度值保持稳定。

自注意力机制与CNN、RNN对比

自注意力机制与CNN对比

在处理图像问题时,每一个像素点可以看作一个三维的向量,维度就是图像的通道数。所以图像也可以看作很多的向量输入到模型中。两者思想类似,都是希望网络能够不仅仅考虑某一个向量,而是考虑全局。对于CNN来说,矩形的感受野就是模型需要考虑的部分,但是self-attention是让模型自己决定有要考虑哪部分。

CNN可以看作一种特殊的self-attention,self-attention可以看作一种复杂的CNN。

自注意力机制与RNN对比

RNN和自注意力机制类似,都是接受一批输入向量,然后输出一批向量,但RNN只能接受前面的的输出作为输入,而self-attention可以同时关注到全部的向量。

存在的问题

虽然考虑了所有的输入向量,但没有考虑到向量的位置信息。在处理实际问题的过程中,同一个词在不同的位置可能有不同的含义。

对此的改进方法是:位置编码 positional encoding

对每一个输入向量加上一个位置向量e,通过e来表示位置信息,并带入self-attention层进行计算。