自注意力机制

​ 机制产生的背景:seq2seq的使用场景下,输入和输出的seq的长度不定。

输入向量不确定的情况:输入文字、声音、图片都是一堆向量

​ 1. 文字输入:将一个个单词变为词向量,有两种方式:如果是one-hot encoding无法获取词语在语义上的联系,因此采用word embedding,类别相似的词在距离上更近。

image-20251015131935297

​ 2. 声音输入:例如用25ms的帧作为一个向量,每隔10ms采一个帧。

image-20251015132033478

​ 3. 图(类似于网络图)输入:将每个节点看作是一个向量。image-20251015132547642

​ 将原子用one-hot向量表示:

image-20251015132829039

​ *** 输出的几种情况:***

​ 1.每一个输入向量都会有一个对应输出的label:如词性标注、语音和音标转换、社交网络节点属性标注(sequence labeling)。

image-20251015133152804

​ 用于解决这类问题可能首先会想到用全连接层来对每个向量进行连接,并根据每个向量得到一个输出,但是如果全连接层和向量一对一的话,可能会漏掉前后向量间的关系,如对于词性分析任务,I saw a saw这句话中,必须考虑上下文才能判断出两个saw不一样的词性,因此,能够比较容易想到的是将向量和全连接层多对一输入,设置窗口,将向量窗口输入全连接层以获取其上下文联系:

image-20251016151145250

​ 但是对于这种方法,window的大小成了问题,有些情况下需要考虑全文,如果全部向量一起输入,可能运算量很大并且容易过拟合,因此,self-attention机制出现,用于考虑整个sequence的资讯。

self-attention机制

  • 用于解决上述seqlabeling问题:

image-20251016151653608

​ self-attention输出的每个向量(带黑框的)都是其考虑整个seq后的结果,因此再将其通过全连接输出得到label。也可将全连接层的输出再通过一次self-attention:

image-20251016151903988

  • self-attention原理

image-20251016152206108

​ self-attention的输入可以是最初的输入向量,也可以是经过隐藏层处理后的向量,每一个输出都是所有seq放在一起计算所得结果,输入多少向量就输出多少向量。

​ 计算两个向量关联性的方法:

image-20251016152837853

​ 两个向量分别乘W^q^和W^k^矩阵得到q和k,$\alpha$即为q和k的点乘积,它代表了两个向量间的关联度,右边是另外一种关联度的计算方法。

​ 得到$\alpha$’的方法:

image-20251016153850769

​ 用a^1^的q向量(query)去分别点乘其他向量的k向量(key),得到a^1^关于其他每个向量的关联度$\alpha$(attention score),然后将这些关联度经过soft-max函数(也可以用其他的激活函数)来得到最终的$\alpha$’。

​ 得到向量与其他向量间的关联度$\alpha$’后,再利用所有v向量与关联度叉乘求和得到b向量,关联度比较大的那些向量,那么其v向量在最终结果b向量中所占比重就越大。

image-20251016154447465

  • 矩阵角度理解:

​ 每一个输入a向量都乘以W^q^,W^k^,W^v^三个矩阵(通过训练学习得到)得到q、k、v三个向量,所有的q向量拼起来得到Q矩阵,a、k、v类似。所以,整个过程可以看作将输入的所有向量拼接成一个矩阵I,用这个矩阵I分别去乘

W^q^,W^k^,W^v^三个矩阵,得到Q、K、V三个矩阵。

image-20251017111543370

​ 关联度attention score的计算也可以看作Q和K^T^矩阵的乘积,最后对A进行normalization得到A’:

image-20251017112739161

​ 最后的v和A‘的相乘表示如下:

image-20251017113339542

​ 整个操作的矩阵流程图:

image-20251017113623776

  • multi-head self-attention

​ 为什么需要多个head:相关性可能有多个方面,所以应该有不同的q,来负责描述不同的相关性。

​ 具体操作如下图所示,对a^i^乘矩阵后得到的q^i^矩阵,对其乘两个不同的矩阵得到q^i,1^和q^i,2^两个向量作为两个head,k和v也是同理,其数量也应和q相同。计算关联度的时候,类别相同的q、k、v一起参与运算,如计算b^i,2^时,参与运算的是q^i,2^,k^i,2^,v^i,2^,k^j,2^,v^j,2^,在双head条件下,每个a^i^会得到两个b^i,n^。

image-20251027110641618

​ 在得到b^i,1^和b^i,2^后,也是通过乘一个矩阵(transform)来转换成一个b,如下图所示。

image-20251027111954864

  • positional encoding

​ 上面的架构介绍到现在为止,并没有体现向量在距离上的关系(a^i^的i只是我们方便标识所采用的编号,在计算过程中没有体现任何位置信息)。

​ positional encoding为每一个位置设置一个位置向量positional vector e^i^,然后把这个e^i^加到a^i^上面即可,如下图所示:

image-20251027112854848

​ 那么位置向量应该长什么样子呢?在最初的attention is all you need论文中,位置向量是人设的,如下图所示,其中每一列都表示一个位置向量,从左到右分别表示e^1^,e^2^,e^3^,以此类推。

image-20251027113110124

  • self-attention用在语音、图像和图结构上

一、语音self-attention

​ self-attention用作语音上时,面临的最大的问题是输入的a向量会很大,而要训练的矩阵维度是a向量的平方大小,导致计算和内存需求都特别大。解决方法是:在计算关联度时,一个输入a只和邻近几个向量做self-attention运算而不是看整个向量序列,这就是truncated self-attention,如下图所示:

image-20251027141239383

二、图像self-attention

​ 在CNN中,将一张图片看作一个很长的向量,而在self-attention中,关键就是如何将图像表示为一组向量,以下图中解析度为5*10的图片为例,具体方法为:将每一个像素看作一个三维(RGB)向量,这个图片就有5*10个向量,这样就将一张图片转换成了一个向量组(vector set)。

image-20251027141652584

三、图结构self-attention

​ 在图结构中,每个节点就是一个向量,所有节点共同构成self-attention的输入向量集,而在计算它们的关联度时,由于不是每个节点都连接了其他每个节点,因此只需计算那些有连接的边的关联度即可,因此在计算attention matrix时只需考虑那些节点相连的项,如下图所示:

image-20251027145040956

  • self-attention vs CNN&&self-attention vs RNN

self-attention vs CNN

​ 可以理解为:采用self-attention处理图像就像是机器现在自动选择CNN中的receptive field,self-attention是一个复杂版的CNN,而CNN就像一个简化版的self-attention,根据下面图片中的论文,CNN即为self-attention的一个特例,采用特定参数,self-attention可以做到和CNN一样的事情。

image-20251027142422061

​ 那么这样看来,似乎self-attention是高阶版的CNN,那是不是都用self-attention比较好呢?不一定,self-attention这种弹性比较大的架构往往需要特别多的数据来训练才不会过拟合,而比较小的模型在数据较少时比较不容易过拟合。如下图所示,CNN在数据相对较少(但已经10M了)时优于self-attention,而随着数据量逐渐增大,self-attention开始反超CNN。

image-20251027143131872

self-attention vs RNN

​ 在这里也顺便浅学一下RNN的原理,RNN可单向可双向,单向过程为:首先准备一个memory向量、一个最左侧输入向量、一个RNN网络,输入这俩个向量到RNN中得到输出向量1,此时再把输出向量1作为memory向量再次参与和2号位输入向量的运算得到输出向量2······。

​ RNN和self-attention相比,RNN有两个明显劣势:1.距离远的向量很难提取其相关性,如最左侧的向量和最右侧的向量经过了很多轮RNN的计算,很难提取到它们间存在的信息;而self-attention不存在这个问题,即使是最远的向量也能轻易提取它们的关联度,就像”天涯若比邻“。2.RNN不能并行处理,它的输出为线性产生,而self-attention的输出为并行产生,运算速度更高。如下图所示:

image-20251027144612204

​ 2. 所有向量对应一个输出:如情感分析、语者辨认、分子性质分析。

image-20251015133354602

​ 3.事先不知道输出多少个label,机器自己决定输出label数量(这种即称为seq2seq的任务)。

image-20251016150116053