注意力机制(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 的输出。
传统机器翻译的过程可以用下图来表示:

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

图中的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)原理详解
那么Attention技术中的权重 是如何求得的呢?

首先先了解所谓的 ‘得分’ 是如何求得的,这里使用Luong的定义:

注意力机制(Attention)原理详解
其中h t h_t h t ​是第t个时刻decoder的hidden state,而 h s ˉ \bar{h_{s}}h s ​ˉ​表示的是encoder的hidden states,W是一个需要学习的矩阵,且在整个过程中,都使用同一个W, 在求得了得分之后我们就可以求得Attention的权重了:
注意力机制(Attention)原理详解
然后再将权重与encoder中的hidden states 相乘求得 context vector(也就是图中的C1,C2):
注意力机制(Attention)原理详解

之后就可以计算Attention vector了:

注意力机制(Attention)原理详解
上述方程阐述的是将c t c_t c t ​与h t h_t h t ​结合的过程,对应图中C1 与 H7 和 C2 与 H8相结合的过程。从上述的四个式子中我们可以发现decoder中的hidden state 被被使用了两次,第一次是使用在了求权重a t s a_{ts}a t s ​中,第二次使用在了与c t c_t c t ​结合生成a t a_t a t ​的步骤中。

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

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

Transformer 也是用多个encoder 和 decoder 组合而成的。下图表示的是一个encoder和一个decoder的结构:

注意力机制(Attention)原理详解
从上图可以发现Encoder中包含着两层分别是Self-attention层和一个Feed forward层,decoder中包含着三层,分别是self-attention, encoder-decoder Attention 和 Feed forward 层。 其中所谓的encoder-decoder Attention就和先前讲到的Attention机制一样,需要同时使用encoder和decoder的信息来生成Attention。

在Transformer的encoder结构如下图所示:

注意力机制(Attention)原理详解
这个encoder的结构并不太复杂,总的来说就是将上一层的输入x i ; i = x_i ;i=x i ​;i ={1,2,3…},输入到self-attention层中,然后输出一个对应的向量 z i z_i z i ​ 并将 每一个z i z_i z i ​ 输入到一个单独的 Feed forward 网络中去,得到对应的输出 r i r_i r i ​,之后再将 r i r_i r i ​ 输入到下一个Self-Attention层中,以此类推。

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

那么在self-attention层中到底发生了什么呢?

注意力机制(Attention)原理详解
首先我们将需要翻译的词语做embedding 同时随机生成三个矩阵,分别为 W Q W^Q W Q,W K W^K W K,W V W^V W V,并将每一个词语的词向量都与这个三个矩阵相乘,得到三个新的向量,称之为 ‘Queries’ , ‘Keys’, ‘Values’。 根据上图,我们将q1与k1相乘得到 y 1 y_1 y 1 ​ ,然后再将q1与k2相乘得到 y 2 y_2 y 2 ​,分别将 y 1 , y 2 y_1,y_2 y 1 ​,y 2 ​ 除以d k \sqrt{d_k}d k ​​得到y 1 ′ , y 2 ′ y_1^{‘},y_2^{‘}y 1 ′​,y 2 ′​,其中d k d_k d k ​可以理解成是词向量x的长度。 之后将得到的d k \sqrt{d_k}d k ​​得到y 1 ′ , y 2 ′ y_1^{‘},y_2^{‘}y 1 ′​,y 2 ′​分别通过softmax得到两个权重s 1 , s 2 s_1,s_2 s 1 ​,s 2 ​,然后使用s 1 , s 2 s_1,s_2 s 1 ​,s 2 ​分别乘以v 1 v_1 v 1 ​再将两个结果相加,得到的结果就是z 1 z_1 z 1 ​。z 2 z_2 z 2 ​的得来也是一样的步骤。

; 4.总结

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

Original: https://blog.csdn.net/weixin_52668444/article/details/115288690
Author: Gamma and Beta
Title: 注意力机制(Attention)原理详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/613766/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球