当前位置:   article > 正文

attention机制_自然语言处理中的Attention机制简述(一)

attention机制_自然语言处理中的Attention机制简述(一)
abbec3c9f81fc6c52a056a31a4536bb6.gif

Attention机制(注意力机制)是自然语言处理近几年发展中的一个里程碑式的技术,目前已经成为了各种模型的标配,而后来大火的Transformer更是将Attention发挥到了极致。本系列我将给大家简单介绍下Attention机制的原理以及几个著名变种。本文作为本系列的第一篇,将主要介绍Attention的基本知识。

*本文部分内容和图片参考了一些已有的博文,文末将附上链接。

什么是Attention

从认知学上讲,Attention是指人在认知事物的过程中选择性的关注一些“重要”的部分,而忽略其他部分的行为。

71550fc8dbdfb00c388fe32c96cfe635.png

(此图来自于参考[5])

以上图为例,人们在看到这种图片能够判断出图片中是一条狗,这种判断的依据是来自于狗的关键特征,比如狗鼻子,狗耳朵等,而不是身上的衣服。换句话说,如果把狗的关键特征遮住,人并不能判断出图片到底是什么或者会判断出错。这样的一个认知过程,就是Attention!

同样,在自然语言中,人们同样会有这种类似的认知过程。

b9b45c7e987762d6ff9a69288093ccd9.png

(此图来自于参考[5])

比如上面这句话,很显然,eating和apple之间的关联比较紧密,而green跟eating之间的关联就比较弱。此时,attention更像是在描述一种相似度,相似度比较高的就是High Attention。

为机器翻译而生

Attention在自然语言处理领域第一次被提出,是在2014年的一篇机器翻译的文章《Neural machine translation by jointly learning to align and translate》中,即著名的Bahdanau Attention。那么在Attention被引入之前,利用神经网络做机器翻译都是怎么做的呢?Attention机制的引入又是为了解决什么问题呢?

传统的神经网络机器翻译是基于Seq-to-Seq的框架,如下图所示:

ccdffd3809f264feac0854f7a5cdc31b.png

(此图来自于参考[5])

简而言之,就是先通过一个Encoder将源语言编码成一个Context Vector,然后再通过一个Decoder将Context Vector解码成目标语言。

9b0aa601e81b10a462ffc733dc6345e5.png

那么这么做有什么问题呢?主要是两个:

  1. 将一个很长的源语言句子压缩成一个定长的Context Vector势必会造成一定的信息损失,尤其是远端的字。

  2. 解码阶段,当解码到某一个字的时候,需要的源语言信息是不一样的,比如解码“吃”的时候,肯定是更关注源语言中的“eating”这个词。

Attention机制的引入正是为了解决这两个问题。具体的做法是,在每个解码步骤时的Context Vector都是现计算的,而不是都共享一个Context Vector。这个Context Vector是由Encoder的每个隐状态向量加权得到的,解码时刻t时的Context Vector定义如下:

b78a6577ec00e1e87668956456b7a4ca.png

那么这个加权值时怎么来的呢?其实很简单,是通过解码步骤t-1时刻的隐状态向量与Encoder阶段的每个隐状态向量计算相似度得到的。这个相似度的计算方法很多,比如可以通过一个简单的网络得到:

5fccf8ef9cc49e20e458d861d3197c36.png

这里有两点值得强调下:

  1. 在计算t时刻的Context Vector时,Bahdanau Attention是使用解码阶段t-1时刻的隐状态向量来计算的,而不是当前时刻t,这是跟后来的Luong Attention的区别之一。

  2. 这里的相似度计算方法很多,只要能衡量相似度即可,不一定非得用网络来做。

在计算完相似度之后,通常还会进行一个Softmax归一化:

84c95edd33c217aa48ec5399851abeb3.png

Attention的一般形式

一般来说,Attention可以理解成一个通过相似度计算得到的分数,来对某个信息进行加权的过程。

10d4b1e966b6fa697a349e7a154e78c0.png

如上图所示,Attention机制中有三个概念,分别时Attention Query, Key, Value, 计算的过程是通过Attention Query去计算与Key的相似度,然后用这个相似度来加权Value,得到最终的Attention值。值得注意的是,在自然语言处理中,通常Key和Value是指同一个Vector。比如在Bahdanau Attention中,Query是Decoder的t-1步的隐状态向量,Key和Value都是Encoder阶段的隐状态向量。

Attention的计算过程可以总结为三步:

1. 计算Query和每个Key的相似度,得到一个相似度向量,这里有很多种计算方法,比如点积,Cosine都是可以的;

2. 将相似度向量做Softmax归一化,得到Attention Weight;

3. 使用Attention Weight与Value进行加权,得到最终的向量表示。回到Bahdanau Attention中,这个向量表示就是Context Vector,可以发现,因为Query不同,Context Vector也就不同,从而实现了每个Decoding Step都能够关注不同的Source端的信息。

(Note: 这个第三步并不是必须的,有一些工作会直接拿第二步的Attention Weight来进行后续处理,这个在接下来的Attention变种会提到。)

7b703ea308a2f366892b0dbf30877532.png

正如之前提到的,这里的相似度计算有很多种方法,以下罗列了以下常见的方法:

4938318dc70ee40dd35b7b90086e9324.png

Attention分类

在后来的针对Attention的改进中,有人对Attention机制做了一些分类,以下列出两个比较著名的分类

°

Soft vs. Hard Attention

文献[6]中提出了所谓的Soft Attention和Hard Attention的定义。 所谓的Soft Attention就是我们之前介绍的这种Attention机制,即Attention Weight是通过Query跟Source上所有的Key计算相似度得到的。这种做法的好处是整个计算过程是End2End的,模型学习比较容易,缺点是如果Source端很大,就会导致这个计算过程比较耗时。 与Soft Attention相对的这种Hard Attention正是为了解决这个问题,即每次Query去跟Source计算相似度时,不是“Attend”到所有的Key上,而是只与其中的一部分“Key”计算相似度。这种做法的好处肯定是大大减少了计算时间,尤其是Inference阶段,但是带来的缺点是,怎么选择计算Attention Weight时需要的”那部分“Key是一个问题。°

Global vs. Local Attention

后来的文献[7],即另一个著名的Luong Attention中又提出了一个类似的分类方法,个人认为这个名字叫法更加直观,即所谓的Global Attention和Local Attention。 Global Attention跟上述的Soft Attention定义是一样的,顾名思义,计算Attention Weight时利用了Source端Global信息。 Local Attention和Hard Attention也比较类似,也是为了计算Attention Weight时更关注Source端局部的信息。但是他与Hard Attention不同的地方在于,他提出了一些更"Soft"的方法来选择局部信息,这会让模型变得更容易学习,至于哪里体现了Soft,接下来会相似描述。 具体来说,Local Attention的第一步是预测出,当Decoding到Step t时,更关注Source端哪一个位置p_t周边的信息。文中提出了两种做法: 1. Monotonic Alignment, 即:

4f9abed97ac1d75c75b68a649a96bd99.png

比如,对于翻译认为,中文是"我吃饭",对应的英文是"I eat rice",这两句话翻译时是按顺序翻译的,所以当Decode到第二个词"eat"时,按照这种预测方法,就会更关注Source端第二个字周边的信息,即"吃"。 很显然,这种方法也有很多问题,比如Source与Target端长度不一致,更严重的是,Source端和Target端并不是按顺序对应的时候。 这时作者就提出了另一种预测方法,即每次都通过一个另外的预测网络,来预测此时应该更关注Source端的哪一个位置。 2. Predictive Alignment, 即:

f385b27c9be5c3fd8883d14130a20ae4.png

可以发现,Sigmoid是一个0-1之间的值,S是Source端的长度,所以得到的p_t一定会在0-S之间,即某一个位置。(Note,这个位置不一定是具体的位置,即不一定是整数,这是第一处"Soft") 有了这个位置之后,作者通过一个高斯分布加权Attention Weight, 显然越靠近预测位置p_t 的加权值越高,而远离p_t的Attention Weight就会被削弱,从而实验了Local Attention的目的。(Note,这里也不是用一个固定的窗口去选局部信息,这是第二处"Soft")

Reference:

[1] Graves A, Wayne G, Danihelka I. Neural turing machines. 2014

[2] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate. 2014

[3] Luong M T, Pham H, Manning C D. Effective approaches to attention-based neural machine translation. 2015

[4] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need. 2017

[5] Attention? Attention! https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html

[6] Xu K, Ba J, Kiros R, et al. Show, attend and tell: Neural image caption generation with visual attention. 2015

[7] Luong M T, Pham H, Manning C D. Effective approaches to attention-based neural machine translation. 2015

87ab881beea0b8f35053e6f549d19231.gifEND▼更多精彩推荐,请关注我们▼ 113cfe611d9236477676c1220b026f83.gif e4683e38a715d7e641ad2fafff547a00.png 3f6cd26f35dc35d91bbc34e9114cd9bd.gif
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号