0


注意力机制(Attention)原理详解

文章结构

1. 为什么需要Attention

在了解Attention之前,首先应该了解为什么我们需要注意力机制。我们以传统的机器翻译为例子来说明为什么我们需要Attention。

传统的机器翻译,也称机器翻译(Neural machine translation),它是由encoder和decoder两个板块组成。其中Encoder和Decoder都是一个RNN,也可以是LSTM。不熟悉RNN是如何工作的读者,请参考RNN原理。假如现在想要将‘我是一个学生。’翻译成英文‘I am a student.’,传统的机器翻译是如何操作的呢?

在将中文 ‘我是一个学生’ 输入到encoder之前,应首先应该使用一些embedding技术将每一个词语表示成一个向量。encoder的工作原理和RNN类似,将词向量输入到Encoder中之后,我们将最后一个hidden state的输出结果作为encoder的输出,称之为context。Context可以理解成是encoder对当前输入句子的理解。之后将context输入进decoder中,然后每一个decoder中的hidden state的输出就是decoder 所预测的当前位子的单词。从encoder到decoder的过程中,encoder中的第一个hidden state 是随机初始化的且在encoder中我们只在乎它的最后一个hidden state的输出,但是在decoder中,它的初始hidden state 是encoder的输出,且我们关心每一个decoder中的hidden state 的输出。
传统机器翻译的过程可以用下图来表示:
在这里插入图片描述

图中的END,是一个结束标志,意味着输入已经结束。从上面的叙述中可以看到,decoder的输出取决于encoder最后一个hidden state 的输出,当输入句子很长的时候,前面的信息可能不能很好的被encoder记录。且decoder在输出的时候,不知道当前位置对应着输入的哪一个位置。此外,就算是将encoder 中所有的hidden state 全部给decoder,仍然存在问题,因为两种语言之间单词之间的位置可能没有一一对应的关系,比如中文的 ‘我是一个学生’ 是5个词翻译成英文之后就只有4个词了。还有一些语言的语法位置也不是一一对应的。我们希望能有一种方式可以让模型关注输入的相关部分。比如还是以 ‘ 我是一个学生。’为例,我们希望模型可以在翻译student的时候,更加的关注 ‘学生’这个词而不是其他位子的词。这种需求下,提出Attention技术。

2. Attention的基本原理

Attention 的大致过程是这样的。和传统机器翻译不同的是,Attention需要encoder中所有的hidden states的信息都传入decoder中,若encoder中有N个hidden states,则需要将这N个hidden states 的信息全部给decoder。将所有信息传入decoder之前,我们需要为N个hidden states 分别设置一个权重(之后会详细解释如何求得权重),之后将每一个hidden state 根据设置权重加权求和,再将所有加权求和之后的 hidden states 输入到decoder中。

假设现在decoder正在预测句子中的第i个单词,则将decoder中的第i个hidden state 与 每一个encoder的hidden state 做计算,得到一组‘得分’(注意‘’得分‘’是一个向量且长度应该与输入decoder中的hidden states 数量一致),每一个‘得分’代表了模型在预测当前位置的单词时的注意力,得分越高,模型对其的注意力也就越大。然后使用softmax将这个‘得分’向量变成一个概率分布,将其结果作为权重与对应的hidden state做加权求和,将得到的结果与当前时刻decoder的hidden state 相加,作为下一个decoder hidden layer的输入。

上述步骤用示意图进行表示:
在这里插入图片描述
那么Attention技术中的权重 是如何求得的呢?
首先先了解所谓的 ‘得分’ 是如何求得的,这里使用Luong的定义:

在这里插入图片描述
其中

     h
    
    
     t
    
   
  
  
   h_t
  
 
ht​是第t个时刻decoder的hidden state,而 

 
  
   
    
     
      h
     
     
      s
     
    
    
     ˉ
    
   
  
  
   \bar{h_{s}}
  
 
hs​ˉ​表示的是encoder的hidden states,W是一个需要学习的矩阵,且在整个过程中,都使用同一个W, 在求得了得分之后我们就可以求得Attention的权重了:

在这里插入图片描述
然后再将权重与encoder中的hidden states 相乘求得 context vector(也就是图中的C1,C2):
在这里插入图片描述

之后就可以计算Attention vector了:
在这里插入图片描述
上述方程阐述的是将

     c
    
    
     t
    
   
  
  
   c_t
  
 
ct​与

 
  
   
    
     h
    
    
     t
    
   
  
  
   h_t
  
 
ht​结合的过程,对应图中C1 与 H7 和 C2 与 H8相结合的过程。从上述的四个式子中我们可以发现decoder中的hidden state 被被使用了两次,第一次是使用在了求权重

 
  
   
    
     a
    
    
     
      t
     
     
      s
     
    
   
  
  
   a_{ts}
  
 
ats​中,第二次使用在了与

 
  
   
    
     c
    
    
     t
    
   
  
  
   c_t
  
 
ct​结合生成

 
  
   
    
     a
    
    
     t
    
   
  
  
   a_t
  
 
at​的步骤中。

3.自注意力机制(Self-Attention)

从上述的阐述中可以了解到 Attention的产生是依赖于一个权重,它告诉了模型哪些词需要重视,哪些词不太需要重视。我们也可以发现,这个权重的产生是需要encoder的输出和decoder中t时刻hidden state 来产生的。那么所谓的自注意力机制是什么?了解自注意力机制之前,首先先简单了解一下Transformer网络,它也是基于机器翻译推出的,最先出现在论文《Attention is all you need》中,这篇论文提到的是去掉RNN网络,只使用Self-Attention技术,会使网络训练得更快。

Transformer 也是用多个encoder 和 decoder 组合而成的。下图表示的是一个encoder和一个decoder的结构:
在这里插入图片描述
从上图可以发现Encoder中包含着两层分别是Self-attention层和一个Feed forward层,decoder中包含着三层,分别是self-attention, encoder-decoder Attention 和 Feed forward 层。 其中所谓的encoder-decoder Attention就和先前讲到的Attention机制一样,需要同时使用encoder和decoder的信息来生成Attention。

在Transformer的encoder结构如下图所示:
在这里插入图片描述
这个encoder的结构并不太复杂,总的来说就是将上一层的输入

     x
    
    
     i
    
   
   
    ;
   
   
    i
   
   
    =
   
  
  
   x_i ;i=
  
 
xi​;i={1,2,3…},输入到self-attention层中,然后输出一个对应的向量 

 
  
   
    
     z
    
    
     i
    
   
  
  
   z_i
  
 
zi​ 并将 每一个

 
  
   
    
     z
    
    
     i
    
   
  
  
   z_i
  
 
zi​ 输入到一个单独的 Feed forward 网络中去,得到对应的输出 

 
  
   
    
     r
    
    
     i
    
   
  
  
   r_i
  
 
ri​,之后再将 

 
  
   
    
     r
    
    
     i
    
   
  
  
   r_i
  
 
ri​ 输入到下一个Self-Attention层中,以此类推。

从上述过程中可以看出,不同的输入唯一发生信息交换的地方就是在self-attention层中。所以self-attention的产生只是依赖于多个输入数据自己产生的,而不是像Attention那样需要encoder和decoder的信息。这也是为什么它叫做self-attention的原因。

那么在self-attention层中到底发生了什么呢?
在这里插入图片描述
首先我们将需要翻译的词语做embedding 同时随机生成三个矩阵,分别为

     W
    
    
     Q
    
   
  
  
   W^Q
  
 
WQ,

 
  
   
    
     W
    
    
     K
    
   
  
  
   W^K
  
 
WK,

 
  
   
    
     W
    
    
     V
    
   
  
  
   W^V
  
 
WV,并将每一个词语的词向量都与这个三个矩阵相乘,得到三个新的向量,称之为 ‘Queries’ , ‘Keys’, ‘Values’。 根据上图,我们将q1与k1相乘得到 

 
  
   
    
     y
    
    
     1
    
   
  
  
   y_1
  
 
y1​ ,然后再将q1与k2相乘得到 

 
  
   
    
     y
    
    
     2
    
   
  
  
   y_2
  
 
y2​,分别将 

 
  
   
    
     y
    
    
     1
    
   
   
    ,
   
   
    
     y
    
    
     2
    
   
  
  
   y_1,y_2
  
 
y1​,y2​ 除以

 
  
   
    
     
      d
     
     
      k
     
    
   
  
  
   \sqrt{d_k}
  
 
dk​​得到

 
  
   
    
     y
    
    
     1
    
    
     
     
      ′
     
    
   
   
    ,
   
   
    
     y
    
    
     2
    
    
     
     
      ′
     
    
   
  
  
   y_1^{'},y_2^{'}
  
 
y1′​,y2′​,其中

 
  
   
    
     d
    
    
     k
    
   
  
  
   d_k
  
 
dk​可以理解成是词向量x的长度。 之后将得到的

 
  
   
    
     
      d
     
     
      k
     
    
   
  
  
   \sqrt{d_k}
  
 
dk​​得到

 
  
   
    
     y
    
    
     1
    
    
     
     
      ′
     
    
   
   
    ,
   
   
    
     y
    
    
     2
    
    
     
     
      ′
     
    
   
  
  
   y_1^{'},y_2^{'}
  
 
y1′​,y2′​分别通过softmax得到两个权重

 
  
   
    
     s
    
    
     1
    
   
   
    ,
   
   
    
     s
    
    
     2
    
   
  
  
   s_1,s_2
  
 
s1​,s2​,然后使用

 
  
   
    
     s
    
    
     1
    
   
   
    ,
   
   
    
     s
    
    
     2
    
   
  
  
   s_1,s_2
  
 
s1​,s2​分别乘以

 
  
   
    
     v
    
    
     1
    
   
  
  
   v_1
  
 
v1​再将两个结果相加,得到的结果就是

 
  
   
    
     z
    
    
     1
    
   
  
  
   z_1
  
 
z1​。

 
  
   
    
     z
    
    
     2
    
   
  
  
   z_2
  
 
z2​的得来也是一样的步骤。

4.总结

本文记录了Attention以及Self-Attention的基本原理,以及他们是如何做到聚焦输入的局部信息的。Attention的产生需要encoder与decoder的信息结合,而self-attention的产生是输入经过一系列的复杂矩阵运算得到的结构。Self-attention技术可以不用在依赖于RNN。使得训练更加高效。


本文转载自: https://blog.csdn.net/weixin_52668444/article/details/115288690
版权归原作者 Gamma and Beta 所有, 如有侵权,请联系我们删除。

“注意力机制(Attention)原理详解”的评论:

还没有评论