浅析Attention机制

引入

Attention机制目前在深度学习领域应用的越来越多了,在CV和NLP领域都有大量应用。使用keras的Attention模块,可以说是能随意为深度学习模型插上Attention的翅膀了。

那Attention机制的基本原理是什么?它有哪些优缺点呢?

Attention机制的提出

Attention机制是九几年在CV领域被提出的思想[1]。

然后2014年Google DeepMind发表《Recurrent Models of Visual Attention》让Attention被更多人注意到了,他们在CV领域,用Attention来从图像/视频中,有选择的选取部分像素点来进行处理,而不是处理完整的图像(所有像素点)。

2015的《Neural Machine Translation by Jointly Learning to Align and Translate》中提出了将Attention用到了NLP领域的翻译任务中。2017年Google Brain团队的《Attention Is All You Need》,一改翻译任务中用Encoder+Decoder的传统作风,抛弃了RNN/DNN等经典结构,提出了只用Attention机制构成的Transformer模型,模型简单性能又好。这都使Attention在NLP领域得到了更广泛的应用。

Attention的本质

Attention本质是来源于人类注意力机制,我们再感知东西的时候,不会看所有内容,而只会根据需求去集中注意力观察部分内容。

比如做题时,你忘记了二叉树先序遍历的内容,那你只需要把《算法导论》中相关内容看一下,而不是把整本书都看完。

Attention的原理

我们以NLP中翻译任务为例来解释Attention的原理。

传统的深度学习翻译模型,都是由Encoder和Decoder组成的,如下图所示

在这里插入图片描述

Encoder与Decoder一般都是LSTM。这里要注意,输入的向量维度,Encode后的向量维度,与Decoder后的向量维度,这三个维度不一定是相同的(大部分情况是不相同的)。

RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降[2]。

为了解决这个问题,通过人类的翻译经验,我们在翻译时,会集中注意力处理某几个词,从而引入了Attention机制。下面是一个Attention层的示意图[3]:

在这里插入图片描述

先解释其中的一些参数:

  • Tx:输入的一句话,经过特征工程与Encode后,所得到的向量维度。Encoder的输出向量维度
  • Ty:要输出/翻译的语言,的特征向量/词语编码维度。一般即Attention层的输出编码维度

对某个输入x,这个Attention层的具体的计算过程如下:

  1. 计算Attention_i的值

有很多种计算方式,只要Attention_i的维度是Tx,并且所有Attention_i的和为1:

在这里插入图片描述

  1. 计算输入向量的attention权重和c_i:

在这里插入图片描述

  1. 将c_i送入RNN,得到y_i

在这里插入图片描述

y_i就是这一个attention层的输出

为什么在Attention层中还需要RNN

如果去掉这个RNN,由上面第2步的公式,可以推理出,所有c_i都一样了。

Attention的优缺点

[1]中总结了这些优点

  • 一步到位的全局联系捕捉
  • 并行计算减少模型训练时间
  • 模型复杂度小,参数少

以及缺点

  • 它不能捕捉语序顺序(元素的顺序)。这在NLP中是比较糟糕的,自然语言的语序是包含太多的信息。如果确实了这方面的信息,结果往往会是打折扣的。说到底,attention机制就是一个精致的"词袋"模型

参考

  • [1] https://zhuanlan.zhihu.com/p/35571412
  • [2] https://zhuanlan.zhihu.com/p/47063917
  • [3] https://muffintech.org/blog/id/12/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章