因为循环神经网络很难训练的原因,这导致了它在实际应用中,很难处理长距离的依赖。我们将介绍一种改进之后的循环神经网络:长短时记忆网络(Long Short Term Memory Network, LSTM),它成功的解决了原始循环神经网络的缺陷,成为当前最流行的RNN,在语音识别、图片描述、自然语言处理等许多领域中成功应用。但不幸的一面是,LSTM的结构很复杂,因此,我们再介绍一种LSTM的变体:GRU (Gated Recurrent Unit)。 它的结构比LSTM简单,而效果却和LSTM一样好,因此,它正在逐渐流行起来。
原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了么?如下图所示:
新增加的状态c,称为单元状态(cell state)。我们把上图按照时间维度展开:
上图仅仅是一个示意图,我们可以看出,在t时刻,LSTM的输入有三个:当前时刻网络的输入值、上一时刻LSTM的输出值、以及上一时刻的单元状态;LSTM的输出有两个:当前时刻LSTM输出值、和当前时刻的单元状态。
LSTM的关键,就是怎样控制长期状态。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态(也就是说上一时刻状态是否汇入);第二个开关,负责控制把即时状态输入到长期状态;第三个开关,负责控制是否把长期状态作为当前的LSTM的输出。三个开关的作用如下图所示:
接下来,我们要描述一下,输出和单元状态的具体计算方法。
LSTM前向计算:
门的概念:假设W是该门的权重向量,b是偏置项,则:,是sigmoid函数,那么的值域为0到1之间的实数向量;门的使用,就是用门的输出向量按元素乘以我们需要控制的那个向量。因为门的输出是0到1之间的实数向量,那么,当门输出为0时,任何向量与之相乘都会得到0向量,这就相当于啥都不能通过;输出为1时,任何向量与之相乘都不会有任何改变,这就相当于啥都可以通过;这就是门和开关的对应关系。
遗忘门:它决定了上一时刻的单元状态有多少保留到当前时刻;
输入门:它决定了针对当前输入的单元状态有多少保存到当前时刻的单元状态;(此处与原博客理解不一样,请大家指点)
输出门:控制单元状态有多少输出到LSTM的当前输出值。
这几个门与上述的开关相配合来计算当前:
如上图所示:这三个门:,,
输入都为表示把两个向量连接成一个更长的向量;我们以为例,权重矩阵都是由两个矩阵拼接而成的,如上公式一个是,对应着输入项,一个是,对应着输入项;
针对于当前输入的单元状态;
则所求的:,。
LSTM训练算法:
LSTM的训练算法仍然是反向传播算法,对于这个算法,我们已经非常熟悉了。主要有下面三个步骤:
1.前向计算每个神经元的输出值,对于LSTM来说,即、、、、五个向量的值。计算方法已经在上一节中描述过了。
2.反向计算每个神经元的误差项值。与循环神经网络一样,LSTM误差项的反向传播也是包括两个方向:一个是沿时间的反向传播,即从当前t时刻开始,计算每个时刻的误差项;一个是将误差项向上一层传播。
3.根据相应的误差项,计算每个权重的梯度。
误差项沿时间的反向传递:
在t时刻,LSTM的输出值,定义t时刻的误差项为:;这里假设误差项是损失函数对输出值的导数,而不是对加权输入的导数。、、、对于这四个加权输入及他们的误差项:
,
推导过程参见博客,最后得到公式:
,其中:
那么我们就得到误差项向前传递到任意时刻k的公式:
将误差传递到上一层:
我们假设当前为第l层,定义l-1层的误差项是误差函数对l-1层加权输入的导数,即:
,因为在本层下,输入为:,表示l-1层的激活函数。
推导过程不再多说,得到:。
权重梯度计算:
对于、、、的权重梯度,我们知道它的梯度是各个时刻梯度之和(循环神经网络已经介绍)。
, ,
以上就是LSTM训练算法全部公式。
【转载】原文地址:https://blog.csdn.net/weixin_28750267/article/details/81051825
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |