自注意力机制(Self-Attention)
目录
一、注意力机制和自注意力机制的区别
二、引入自注意力机制的目的
三、Self-Attention详解
3.1 单个输出
3.2 矩阵形式
四、Multi-head Self-attention
五、Positional Encoding
六、Self-Attention和RNN的区别
一、注意力机制和自注意力机制的区别
Attention机制与Self-Attention机制的区别
经典的注意力机制会在处理信息时涉及在Target和Source之间建立关联关系,并对这些信息进行综合考量
具体来说,在注意力机制中权重的计算过程中,默认会涉及到Target的信息。具体而言,在Encoder-Decoder架构中,默认情况下注意力权重的计算不仅依赖于Encoder层的状态信息而且还依赖于Decoder层的状态信息。
Self-Attention:
这种机制并非用于在输入序列和输出序列之间产生关联关系,在相反的情况下则是发生在同一序列内部的元素之间的相互作用。
在Transformer架构中,在处理权重参数时,将输入的文字向量转换为相应的K、Q、V向量后,在Source位置执行必要的矩阵运算即可完成任务,无需依赖Target位置的信息。
二、引入自注意力机制的目的
神经网络接收的输入是多个规模各异的向量,并且不同向量间存在一定的关联性。然而,在实际训练过程中未能充分利用这些输入之间的联系而导致模型训练效果欠佳。 例如,在机器翻译问题中(涉及序列到序列映射的问题),机器需要自行决定输出标签的数量;在词性标注问题中(每个输入向量对应唯一一个标签);而在语义分析问题中(多个输入向量共同决定一个标签)等自然语言处理任务上存在局限性。
针对此问题而言,在全连接神经网络中存在难以建立不同输入部分之间相关性的缺陷。为了弥补这一不足,在引入自注意力机制的基础上解决问题成为必然选择。这种机制的设计目的是使机器能够识别整个输入序列中各部分之间的关联性
三、Self-Attention详解
该系统接收一组向量作为输入,并会生成一组对应的向量作为输出结果。其中每个输入样本的长度均为N(且该值可变),相应的输出结果也会保持相同长度
3.1 单个输出

对于每个输入向量a,在蓝色部分self-attention的作用下都会生成一个向量b。这个生成的向量b实际上是综合考虑了所有与第一个输入向量相关的因素而得出的结果。当存在四个不同的输入向量a时,则会相应地产生四个对应的向量b。
下面以b1的输出为例
首先,如何计算sequence中各向量与a1的关联程度,有下面两种方法

该Dot-product方法通过将两个向量分别与不同的矩阵w相乘来计算,并从而获得q和k这两个向量。接着计算它们的点积来确定α,在transformer架构中广泛采用这种方法。
在图中绿色区域显示的是输入向量a1与a2以及权重矩阵Wq和Wk,请通过学习机制进行更新。将输入向量a1与权重矩阵Wq进行点乘运算,请计算得到相应的查询向量q;随后将输入向量a2与权重矩阵Wk进行点乘运算,请获得相应的键值对齐结果k。接着请将计算所得的查询向量q与键值对齐结果k进行点积运算,请计算出标量α。其中标量α则代表了这两个向量之间关联的程度。
上图右侧所示的加性模型这一机制同样遵循以下过程:首先将输入向量通过线性变换作用于对应的权重矩阵进行计算;随后对所得结果进行累加操作;接着利用tanh函数将输出映射至另一个函数空间中;最后再对该值进行一次线性变换并完成计算以获得最终结果。
可以计算每一个α(又称为attention score),q称为query,k称为key

另外还可以计算a_1与自己的关联程度然后计算各向量与a_1的相关程度之后经过\texttt{softmax}得到一个\texttt{attention distribution}从而将相关程度进行标准化处理进而可以看出哪些向量与a_1具有最大的关联关系

下面需要根据 α′ 抽取sequence里重要的资讯:

首先计算出各个键值(value)的表示形式 v_i 。其中 i 表示第 i 个关键词或查询项。 v 的计算方法与其他两个变量 q 和 k 完全一致。 v 的具体形式是通过将输入向量 a_i 与权重矩阵 W 进行线性变换得到的: a_i = W·x_i + b_i ,这里假设使用了线性层结构。 在注意力机制中\, 对于每一个位置上的关键词项\, 我们需要对它们进行操作:针对第 \( i 个关键词项, 计算其在整体上下文中所占的比例权重, 这一比例由对应的 α'_i 向量决定。 最终\, 将所有经过上述处理后的结果累加起来\, 即可获得最终输出结果 \( b_1 。
当a₁和a₂之间的关联程度较高时,在计算过程中α₁,₂′会相应增大。从而推导出的结果向量b₁会趋近于v₂。其中att注意分数主要取决于这些因素。
3.2 矩阵形式
用矩阵运算表示b1的生成:
Step1 :q、k、v的矩阵形式生成

写成矩阵形式:

把4个输入a拼成一个矩阵

,这个矩阵有4个column,也就是a1到a4,

乘上相应的权重矩阵W,得到相应的矩阵Q、K、V,分别表示query,key和value。
三个W是我们需要学习的参数

Step2: 基于获取到的Q和K矩阵数据信息, 任意两个输入向量间的关联程度可以通过计算注意力机制中的α值来衡量, 具体来说就是对注意力权重进行赋值. 具体而言, α值的具体计算方法有多种多样, 点乘运算是一种最为常用且高效的实现方式.
先针对q1,通过与k1到k4拼接成的矩阵K相乘,得到\alpha _{1,n}拼接成的矩阵。

同样,q1到q4也可以拼接成矩阵Q直接与矩阵K相乘:

公式为:

矩阵形式:

在矩阵A中,每个元素表示对应两个输入向量之间的注意力权重α;经过应用softmax函数进行归一化处理后得到的矩阵为A'。
Step 3: 利用获得的A'和V来计算出每个输入向量a对应于self-attention层生成输出向量b


写成矩阵形式:

对self-attention操作过程做个总结,输入是I,输出是O:

矩阵Wq、 Wk 、Wv是需要学习的参数。
四、Multi-head Self-attention
基于自注意力机制的高级版本是multi-head self-attention mechanism
由于相关性的不同形式众多,并且其定义也存在多样性差异,在单一标准下难以满足所有需求时
对于1个输入a

首先,和上面一样,用a乘权重矩阵W得到

,然后再用

通过分别与两个不同的W矩阵相乘的操作,在生成过程后会得到两个不同的q^{i,n}向量。其中i表示所处的位置坐标值;而1和2分别代表该位置上的第一个q向量和平共处的第二个q向量。

这上面这个图中,有两个head,代表这个问题有两种不同的相关性。
此外,在计算过程中除了k和v之外还需要考虑它们的计算方式与q一致即它们的计算方式与q一致即它们的计算方式与q一致即它们的计算方式与q一致即它们的计算方式与q一致

对于多个输入向量也一样,每个向量都有多个head:

算出来q、k、v之后怎么做self-attention呢?
如同之前所述的方法,在处理第一类任务时同时完成所有工作,在处理第二类任务时同样高效地完成所有工作。这两个相互独立的任务分别计算出各自的b值。
对于1:

对于2:

这只是两个head的例子,有多个head过程也一样,都是分开算b。
最后,把

将输入信号按照一定规则进行编码并排列成一个二维数组形式后与权重矩阵W进行矩阵乘法运算。计算结果记作b^i(即该层自注意力机制生成的结果),如图所示。

五、Positional Encoding
在训练self attention时, 位置信息缺乏明确区分, 没有前后区分, 上面所述a1,a2,a3仅表示输入序列的数量, 即表示输入向量的数量, 而不是指代输入的具体顺序, 这一点与RNN不同, 在RNN中会有明确的时间顺序关系, 比如在机器翻译任务中,'机器学习'会被逐词处理。然而自注意力机制接受的是并行处理的信息流, 输出结果则是同步生成完成。
请阐述在Self-注意力机制中如何表示位置信息?通常采用的方法是Positional Encoding。
也就是新引入了一个位置向量

,非常简单,如下图所示:

每一个位置设置一个vector,叫做positional vector,用

表示,不同的位置有一个专属的ei。
如果ai加上了ei,就会体现出位置的信息,i是多少,位置就是多少。
vector长度是人为设定的,也可以从数据中训练出来。
六、Self-Attention和RNN的区别
Self-attention和RNN的主要区别在于:
Self-attention能够涵盖所有输入信息;然而,在常规 recurrent neural networks(RNN)中由于只能基于单向序列进行建模显得较为局限。采用双向RNN则可规避此限制。
Self-attention机制能够轻松地捕捉较早出现的信息;然而,在经过多层网络处理后其早期信息不易被有效捕捉。
在并行计算方面Self-attention机制具备明显优势;而在常规 RNN 中由于需要遵循严格的层序性限制其计算效率相对较低。
Self-attention能够处理整个输入序列;然而,在RNN中,仅能处理左侧信息(即前面的部分)。不过,在采用双向RNN时这种局限性得以克服。
例如,在第一个RNN中,我们仅针对深蓝色的输入进行了分析,并未包含绿色及之后的所有输入。相比之下,Self-Attention则综合了全部四个输入。

Self-attention能够便捷地考虑到较早之前的输入,而RNN体系中的早期输入因经过多层网络处理后变得难以考虑到。
例如,在最后一个RNN的黄色输出中想要包含最初的蓝色输入时就必须确保蓝色输入在经过每一层时不丢失信息;然而当一个sequence特别长时就往往难以维持这种完整性;相比之下Self-attention机制使得每个输出都与所有输入直接相关

3.Self-attention可以并行计算,而RNN不同层之间具有先后顺序。
Self-attention的输入是同时输入,输出也是同时输出。
参考:
第四章 2021年 - 自注意力机制(Self-attention)(第一部分)
关于Attention机制与Self-Attention机制的区别,在分析这个问题时
self-attention mechanism on Zhihao App's official website
Self-attention 自注意力机制 - 知乎 (zhihu.com)
自然语言处理
