前言

前段时间写了关于RNN,LSTM、BLSTM相关的博客,从结构上对这是那种网络进行了讲解,前两天看了一篇有关注意力机制的论文,很感兴趣,于是今天恶补了一天,在这里写下学习心得,从另外一个方面来介绍上述模型的优点。

人类注意力机制

从注意力模型的命名方式看,很明显其借鉴了人类的注意力机制,因此,我们首先简单介绍人类视觉的选择性注意力机制。

lstm加attention注意力机制Python代码 lstm和注意力机制_线性变换


其实详细说起来复杂但是如果简单是的说就是一个关键词“选择性”。人类的大脑对信息进行处理的时候通常是以重要信息为突破点,选择性的关注,进而更好的理解信息。

Encoder-Decoder框架

为了更简单理解注意力机制,我们利用Encoder-Decoder框架来讲解,简单说就是机器翻译,这样更容易理解。我们先说传统的Encoder-Decoder框架。

lstm加attention注意力机制Python代码 lstm和注意力机制_Source_02


以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。Source和Target可以是同一种语言,也可以是两种不同的语言。而Source和Target分别由各自的单词序列构成:

lstm加attention注意力机制Python代码 lstm和注意力机制_机器翻译_03


Encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:

lstm加attention注意力机制Python代码 lstm和注意力机制_线性变换_04


对于解码器Decoder来说,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息 来生成i时刻要生成的单词

lstm加attention注意力机制Python代码 lstm和注意力机制_Source_05


这里说了太多了我总结一下,这里其实做到了一点那就是“记忆”,所谓的c记下了之前的序列,然后拿去作用于输出。但是对于这里的c有一个无法弥补的缺点。那就是没有关注点,c只是单纯的整个语义编码,没有任何“选择性”,所以并不是明确的选择。

引入注意力模块

lstm加attention注意力机制Python代码 lstm和注意力机制_网络_06


这就是引入模块以后的模型。

我们可以看出模型发生了变化:

lstm加attention注意力机制Python代码 lstm和注意力机制_线性变换_07

c对应每个翻译阶段是不同的:

lstm加attention注意力机制Python代码 lstm和注意力机制_网络_08


也就是说产生了所谓的“选择性”。对于不同的词翻译时c是不同的。让我们的翻译有了侧重点,更加有利于翻译。这样我们在引入注意力模块后就有了选择性的存在。举个图像翻译的例子:

lstm加attention注意力机制Python代码 lstm和注意力机制_Source_09


这就是加入了注意力机制后模型开始具有了“选择性”。

LSTM/BLSTM

那么这些和LSTM/BLSTM有神魔关系。严格意义来说LSTM/BLSTM加入注意力机制,在RNN中,我们可以联系上下文,但是却是机械的接受一段时间内所有的前端输出,这里存在两个问题一、RNN只能做到短时记忆,很不利于联系上下文。二、没有“选择性”。当过渡到LSTM,由于遗忘门的出现,就出现了选择性,可以说LSTM不仅实现了联系上下文。而且实现了选择性记忆,就是注意力。这样就可以更好的实现识别工作。
至于BLSTM他出现了反向反馈这样就能不仅联系上文也能联系下文。这样就在LSTM上更进了一步。