注意力机制

Posted on 2022-12-25 19:56  Charlie_ODD  阅读(218)  评论(0编辑  收藏  举报

注意力机制

推荐阅读:https://www.cnblogs.com/CocoML/p/12725925.html

https://www.cnblogs.com/BlairGrowing/p/15338310.html

https://blog.csdn.net/qq_36136196/article/details/120308987

https://daiwk.github.io/posts/nlp-self-attention-models.html

解决什么问题

神经网络中的注意力机制(Attention Mechanism)是在计算能力有限的情况下,将计算资源分配给更重要的任务,同时解决信息超载问题的一种资源分配方案。在神经网络学习中,一般而言模型的参数越多则模型的表达能力越强,模型所存储的信息量也越大,但这会带来信息过载 的问题。那么通过引入注意力机制,在众多的输入信息中聚焦于对当前任务更为关键的信息,降低对其他信息的关注度,甚至过滤掉无关信息,就可以解决信息过载问题,并提高任务处理的效率和准确性。

这就类似于人类的视觉注意力机制,通过扫描全局图像,获取需要重点关注的目标区域,而后对这一区域投入更多的注意力资源,获取更多与目标有关的细节信息,而忽视其他无关信息。通过这种机制可以利用有限的注意力资源从大量信息中快速筛选出高价值的信息

软性注意力和硬性注意力

在神经网络模型处理大量输入信息的过程中,利用注意力机制,可以做到只选择一些关键的的输入信息进行处理,来提高神经网络的效率,比如在机器阅读理解任务中,给定一篇很长的文章,然后就文章的内容进行提问。提出的问题只和段落中一两个句子有关,其余部分都是无关的,那么只需要把相关的片段挑出来让神经网络进行处理,而不需要把所有文章内容都输入到神经网络中。

用数学语言来表达这个思想就是:用X=[x1, x2, ..., xN]表示N个输入信息,为了节省计算资源,不需要让神经网络处理这N个输入信息,而只需要从X中选择一些与任务相关的信息输进行计算。

  • 软性注意力(Soft Attention)机制是指在选择信息的时候,不是从N个信息中只选择1个,而是计算N个输入信息的加权平均,再输入到神经网络中计算。
  • 相对的,硬性注意力(Hard Attention)就是指选择输入序列某一个位置上的信息,比如随机选择一个信息或者选择概率最高的信息。
  • 但一般还是用软性注意力机制来处理神经网络的问题。以下介绍两种常见的软性注意力模式

注意力值的计算可以分为两步

  • 在所有输入信息上计算注意力分布;
  • 根据注意力分布来计算输入信息的加权平均。

普通模式

(1)注意力分布

给定这样一个场景:把输入信息向量X看做是一个信息存储器,现在给定一个查询向量q,用来查找并选择X中的某些信息,那么就需要知道被选择信息的索引位置。采取“软性”选择机制,不是从存储的多个信息中只挑出一条信息来,而是雨露均沾,从所有的信息中都抽取一些,只不过最相关的信息抽取得就多一些。

于是定义一个注意力变量z∈[1, N]来表示被选择信息的索引位置,即z=i来表示选择了第i个输入信息,然后计算在给定了q和X的情况下,选择第i个输入信息的概率αi:

其中αi构成的概率向量就称为注意力分布(Attention Distribution)。s(xi , q)是注意力打分函数,有以下几种形式:

其中W、U和v是可学习的网络参数,d是输入信息的维度。

(2)加权平均

注意力分布αi表示在给定查询q时,输入信息向量X中第i个信息与查询q的相关程度。采用“软性”信息选择机制给出查询所得的结果,就是用加权平均的方式对输入信息进行汇总,得到Attention值:

下图是计算Attention值的过程图:

键值对注意力模式

更一般的,可以用键值对(key-value pair)来表示输入信息,那么N个输入信息就可以表示为(K, V)= [(k1,v1),(k2,v2),...,(kN,vN)],其中“键”用来计算注意分布σi,“值”用来计算聚合信息。

那么就可以将注意力机制看做是一种软寻址操作:把输入信息X看做是存储器中存储的内容,元素由地址Key(键)和值Value组成,当前有个Key=Query的查询,目标是取出存储器中对应的Value值,即Attention值。而在软寻址中,并非需要硬性满足Key=Query的条件来取出存储信息,而是通过计算Query与存储器内元素的地址Key的相似度来决定,从对应的元素Value中取出多少内容。每个地址Key对应的Value值都会被抽取内容出来,然后求和,这就相当于由Query与Key的相似性来计算每个Value值的权重,然后对Value值进行加权求和。加权求和得到最终的Value值,也就是Attention值。

如下图所示,以上的计算可以归纳为三个过程:

  • 第一步:根据Query和Key计算二者的相似度。可以用上面所列出的加性模型、点积模型或余弦相似度来计算,得到注意力得分si;

  • 第二步:用softmax函数对注意力得分进行数值转换。一方面可以进行归一化,得到所有权重系数之和为1的概率分布,另一方面可以用softmax函数的特性突出重要元素的权重;

  • 第三步:根据权重系数对Value进行加权求和:

  • 以上过程用简洁的公式整理出来:

软性注意力机制与Encoder-Decoder框架

https://www.cnblogs.com/Luv-GEM/p/10712256.html

自注意力模型

通俗解释

首先通过与软注意力Encoder-Decoder模型进行对比,来获得对自注意力模型(Self-Attention Model)的感性认识。

在软注意力Encoder-Decoder模型中,更具体地来说,在英-中机器翻译模型中,输入序列和输出序列的内容甚至长度都是不一样的,注意力机制是发生在编码器和解码器之间,也可以说是发生在输入句子和生成句子之间。而自注意力模型中的自注意力机制则发生在输入序列内部,或者输出序列内部,可以抽取到同一个句子内间隔较远的单词之间的联系,比如句法特征(短语结构)。

如果是单纯的RNN网络,对于输入序列是按步骤顺序计算隐状态和输出的,那么对于距离比较远又相互依赖的特征,捕获二者之间联系的可能性比较小,而在序列内部引入自注意力机制后,可以将句子中任意两个单词通过一个计算直接联系起来,就更容易捕获相互依赖的特征。

理论阐述

有了感性认识后,我们用公式来定义自注意力模型。

自注意力模型在我看来是在同一层网络的输入和输出(不是模型最终的输出)之间,利用注意力机制“动态”地生成不同连接的权重,来得到该层网络输出的模型。

前面说了自注意力模型可以建立序列内部的长距离依赖关系,其实通过全连接神经网络也可以做到,但是问题在于全连接网络的连接边数是固定不变的,因而无法处理长度可变的序列。而自注意力模型可以动态生成不同连接的权重,那么生成多少个权重,权重的大小是多少,都是可变的,当输入更长的序列时,只需要生成更多连接边即可。如下图,虚线连接边是动态变化的。

用数学公式来表达自注意力机制:假设一个神经层中的输入序列为X=[x1,x2,...,xN],输出序列为同等长度的H=[h1, h2, ..., hN],首先通过线性变换得到三组向量序列:

其中Q, K, V 分别为查询向量序列,键向量序列和值向量序列, , , 分别是可以学习的参数矩阵。
于是输出向量这样计算:

其中 i, j ∈ [1, N]为输出和输入向量序列的位置,连接权重 αij由注意力机制动态生成。
自注意力模型可以作为神经网络的一层来使用,也可以用来替换卷积层或循环层,也可以与卷积层或循环层交叉堆叠使用。

在下图中,输入序列和输出序列都是同一个句子,通过由自注意力机制动态生成的权重,可以发现making与more-difficult的权重比较大(颜色深),于是捕获了这三个词之间存在的联系——构成了一个短语。

Transformer

Self-Attention 是 Transformer最核心的思想,以下详细说明:

公式:

K 在我们之前的例子中并没有出现K Q V究竟是什么?我们看下面的图

 

其实,许多文章中所谓的Q K V矩阵、查询向量之类的字眼,其来源是 与矩阵的乘积,本质上都是 的线性变换

为什么不直接使用 而要对其进行线性变换?

当然是为了提升模型的拟合能力,矩阵 都是可以训练的,起到一个缓冲的效果。

Q KT 内积的意义

矩阵 是一个方阵,以行向量的角度理解,里面保存了每个向量与自己和其他向量进行内积运算的结果,表示了向量的相似度矩阵。

Softmax操作的意义

归一化

根号dk的意义

表示方差