Self-Attention 自注意力机制(一)——Attention 注意力机制

qiaoxinyu10623 2024-09-09 11:31:01 阅读 98

 声明:本文章是根据网上资料,加上自己整理和理解而成,仅为记录自己学习的点点滴滴。可能有错误,欢迎大家指正。


1. 什么是注意力机制

       Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。他的核心逻辑就是「从关注全部到关注重点」。

       注意力机制其实是源自于人对于外部信息的处理能力。由于人每一时刻接受的信息都是无比的庞大且复杂,远远超过人脑的处理能力,因此人在处理信息的时候,会将注意力放在需要关注的信息上,对于其他无关的外部信息进行过滤,这种处理方式被称为注意力机制

       图1可帮助大家较好地去理解注意力机制。Attention map展示了人类在看到一幅图像时,如何高效分配有限注意力资源。其中颜色更深的区域,如红色区域表明视觉系统更加关注的目标。从图中可以看出:人们首先会注意到动物的脸部,从而初步判断这可能是一只狼。

图1: 注意力示例图

     上面所说的,我们的视觉系统就是一种 Attention机制,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。

2. AI领域的Attention 机制

       通俗的讲:注意力对于人来说可理解为“关注度”,对没有感情的机器来说其实就是赋予多少权重(比如0-1之间的小数)越重要的地方或者越相关的地方就赋予越高的权重。注意力机制从本质上讲和人类的选择性注意力机制类似,核心目标是从众多信息中选出对当前任务目标更加关键信息

       Attention 机制最早是在计算机视觉里应用的,随后在 NLP(Natural language processing,自然语言处理 ) 领域也开始应用了,真正发扬光大是在 NLP 领域,因为 2018 年 BERT(Bidirectional Encoder Representation from Transformers,双向Transformer的Encoder) 和 GPT 的效果出奇的好,进而走红。而 Transformer 和 Attention 这些核心开始被大家重点关注。

图2: AI领域的Attention 机制

       在深度学习中,注意力机制通常应用于序列数据(如文本、语音或图像序列)的处理。其中,最典型的注意力机制包括自注意力机制、空间注意力机制(用于图像处理)时间注意力机制(用于自然语言处理)。这些注意力机制允许模型对输入序列的不同位置分配不同的权重,以便在处理每个序列元素时专注于最相关的部分。

3.Encoder-Decoder(编码-解码)

    要了解深度学习中的注意力模型,就不得不先谈Encoder-Decoder框架,因为目前大多数注意力模型附着在Encoder-Decoder框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。

3.1 Encoder-Decoder的介绍

      Encoder-Decoder框架可以看作是一种深度学习领域的研究模式,它并不特值某种具体的算法,而是一类算法的统称。Encoder-Decoder 算是一个通用的框架,在这个框架下可以使用不同的算法来解决不同的任务。Encoder-Decoder 这个框架很好的诠释了机器学习的核心思路

将现实问题转化为数学问题,通过求解数学问题,从而解决现实问题。

     Encoder 又称作编码器。它的作用就是「将现实问题转化为数学问题」,Decoder 又称作解码器,他的作用是「求解数学问题,并转化为现实世界的解决方案

     图3: Encoder与Decoder的框架

     把 2 个环节连接起来,用通用的图来表达则是下面的样子:

     图4: Encoder-Decoder的整体框架

关于 Encoder-Decoder,有2 点需要说明:

不论输入和输出的长度是什么,中间的「向量 c」 长度都是固定的(这也是它的缺陷)根据不同的任务可以选择不同的编码器和解码器(可以是一个 RNN (循环神经网络 – Recurrent Neural Network ),但通常是其变种 LSTM (长短期记忆网络 – Long short-term memory)或者 GRU )

只要是符合上面的框架,都可以统称为 Encoder-Decoder 模型。

3.2 Encoder-Decoder的应用

       Encoder-Decoder框架应用广泛,如下图所示。

     图5: Encoder-Decoder的应用

       文本处理领域的Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。例如,对于句子对

(Source,Target)

,我们的目标是给定输入句子

Source

,期待通过Encoder-Decoder框架来生成目标句子

Target

Source

Target

可以是同一种语言,也可以是两种不同的语言。而

Source

Target

分别由各自的单词序列构成:

Source=\left \{ x_{1},x_{2},...,x_{m}\right \}

Target=\left \{ y_{1},y_{2},...,y_{n}\right \}

        Encoder顾名思义就是对输入句子

Source

进行编码,将输入句子通过非线性变换

f()

转化为中间相量C(即中间语义):

C=f(x_{1},x_{2},...,x_{m})

        对于解码器Decoder来说,其任务是根据输入句子

Source

的中间相量C和之前已经生成的历史信息

y_{1},y_{2},...,y_{i-1}

,通过非线性变换

g()

来生成i时刻要生成的单词

y_{i}

y_{i}=g(c,y_{1},y_{2},...,y_{i-1})

       每个

y_{i}

都依次这么产生,那么看起来就是整个系统根据输入句子

Source

生成了目标句子

Target

。若输入句子

Source

是中文句子,目标句子

Target

是英文句子,那么解决机器翻译问题的Encoder-Decoder框架;若输入句子Source是一句问句,目标句子Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。

        Encoder-Decoder框架不仅在文本领域广泛使用,在语音识别、图像处理等领域也常使用。如对语音识别来说,Encoder部分的输入是语音流,输出是对应的文本信息;而对于“图像描述”任务来说,Encoder部分的输入是一副图片,Decoder的输出是能够描述图片语义内容的一句描述语。一般而言,文本处理和语音识别的Encoder部分通常采用RNN模型,图像处理的Encoder一般采用CNN模型。

3.3 Seq2Seq(序列到序列)

        Encoder-Decoder框架之间只有一个「向量 c」来传递信息,且 c 的长度固定。然而许多重要的问题,例如机器翻译、语音识别、自动对话等,表示成序列后,其长度事先并不知道。因此如何突破先前深度神经网络的局限,使其可以适应这些场景,成为研究热点,Seq2Seq框架应运而生。

     Seq2Seq(是 Sequence-to-sequence 的缩写),就如字面意思,输入一个序列,输出另一个序列这种结构最重要的地方在于输入序列和输出序列的长度是可变的。例如下图:

          图6:Seq2Seq示例

如上图:输入了 6 个汉字,输出了 3 个英文单词。输入和输出的长度不同。

3.4 「Seq2Seq」和「Encoder-Decoder」的关系

       Seq2Seq(强调目的)不特指具体方法,满足「输入序列、输出序列」的目的,都可以统称为 Seq2Seq 模型。而 Seq2Seq 使用的具体方法基本都属于Encoder-Decoder 模型(强调方法)的范畴。它们的范围关系如下所示:

          图7:Seq2Seq和Encoder-Decoder的关系图

 总结一下的话:

Seq2Seq 属于 Encoder-Decoder 的大范畴Seq2Seq 更强调目的(序列到序列的问题),Encoder-Decoder 更强调方法(编码-解码的一个过程

3.5 Encoder的缺陷——信息的丢失

       上文提到:Encoder(编码器)和 Decoder(解码器)之间只有一个「向量 c」来传递信息,且 c 的长度固定。为了便于理解,我们类比为「压缩-解压」的过程:将一张 800X800 像素的图片压缩成 100KB,看上去还比较清晰。再将一张 3000X3000 像素的图片也压缩到 100KB,看上去就模糊了。

   图7:信息丢失的示意图

   Encoder-Decoder的缺陷 就是类似的问题:当输入信息太长时,会丢失掉一些信息。

4. Attention原理  

       Attention 机制就是为了解决「信息过长,信息丢失」的问题。

4.1 引入 Attention 的 Encoder-Decoder 模型

       Attention 模型的特点是 Encoder 不再将整个输入序列编码为固定长度的「中间向量 C」 ,而是编码成一个向量的序列。引入了 Attention 的 Encoder-Decoder 模型如下图:

    图8:引入Attention 的 Encoder-Decoder 模型图

       下面的动图演示了attention 引入 Encoder-Decoder 框架下,完成机器翻译任务的大致流程。其中输入句子

Source

是法语句子:"Je suis étudiant",目标句子

Target

是英文句子:“I am a student”。

    图9:引入Attention 的 Encoder-Decoder 的机器翻译动图

    若按照Encoder-Decoder的框架(图4所示),我们的输出值

y_{i}

的表达式:

y_{i}=g(c,y_{1},y_{2},...,y_{i-1})

    「向量 c」是由句子Source的每个单词经过Encoder编码产生的,这意味着不论是生成哪个单词,如

y_{1}=g(C)

,

y_{2}=g(C,y_{1})

还是

y_{3}=g(C,y_{1},y_{2})

,其句子Source中任意单词对生成某个目标单词

y_{i}

来说影响力都是相同的,无法体现对一个句子序列中不同语素的关注程度。这说明Encoder-Decoder没有体现出注意力

      而在自然语言中,一个句子中的不同部分是有不同含义和重要性的。比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。如果是做追逐角色分析的应用场景,训练的时候明显应该对Tom 这个词语做更多的关注。

     在引入Attention机制的 Encoder-Decoder模型中,如图8所示。出现了

C_{1},C_{2},C_{3}

分别对应了

y_{1},y_{2},y_{3}

,这样输出值

y_{i}

的表达式也改变了:

y_{i}=g(c_{i},y_{1},y_{2},...,y_{i-1})

      目标句子就变成了

y_{1}=g(C_{1})

,

y_{2}=g(C_{2},y_{1})

y_{3}=g(C_{3},y_{1},y_{2})

了。当

C_{i}

的取值不同,目标单词

y_{i}

的影响力是不同的。如Tom chase Jerry,在做追逐角色分析的应用场景中,会对Tom 这个词语分配更多的注意力(即权重

C_{1}

更大),从而提高模型的精度和效率。

       问题是

C_{i}

如何计算?我们再看一副Attention的细节图:

    图10:引入Attention 的 Encoder-Decoder 模型图

      从图中可以看出,

C_{i}

h_{i}

的加权的结果:

C_{i}=\sum_{j=1}^{m}h_{i}\alpha _{i,j}

      其中,

m

代表输入句子Source的长度,

\alpha _{i,j}

代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数,而

h_{i}

则是Source输入句子中第j个单词的语义编码

      假设

C_{i}

下标i就是Tom Chase Jerry中的“ 汤姆” ,那么

m

就是3,h1=f(“Tom”),h2=f(“Chase”), h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2,所以g函数本质上就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示

C_{i}

的形成过程如下图所示。

图11: Attention的形成过程

      这里还有一个问题:生成目标句子某个单词,比如“汤姆”的时候,如何知道输入句子Source中各个单词的概率分布为:(Tom,0.6)(Chase,0.2) (Jerry,0.2) ?即如何计算

\alpha _{i,j}

呢?这时候就用到我们的Softmax函数的原理(以第i个节点输出为例):

softmax(z_{i})=\frac{e^{z_{i}}}{\sum_{j=1}^{C}e^{z_{j}}}

      其中

z_{i}

为第i个节点的输出值,C为输出节点的个数,即分类的类别个数。所以,同理可得:

\alpha _{i,j}=\frac{e^{e_{ij}}}{\sum_{K=1}e^{e_{ik}}}

其中

e_{ij}

为每一个输入位置

h_{j}

对当前位置i的影响。如果当前decoder阶段已经到了

s_{i-1}

,要进行下一个

s_{i}

的预测了,则

e_{ij}=e(s_{i-1},h_{j})

根据不同的Attention算法

e(h,s)

的实现方式也不同:

Bahdanau Attention结构:

e(h,s)=U t a n h ( V h + W s )

,其中U,V,W是模型的参数Luong Attention结构:

e(h,s)=h ^{T} W s

      但是无论是Bahdanau Attention,还是Luong Attention,它们都属于Soft Attention的结构,都是通过Softmax来计算

\alpha _{i,j}

4.2 Attention机制的本质思想

      但是,Attention 并不一定要在 Encoder-Decoder 框架下使用的,他是可以脱离 Encoder-Decoder 框架的。下面的图片则是脱离 Encoder-Decoder 框架后的原理图解。

           

 图12   Attention机制的本质思想

首先认识几个概念:

查询(Query): 指的是查询的范围,自主提示,即主观意识的特征向量键(Key): 指的是被比对的项,非自主提示,即物体的突出特征信息向量值(Value) :  则是代表物体本身的特征向量,通常和Key成对出现

       我们可以这样来看待Attention机制(参考图12):将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。

       上面的图看起来比较抽象,下面用一个例子来解释 attention 的原理:淘宝查找物品的过程。

       在这个例子中,Query, Key 和 Value 的每个属性虽然在不同的空间,其实他们是有一定的潜在关系的,也就是说通过某种变换,可以使得三者的属性在一个相近的空间中。

       至干Attention机制的且体计算过程,如果对目前大多数方法进行抽象的话,可以将其归纳为两个过程:第一个过程是根据Querv和Key计算权重系数;第二个过程根据权重系数对Value进行加权求和。而第一个过程又可以细分为两个阶段:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理。这样,可以将Attention的计算过程抽象为如图展示的三个阶段。

阶段一:根据Query和Key计算两者之间的相关性或相似性(常见方法点积、余弦相似度,MLP网络),得到注意力得分(即权值系数);阶段二:将权值进行归一化,得到直接可用的权重阶段三:将权重和 value 进行加权求和,得到Attention Value(此时的V是具有一些注意力信息的,更重要的信息更关注,不重要的信息被忽视了);具体见下:

这三个阶段可以用下图表示:



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。