在上篇文章RNN(循环/递归神经网络)详解中详细介绍了RNN以及RNN的弊端,再次回顾。
1、普通RNN和LSTM
在实际应用中普通的 RNN 是非常难以训练的:
假设有一段关键文字“xxxx[key]xxx…xxxx”要求 RNN 分析出与 key 相关的 结果,即文字中的 key 是 RNN 进行分析所需要的关键数据。但此时 key 出现在 句子开头(t1),此信息源的记忆要经过非常一段长的时间才可以达到最终状态点, 如图
前向传播得到误差,反向传递误差时,每次都会乘一个系数 w,当这个 w 小 于 1 时,每次反向传递都会让 RNN 的误差缩小,经过若干次误差反向传递, 到 key 状态时,误差很近似等于 0 的情况,这就叫梯度消失或者梯度弥散,反 之,如果 w 大于 1,每次反向传递都会让 RNN 的误差变大,经过若干次误差的 反向传递,到 key 的状态时,误差将会是一个非常大的数(无穷大),这种情况 叫做梯度爆炸。这样导致很难确定一个初始值让 RNN 收敛。
假设X0的输入为”我住在深圳”,后面插入了很多其他的句子,然后在Xt输入了“我在市*上班”。由于X0与Xt相差很远,当RNN输入到Xt时,t时刻的记忆ht已经丧失了X0时保存的信息了。因此在Xt时刻神经网络无法理解到我是在哪一个城市的市*上班了。
为了解决这个问题 ,提出了 Long short-term memory (简称 LSTM,下 同),比起普通的 RNN,LSTM 引入了三个门的概念:遗忘控制门,输入控制门,输出控制门。遗忘控制门用来确定上一个隐藏层状态的信息哪些是重要的,输入控制们用来确定当前状态的哪些信息是重要的,输出控制门用来确定 下一个隐藏层状态。
LSTM 的 cell 结构图如图:
2、LSTM 原理讲解
在理论上,RNN绝对可以处理这样的长期依赖问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN却不能够成功学习到这些知识。因此,LSTM就是为了解决长期依赖问题而生的,LSTM通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM的默认行为,而非需要付出很大代价才能获得的能力!
LSTM的核心思想就是cell的状态,如图所示,最上方平行的一条线可称为“主线”,贯穿整个链,只进行少量的信息交互,信息流保持不变会很容易。
所有RNN都具有一种重复神经网络模块的链式的形式。在标准的RNN 中,这个重复的模块只有一个非常简单的结构,例如一个tanh层。
LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
先介绍上图中的符号意义:
在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
接下来将对LSTM进行逐步理解。在每个记忆单元(图中A)中包括细胞状态(Ct),遗忘门,输入门和输出门。这些门结构能让信息选择性通过,用来去除或者增加信息到细胞状态。
3、细胞状态及LSTM的三个控制门
3.1 细胞状态
t时刻的记忆信息,用来保存重要信息。就好像我们的笔记本一样,保存了我们以前学过的知识点。如下图的水平线从图上方贯穿运行,直接在整个链上运行,使得信息在上面流传保持不变会很容易。
3.2遗忘控制门
遗忘控制门是LSTM工作的第一步,它用来决定我们从上一个细胞状态中丢弃哪些内容。遗忘控制门通过读取和,再通过S函数层,得出一个0-1之间的数值(这里不能用阶跃函数作为**函数,因为它在所有位置的梯度都为0,无法作为**函数),得出,对应于每个的数字(图中表示为上方主线的输入).其中,1表示“完全保留”,0表示“完全舍弃”,即对向量中的每个值是完全忘记或者完全记住。
在语言模型中,细胞的状态用来预测当前主语的性别,因此,可能选出正确的代词。这时候我们将希望忘记旧的主语.以一个例子来说明遗忘门的作用:在语言模型中,细胞状态可能保存着这样的重要信息:当前主语为单数或者复数等。如当前的主语为“小明”,当输入为“同学们”,此时遗传门就要开始“干活”了,将“小明”遗忘,主语为单数形式遗忘。
3.3 输入控制门
输入控制门用来更新重要信息,即就是用来确定什么样的新信息需要保留在cell的状态中。
输入控制门分两部分
1、和先经过S函数层得到来确定什么样的值是重要的,在通过一个tanh层得到
比如,在语言模型中,我们希望增加新的主语的性别到细胞状态中,来代替需要忘记的主语。
2、更新cell状态 Ct−1 更新为Ct,更新过程如下
就是忘记旧的值,用来添加新的值。
3.4 输出控制门
输出控制们用来确定我们需要输出什么值,输出值基于细胞状态。
我们先将和的组合经过S函数层,再与经过tanh层的结果相乘,确定输出部分:
举个例子,同样在语言模型中,细胞状态中此时包含很多重要信息,比如:主语为单数形式,时态为过去时态,主语的性别为男性等,此时输入为一个主语,可能需要输出与动词相关的信息,这个时候只需要输出是单数形式和时态为过程,而不需要输出主语性别就可确定动词词性的变化。
4、双向LSTM(Bi-directional LSTM)
如上篇文章BRNN所述同理,有些时候预测可能需要由前面若干输入和后面若干输入共同决定,这样会更加准确。因此提出了双向循环神经网络,网络结构如下图。可以看到Forward层和Backward层共同连接着输出层,其中包含了6个共享权值w1-w6。
在Forward层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。最后在每个时刻结合Forward层和Backward层的相应时刻输出的结果得到最终的输出,用数学表达式如下:
5、Keras实现LSTM和双向LSTM
原文地址:
1、https://colah.github.io/posts/2015-08-Understanding-LSTMs/
2、https://blog.****.net/fendouaini/article/details/80198994