多图+公式全面解析RNN,LSTM,Seq2Seq,Attention注意力机制

多图+公式全面解析RNN,LSTM,Seq2Seq,Attention注意力机制,第1张

我们知道人类并不是从零开始思考东西,就像你读这篇文章的时候,你对每个字的理解都是建立在前几个字上面。你读完每个字后并不是直接丢弃然后又从零开始读下一个字,因为你的思想是具有持续性的,很多东西你要通过上下文才能理解。

然而传统的神经网络并不能做到持续记忆理解这一点,这是传统神经网络的主要缺点。举个例子,你打算使用传统的神经网络去对电影里每个时间点发生的事情进行分类的时候,传统的神经网络先让不能使用前一个事件去推理下一个事件。

RNN(递归神经网络)可以解决这个问题。他们是带有循环的神经网络,允许信息在其中保留。

这些循环让递归神经网络看起来有点神秘,然而如果你再思考一下,RNN其实和传统的神经网络并没有太多的不同。RNN可以看作是一个网络的多次拷贝,其中每次网络的输出都是下一次的输入。我们可以思考一下我们如果展开这个循环结构会是什么样的:

这种像是链状的网络结构表明RNN和序列以及列表有着天然的联系,他们是处理这些序列数据的天然的神经网络。而且很明显我们可以看出,输入输出的序列是具有相同的时间长度的,其中的每一个权值都是共享的(简败漏不要被链式形状误导,本质上只有一个cell)。

在最近的几年,RNN在很多问题上都取得了成功:比如语音识别,语音模型,翻译,图片注释等等,但是RNN存在着梯度消息/爆炸以及对长期信息不敏感的问题,所以LSTM就被提出来了。现在很多问题的成功都必拦烂须归功于LSTM,它是递归神经网络的一种,它在许多的任务中表现都比普通的RNN更好,所以接下来我们来探索一下这个神奇的网络。

人们希望RNN可以将一些之前的信息连接到当前的任务中来,比如使用之前的视频帧来帮助理解当前帧。如果RNN可以做到将会非常有用。那实际RNN能做到吗?这要视情况而定。

有时候,我们只需要当前的信息来完成当前的任务。举个例子,一个语音模型试图基于之前的单词去预测下一个单词。如果我们尝试预测“the clouds are in the sky”,我们不需要太多的上下文信息——很明显最后一个单词会是sky。在像这样不需要太多的相关信息的场合下,RNN可以学习到之前使用的信息。

但是我们要注意,也有很多场景需要使用更多的上下文。当我们试图去预测“I grew up in France… I speak fluent French”这句话的最后一个单词,最近的信息会表明这应该是一种语言的名字,但是如果我们需要知道具体是哪一种语语言,我们需要France这个在句子中比较靠前的上下文信息,相关信息和需要预测的点的间隔很大的情况是经常发生的。

不幸的是,随着间隔变大,RNN变得无法连接到太前的信息。

理论上RNN完全可以处理这种长期依赖(long-term dependencies)的问题。人们可以通过小心地选择参数来解决这个问题。令人悲伤的是,实践表明RNN并不能很好地解决这个问题,Hochreiter (1991) [German] and Bengio, et al. (1994)发现了RNN为什么在这些问题上学习很困难的原因。

而LSTM则没有这个问题。

长期短期记忆网络-通常叫做LSTM-是一种特殊结构的RNN,它能够学习长期依赖。它在大量的问题有惊人的效果,现在已经被广泛使用。

LSTM被明确设计来避枯者免长期依赖问题,记住长时间的信息对LSTM来说只是常规 *** 作,不像RNN那样费力不讨好。

所有的RNN都有不断重复网络本身的链式形式。在标准的RNN中,这个重复复制的模块只有一个非常简单的结果。例如一个tanh层:

LSTM也有这样的链式结构,但是这个重复的模块和上面RNN重复的模块结构不同:LSTM并不是只是增加一个简单的神经网络层,而是四个,他们以一种特殊的形式进行交互:

在上图中,每条线表示一个向量,从一个输出节点到其他节点的输入节点。粉红色的圆圈表示逐点式 *** 作,就像向量加法。黄色的盒子是学习好的神经网络层。线条合代表联结,线条分叉则表示内容被复制到不同的地方。

LSTM的核心之处就是它的cell state(神经元状态),在下图中就是那条贯穿整个结果的水平线。这个cell state就像是一个传送带,他只有很小的线性作用,但却贯穿了整个链式结果。信息很容易就在这个传送带上流动但是状态却不会改变。cell state上的状态相当于长期记忆,而下面的 则代表短期记忆。

门限是一种让信息选择性通过的方式,它们是由sigmoid神经网络层和逐点相乘器做成的。

sigmoid层输出0和1之间的数字来描述一个神经元有多少信息应该被通过。输出0表示这些信息全部不能通过,而输出1则表示让所有信息都通过。

一个LSTM有三个这样的门限,去保护和控制神经元的状态。

LSTM的第一步就是决定什么信息应该被神经元遗忘。这是一个被称为“遗忘门层”的sigmod层组成。他输入 和 (上一次的输出以及这轮的输入),然后在 的每个神经元状态输出0和1之间的数字。同理1表示完全保留这些信息,0表示完全遗忘这个信息。

让我们再次回到一开始举的例子:根据之前的词语去预测下一个单词的语言模型。在这个问题中,cell state或许包括当前主语中的性别信息,所以我们可以使用正确的代词。而当我们看到一个新的主语(输入),我们会去遗忘之前的性别信息。我们使用下图中的公式计算我们的“遗忘系数”

在那个语言模型例子中,我们想给cell state增加主语的性别,来替换我们将要遗忘的旧的主语。

我们给旧的状态乘一个遗忘系数 ,来遗忘掉我们之前决定要遗忘的信息,然后我们增加 。这是新的候选值,由我们想多大程度更新每个状态的值决定。

在语言模型中,就像上面描述的,这是我们实际上要丢弃之前主语的性别信息,增加新的主语的性别信息的地方。

最后,我们需要决定我们要输出什么。这个输出是建立在我们的cell state的基础上,但是这里会有一个滤波器。首先,我们使用sigmoid层决定哪一部分的神经元状态需要被输出;然后我们让cell state经过tanh(让输出值变成-1到1之间)层并且乘上sigmod门限的输出,这样我们就只输出我们想要输出的。

对于那个语言模型的例子,当我们看到一个新的主语的时候,或许我们想输出相关动词的信息,因为动词是跟在主语后面的。例如,它或许要输出主语是单数还是复数的,然后我们就知道主语后动词的语态了。

上面讲的都是一些常规的LSTM,但并不是所有的LSTM都是上面这种形式。实际上现在很多包含LSTM的论文都有小的差异,但是它值得一提。

Gers &Schmidhuber (2000) 引入了一个流行的LSTM变体,它增加了一个窥视孔连接。这意味着我们让门限层监视cell state的状态。

另外一个变体是使用组合遗忘和输入门,而不是分开决定哪些神经元需要遗忘信息,哪些需要增加新的信息,我们组合起来决定。我们只遗忘那些需要被放入新信息的状态,同样我们旨在旧信息被遗忘之后才输入新的信息。

一个更神奇的LSTM变体是门递归单元(也就是大家常说的GRU),它组合遗忘门和输入门为一个更新门,它合并了cell state和隐层状态,并且做了一些其他的改变。最终这个模型比标准的LSTM更简单,并且变得越来越流行。

我们一开始提到人们使用RNN取得了卓越的成果,但其实本质上都是使用LSTM取得的,他们的确在多数任务上表现得更好。

写下来一系列等式以后,LSTM看起来挺吓人,但在文中一步步解释后它变得可以理解了。我们不禁想问:是否有比LSTM更好的模型?学者一致认为:那就是attention注意力机制。核心观点就是让RNN每一步都监视一个更大的信息集合并从中挑选信息。例如:如果你使用RNN去为一个图像生成注释,它会从图像中挑选一部分去预测输出的单词。接下来在讲解attention之前,我们会先聊聊Seq2Seq。

我将会结合一个机器翻译的例子来给大家形象地介绍Seq2Seq。

在这个例子中,我们试图将英语转换为德语,这里要注意这里是一个多对多的模型,而且输入和输出的长度都不固定。

Seq2Seq有一个编码器和一个解码器,编码器一般是LSTM或者其他模型用于提取特征,它的最后一个输出就是从这句话得出的最后的特征,而其他的隐层输出都被丢弃。

同样,我们先把句子输入到我们的Encoder里面,Encoder会输入最后状态 ,作为这句话的特征送给Decoder。

Seq2Seq模型有一个encoder网络和一个Decoder网络,在我们的例子中encoder的输入是英语句子,每输入一个词RNN就会更新状态并记录下来,encoder最后一个状态就是这个句子的特征,并把之前的状态丢弃。把这个状态作为decoder的初始状态,初始化后decoder就知道这个句子了,首先把起始符作为decoder的输入,然后一步步更新,输出状态和概率分布预测下一个字符,再把预测的字符作为下一个输入,重复这个过程,最后直到预测终止符就返回输出的这个序列。

我们的encoder和decoder都是LSTM,encoder把所有句子的特征压缩到最后一个状态,理想情况下encoder最后一个状态包含完整的信息,假如句子很长,那么句子有些信息就会被遗忘,那么Decoder就没有完整的句子信息,那decoder输出的德语句子就不完整。

一种简单方法就是使用双向LSTM,双向LSTM简单来说就是用两条链,从左到右这条链可能会遗忘最左边的信息,而从右往左的这条链可能会遗忘右边的信息,这样结合起来就不容易遗忘句子信息,这里要注意只是encoder用双向LSTM,decoder是单向LSTM,他要生成正确顺序的序列。

另外一种方法改进就是multi-Task learning,我们还可以多加入几个任务,比如让英语句子让他自己翻译成英语句子,这样encoder只有一个但是数据多了一倍,这样encoder就能被训练的更好,当然你还可以添加其他语言的任务,通过借助其他语言更好训练encoder,这样虽然decoder没有变得更好,但是因为encoder提取的更好最后效果也会变好。

当然还有一个方法就是使用注意力机制,这个对机器翻译提高作用很大,我们接下来就讲解这个注意力机制。

我们知道Seq2Seq模型有一个缺点就是句子太长的话encoder会遗忘,那么decoder接受到的句子特征也就不完全,我们看一下下面这个图,纵轴BLUE是机器翻译的指标,横轴是句子的单词量,我们可以看出用了attention之后模型的性能大大提升。

用了注意力机制,Decoder每次更新状态的时候都会再看一遍encoder所有状态,还会告诉decoder要更关注哪部分,这也是attention名字的由来。但是缺点就是计算量很大。

在encoder结束之后,attention和decoder同时工作,回忆一下,decoder的初始状态 是encoder最后一个状态,不同于常规的Seq2Seq,encoder所有状态都要保留,这里需要计算 与每个状态的相关性,我使用 这个公式表示计算两者相关性,把结果即为 ,记做Weight,encoder有m个状态,所以一共有m个 ,这里所有的值都是介于0和1的实数,全部加起来为1。

这张图下面是encoder,上面是decoder,attention会把decoder所有状态与encoder所有状态计算相似性,也就是 .在这张图中每条线就对应一个 ,线越粗说明相关性越高。

这次仅仅是从机器翻译的角度介绍了attention的一个应用,还有一些比如self-attention,Transformer应用,希望以此为印子能够打开读者attention的大门。

1.colah's blog http://colah.github.io/posts/2015-08-Understanding-LSTMs/

2.CS583 https://github.com/wangshusen/DeepLearning

编码器-解码器 的结构效果比较好。这种结构,把输入序列编码成为一个 固定长度 的向量表示。散烂这样做对于 较短的输入序列而言,能够学习出对应合理的向量表示。但是,输入序列非常长时,模型难以学到合理的向量表示。

传统使用 编码器-解码器 的 RNN 模型先用一些 LSTM 单元来对输入序列进行学习,编码为固定长度的向量表示;然后再用一些 LSTM 单元来读取这种向量表示并解码为输出序列。

存在的一个问题在于: 输入序列不论长短都会被编码成一个固定长度的向量表示,而解码则受限于这个固定长度的向量表示。

上面的问题限制了隐磨模型的性能,尤其是输入序列比较长,模型的性能变得很差。

基本思想就是,打破了 传统编码器-解码器结构 在编解码 时都依赖于内部一个灶掘斗固定长度向量的限制。

Attention 的实现是 通过保留 LSTM 编码器 对输入蓄力的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时 将 输出序列与之进行关联。

Seq2seq由两个RNN/LSTM构成,其中encoder RNN产生原始sentence的encoding,decoder RNN将在encoding基础上产生目标sentence。如下图将法语翻译成英语,注意这个过程时两个词袋embedding的,一个是法语的,一个是英语的。

使首厅用backpropagation进行参数最优化,所以这是一个end-to-end模型。

可以看到,在seq2seq模型中,我们强制将所有信息集中在单独一个vector中,如上图模芹滚的黄框所示,因为这是喂给decoder的唯一的信息,那么旦余这样的话,如果encoder的vector没有包含相关信息的话,decoder也就不会翻译正确,这成为information bottleneck,attention就是用来解决这个问题的。核心思想为使用decoder时,直接关联encoder和并关注原始sequence的某一部分。

其中attention output可以理解为是encoder的加权和,这个权重和原始sequence相关,如下图所示。

公式如下:

更加通俗的解释为:

设给定一组values,单独的向量query,attention就是基于query,计算values的加权和。在上面说的seq2seq中,decoder hidden state就称为query,encoder称为values。

参考来自:

https://www.youtube.com/watch?v=XXtpJxZBa2c&list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&index=9&t=0s

https://zhuanlan.zhihu.com/p/28054589

tensorflow中RNN的实现详述 : //zhuanlan.zhihu.com/p/28196873


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12363507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存