关于Attention、Self-Attention机制的理解

结合李宏毅老师机器学习2021——Self-Attention课程和网上查阅的资料,总结一下对Attention机制的理解

Attention机制就是权重分布

  • Attention机制的核心就是,决定整段输入的哪个部分需要更加关注
      Attention机制翻译中文就是注意力机制,这就和我们人类看图片、看自然语言是一样的,我们人读一句话是有自己的关注点,重点词汇的。比如我输入一张图,我让你判断这是一只鸟,那么鸟嘴、鸟爪等等patten是很重要的,而Attention机制就是给这些patten一个权重。再比如我们做NLP任务(阅读理解)时,需要提取句子主干,我们这个apple是很重要的,那就给一个大的权重。
    关于Attention、Self-Attention机制的理解_第1张图片
    参考:https://www.zhihu.com/question/68482809
怎么理解Attention机制的 K、Q、V 参数 (换言之,怎么确定权重)
  • 首先,Attention机制是通过 K Q V 矩阵做运算,进而确定权重的。
    关于Attention、Self-Attention机制的理解_第2张图片
      以self-attention为例,其中q 和 k相乘算出关联性,再经过 softmax 归一化后,与 v 矩阵相乘得到加权分布。要搞懂 q、k、v 都是哪来的,我们需要先弄懂几个概念。

    问题一:向量相乘的意义是什么?
      答:表征两个向量的夹角,表征一个向量在另一个向量上的投影
    所以!q1与k1相乘,q1与k2相乘,q1与k3相乘,就代表了a1与a2、a3、a4的关联性啊(这是向量相乘的意义)!

    问题2:为什么最后还要乘上一个v啊?
       :乘上V是注意力机制加权求和之后的表示。比如说a1与a2的关联性是100,与a3的关联是90,难道我能直接100+90=190吗,肯定不行啊,所以得乘上各自的一个v。

    问题3:既然是要求a1与a2和a3和a4的关联性,那我直接用 a1乘a2 不就行了,为什么要 q*k 呢?
       :当然是为了提升模型的拟合能力,q、v、k 矩阵都是可以训练的,起到一个缓冲的效果。

  • 最后,有了上述认识后,就很好的回答了 K Q V 矩阵的来源:许多文章中所谓的Q K V矩阵、查询向量之类的字眼,其本质都是从输入X中训练出来的!
    参考1:https://zhuanlan.zhihu.com/p/410776234
    参考2:https://www.zhihu.com/question/325839123/answer/2127918771

Attention机制分为哪些?

  1. 按照计算方法不同,分为 加性、点积、缩放点积、双线性模型。
    按照关注点不同,分为 自注意力、全局注意力(包括软注意力和硬注意力)、局部注意力。
    参考:https://zhuanlan.zhihu.com/p/91839581
    关于Attention、Self-Attention机制的理解_第3张图片
      1)Soft Attention,这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。
      2)Hard Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的)
      3)Local Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。

Attention 机制、 Self-Attention 机制的使用方法

Attention机制
  1. Attention机制:是在输入与输出之间做注意力。什么意思呢,比如我有一句话:我爱中国,需要翻译成英文I love China,那我怎么知道哪一个汉字对应哪一个英文呢?所以Attention本质是是目标语单词和源语单词之间的一种单词对齐机制,就如下图所示。
    关于Attention、Self-Attention机制的理解_第4张图片
    关于Attention、Self-Attention机制的理解_第5张图片
      首先一句话经过RNN网络,常规的Seq2seq方法是直接输出就行了。但事实上比如“我爱中国。”与“I Love China.” 明显这个中文的句号不与单词Love对应,但是RNN是一视同仁的,这样就不利于机器翻译任务的发展了。如果可以加入Attention机制,就可以给每个单词一个权重。
      如上图所示,将RNN模型计算好的结果输入到Attention中,这个计算好的结果就是K和V矩阵。然后解码器,例如最开始解码器输入了一个begin,那么这个begin就相当于Q矩阵(意味着KV矩阵从编码器中来,Q矩阵从解码器中来,其实这个很好理解,编码器想和解码器有某种对应关系,那么解码器当前需要解什么码,就是一个Q查询矩阵,然后这个Q矩阵和编码器哪些单词有关系,就是查询K和V矩阵)。所以呢,上图中有三条线是输入给Attention模块,然后Attention模块会算出一个结果返回给解码器,这个结果就相当于原先的Encoder-Decoder框架传递的context信息(也可以这么理解Attention模块,将原先直接传递的context信息转换为另一种带有权重信息的context信息)。
      这时候可能小伙伴们有疑惑,RNN出来的信息的context信息,不是K和V矩阵啊?没关系,随着不断训练嘛,这个输出结果是可以随着训练改变的,毕竟也是有监督信号的,对吧,监督信号先给解码器,然后解码器给注意力模块,注意力模块给RNN的输出。
Self-Attention机制
  1. Self-Attention机制:self-attention机制只是在source(输入)元素之间相乘,它的目的是比较每一个输入元素的相似程度。例如我们做LSTM或者RNN,后面单词的与前面单词的关系往往不大(因为传播距离太远了),但是自注意力机制不论远近都可以啊,是一视同仁的。此外,Self Attention对于增加计算的并行性也有直接帮助作用。
      因此,Self-Attention与Attention区别主要是,attention的q矩阵来自解码器,kv矩阵来自编码器,也就是说qkv矩阵不是来自attention的本身,因为attention不能单独存在,要借助其他网络,但是self-attention可以单独存在,因为它是自己跟自己做注意力,所以qkv矩阵是来自Self-Attention自己产生的。Self-Attention可以单独存在,例如bert和Transformer
    关于Attention、Self-Attention机制的理解_第6张图片

Attention 机制和 Self-Attention 机制的区别

  注意力机制的本质就是给予权重。只不过Attention的权重是输入向量与输出向量之间的权重对应关系,而Self-Attention的权重是输入向量内部之间的权重关系。因此这就造成了后续使用方法的差异:

  1. Q 矩阵的选取不同
      Attention因为是输入输出的差异,因此Q矩阵(查询矩阵)是解码器(也就是解码器的输出向量,见上图)提供的,例如第一个Q查询矩阵就是begin,第二个Q矩阵是根据begin计算出来的输出的Q矩阵。
      然而Self-Attention是输入向量内部的关系,和输出无关,也就意味着Q矩阵的选取与输出向量是无关的,因此Q矩阵是通过输入向量提供的,而不是输出向量提供的。

  2. 使用方法不同:
      因为Q矩阵的选取不同,导致了使用方法的不同。我们知道Attention是输入输出的权重关系(比如说“我爱中国。”与“I Love China.” 明显这个中文的句号不与单词Love对应,这样当需要翻译Love时,句号的权重就很低),因为输入的一句话中并没有序列信息,因此Attention机制是不可以单独使用的,Attention机制需要与RNN、LSTM结合,RNN、LSTM网络提供了序列信息。
      Self-Attention提供了一句话中的权重关系,相当于有了序列信息(Self-Attention使我们知道了一句话的内在联系),因此Self-Attention后面不需要接RNN、LSTM网络了,回想一下bert的self-attention后面接的不是RNN,而是Linear层!!这就是Self-Attention和Attention使用方法的区别,前者不需要序列的RNN模型,后者需要。
      再补充一点,其实不管是RNN还是MLP,都是神经网络的一种啊(回想一下最开始学最简单的MLP、CNN,再学RNN等等等,都是在学神经网络),只不过网络模型不同,目的都是一样,做一些神经元你的运算而已,只不过RNN是首尾相接的,这样就有了前一段话的信息。
      其实Self-Attention为什么好呢,最主要是速度快啊,可以并行运算呀。因为你用Attention机制后面需要接RNN,但是RNN是不可以并行运算的,但是你用Self-Attention,其机制已经包含了一句话的内在联系,所以后面接的网络是MLP,就可以并行运算了!!

Attention、Self-Attention、RNN、LSTM

  • 问题1:为什么 RNN、LSTM 不行了?
      :RNN应用中存在的问题是,每一个RNN Cell的state都取决于前一个RNN Cell的state,因此RNN很难采用并行计算,计算的速度往往较慢。基于self-attention的Transformer采用了非Recurrent的Encoder-decoder结构,这样就可以在GPU中充分利用并行计算的优势提高运算速度

  • 问题2:有没有必要将 RNN/LSTM 与 Attention 结合?
      :肯定有必要的。根据人类的阅读习惯进行思考,我们在阅读的时候,注意力通常不会平均分配在文本中的每个词。再回到NLP中,如果直接将每个时刻的输出向量相加再平均,就等于认为每个输入词对于文本表示的贡献是相等的,但实际情况往往不是这样,比如在情感分析中,文本中地名、人名这些词应该占有更小的权重,而情感类词汇应该享有更大的权重。
      为BIRNN的每个输出向量分配不同权值,使得模型可以将注意力集中在重点几个词,降低其他无关词的作用的机制就是Attention机制。使用了Attention机制可以使得文本表示的结果在当前的任务中更合理。

  • 问题3:为什么 Attention 可以和 RNN/LSTM 结合用,但几乎没有 Self-Attention 与 RNN 结合用?
      *:最开始Attention是与RNN结合使用的,但后来出现了基于Self-Attention的Transformer。意思是啥呢,Self-Attention有更好的用法,它不必与RNN结合,它是与Transformer结合的。(当然,Self-Attention也可以与RNN/LSTM结合,知网上也有许多文章是这么灌水的)
      不过啦,Transformer也有自己局限性,位置信息表示欠佳,所以强的时序信息预测Transformer是无法媲美RNN系列的。

    参考1:https://blog.csdn.net/earofreceiver/article/details/104769156/
    参考2:https://blog.csdn.net/thriving_fcl/article/details/73381217

你可能感兴趣的:(深度学习,深度学习,人工智能)