LSTM和双向LSTM讲解及实践

LSTM和双向LSTM讲解及实践

目录网络

RNN的长期依赖问题
LSTM原理讲解
双向LSTM原理讲解
Keras实现LSTM和双向LSTM函数

1、RNN的长期依赖问题学习

在上篇文章中介绍的循环神经网络RNN在训练的过程当中会有长期依赖的问题,这是因为RNN模型在训练时会遇到梯度消失(大部分状况)或者梯度爆炸(不多,但对优化过程影响很大)的问题。对于梯度爆炸是很好解决的,可使用梯度修剪(Gradient Clipping),即当梯度向量大于某个阈值,缩放梯度向量。但对于梯度消失是很难解决的。所谓的梯度消失或梯度爆炸是指训练时计算和反向传播,梯度倾向于在每一时刻递减或递增,通过一段时间后,梯度就会收敛到零(消失)或发散到无穷大(爆炸)。简单来讲,长期依赖的问题就是在每个时间的间隔不断增大时,RNN会丧失到链接到远处信息的能力。优化

以下图,随着时间点t的不断递增,当t时刻和0时刻的时间间隔较大的时候,t时刻的记忆ht可能已经丧失了学习链接到远处0时刻的信息的能力了。.net

假设X0的输入为”我住在深圳”,后面插入了不少其余的句子,而后在Xt输入了“我在市政府上班”。因为X0与Xt相差很远,当RNN输入到Xt时,t时刻的记忆ht已经丧失了X0时保存的信息了。所以在Xt时刻神经网络没法理解到我是在哪个城市的市政府上班了。设计

 

 

2、LSTM原理讲解3d

在理论上,RNN绝对能够处理这样的长期依赖问题。人们能够仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN却不可以成功学习到这些知识。所以,LSTM就是为了解决长期依赖问题而生的,LSTM经过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM的默认行为,而非须要付出很大代价才能得到的能力!blog

全部RNN都具备一种重复神经网络模块的链式的形式。在标准的RNN 中,这个重复的模块只有一个很是简单的结构,例如一个tanh层。\图片

 

LSTM一样是这样的结构,可是重复的模块拥有一个不一样的结构。不一样于 单一神经网络层,这里是有四个,以一种很是特殊的方式进行交互。ip

先介绍上图中的符号意义:

 

 

 

在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其余节点的输入。粉色的圈表明 pointwise 的操做,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一块儿的线表示向量的链接,分开的线表示内容被复制,而后分发到不一样的位置。

接下来将对LSTM进行逐步理解。在每一个记忆单元(图中A)中包括细胞状态(Ct),遗忘门,输入门和输出门。这些门结构能让信息选择性经过,用来去除或者增长信息到细胞状态。

 

 

1.细胞状态(Ct)

t时刻的记忆信息,用来保存重要信息。就好像咱们的笔记本同样,保存了咱们之前学过的知识点。以下图的水平线从图上方贯穿运行,直接在整个链上运行,使得信息在上面流传保持不变会很容易。

 

2.遗忘门

控制遗忘上一层细胞状态的内容,根据上一序列的ht-1和本序列的Xt为输入,经过sigmoid激活函数,获得上一层细胞状态内容哪些须要去除,那些须要保留。值得注意的是,该输入是以向量的形式,咱们但愿遗忘门输出的值大多为0或1,即对向量中的每一个值是彻底忘记或者彻底记住,所以咱们使用的是sigmoid函数做为激活函数,由于该函数在许多取值范围内的值都接近于0或1(这里不能用阶跃函数做为激活函数,由于它在全部位置的梯度都为0,没法做为激活函数)。其余门使用sigmoid函数同理。所以,虽然在其余神经网络能够变换激活函数,但并不建议变换LSTM的激活函数。

以一个例子来讲明遗忘门的做用:在语言模型中,细胞状态可能保存着这样的重要信息:当前主语为单数或者复数等。如当前的主语为“小明”,当输入为“同窗们”,此时遗传门就要开始“干活”了,将“小明”遗忘,主语为单数形式遗忘。

3.输入门

处理当前序列位置的输入,肯定须要更新的信息,去更新细胞状态。此过程分为两部分,一部分是使用包含sigmoid层的输入门决定哪些新信息该被加入到细胞状态;肯定了哪些新信息要加入后,须要将新信息转换成可以加入到细胞状态的形式。因此另外一部分是使用tanh函数产生一个新的候选向量。(能够这么理解,LSTM的作法是对信息都转为能加入细胞状态的形式,而后再经过第一部分获得的结果肯定其中哪些新信息加入到细胞状态。)

有了遗忘门和输入门,如今咱们就能把细胞状态Ct−1更新为Ct了。以下图所示,其中ft×Ct−1表示但愿删除的信息,it×Ct表示新增的信息。

 

 

4.输出门

最后要基于细胞状态保存的内容来肯定输出什么内容。即选择性的输出细胞状态保存的内容。相似于输入门两部分实现更新同样,输出门也是须要使用sigmoid激活函数肯定哪一个部分的内容须要输出,而后再使用tanh激活函数对细胞状态的内容进行处理(由于经过上面计算获得的Ct每一个值不是在tanh的取值范围-1~1中,须要调整),将这两部分相乘就获得了咱们但愿输出的那部分。

 

 

举个例子,一样在语言模型中,细胞状态中此时包含不少重要信息,好比:主语为单数形式,时态为过去时态,主语的性别为男性等,此时输入为一个主语,可能须要输出与动词相关的信息,这个时候只须要输出是单数形式和时态为过程,而不须要输出主语性别就可肯定动词词性的变化。

 

3、双向LSTM(Bi-directional LSTM)

                 

如上篇文章BRNN所述同理,有些时候预测可能须要由前面若干输入和后面若干输入共同决定,这样会更加准确。所以提出了双向循环神经网络,网络结构以下图。能够看到Forward层和Backward层共同链接着输出层,其中包含了6个共享权值w1-w6。

 

 

在Forward层从1时刻到t时刻正向计算一遍,获得并保存每一个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,获得并保存每一个时刻向后隐含层的输出。最后在每一个时刻结合Forward层和Backward层的相应时刻输出的结果获得最终的输出,用数学表达式以下:

 

 

有些问题,其实稍微看看就能够明白。

 

4、Keras实现LSTM和双向LSTM

Keras对循环神经网络的支持和封装在上一篇文章已经讲解了,在这里仅介绍两个模型的搭建,若有疑问请阅读keras系列的上一篇文章。

 

 

 

 

 

 

原文连接:https://blog.csdn.net/fendouaini/article/details/8019899

 

单向LSTM与双向LSTM对比,一个简单的DEMO:实现手写数字图片的识别

https://blog.csdn.net/kudou1994/article/details/80851227

相关文章
相关标签/搜索