因为循环神经网络很难训练的原因,这导致了它在实际应用中,很难处理长距离的依赖。我们将介绍一种改进之后的循环神经网络:长短时记忆网络(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
|