长短时记忆网络LSTM
因为循环神经网络很难训练的原因,这导致了它在实际应用中,很难处理长距离的依赖。我们将介绍一种改进之后的循环神经网络:长短时记忆网络(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训练算法全部公式。
GRU:
事实上LSTM存在很多变体,在众多的LSTM变体中,GRU (Gated Recurrent Unit)也许是最成功的一种。它对LSTM做了很多简化,同时却保持着和LSTM相同的效果。因此,GRU最近变得越来越流行。GRU对LSTM做了两个大改动:
- 将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)
和重置门(Reset Gate)
。
- 将单元状态与输出合并为一个状态:
。
GRU示意图:
由示意图可知,GRU前向计算公式为: