参考文章: 深度学习之RNN(循环神经网络) 深度学习入门:一句话告诉你什么是神经网络(CNN,RNN,DNN 循环神经网络(RNN)为什么能够记忆历史信息 零基础入门深度学习 | 第六章:长短时记忆网络(LSTM)
全连接的普通神经网路还存在着另一个问题——无法对时间序列上的变化进行建模。然而,样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。对了适应这种需求,就出现了另一种神经网络结构——循环神经网络RNN。
RNN的结构如上图所示,RNN与其结构包含了几个方面,分别为:
输入带有激励状态保存的隐含层输出层与普通NN结构中不相同的点在于隐藏层中包含了一层可以记录之前激励状态的一层。 保证了RNN可以记录下之前输入所得到的激励值。
上图为将RNN进行展开后的情况,可以看出,在每次时间变化后都会产生不同的激励值从而产生不同的输出。 RNN的正向传播的公式为: o t = U x t + W s t − 1 o_t=Ux_t+Ws_{t-1} ot=Uxt+Wst−1 其中 o t o_t ot为t时刻的输出,U表示输入的权重,W表示不同时刻的转换参数。 根据下面的推导可以看出RNN在t时刻时实际是有包含前面所有时刻进行计算的。
前面我们介绍了RNN的前向传播的方式, 那么RNN的权重参数W,U,V都是怎么更新的呢? 在前向传播中,我们使用了所有时间段的参数,同样的针对所有时间段的参数也要有同样的更新。这里的更新也是采用了链式求导的方式进行求导。 在这里我们以 t = 3时刻为例, 根据链式求导法则可以得到t = 3时刻的偏导数为:
RNN存在的以下的缺陷:
由于RNN在t时刻的计算中,用到了前面t-1个时刻的数据,所以当反向传播的时候导数越来越小,随着层数的增多,求导结果越来越小,导致当存在针对梯度消失的问题,较长的记忆无法产生作用。长短时记忆网络(LSTM)的思路比较简单。原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了。
原始RNN到LSTM就是增加一个长期状态C
上图仅仅是一个示意图,我们可以看出
在t时刻,LSTM的输入有三个:
当前时刻网络的输入值Xt上一时刻LSTM的输出值ht-1以及上一时刻的单元状态Ct-1;LSTM的输出有两个:
当前时刻LSTM输出值ht- 1当前时刻的单元状态Ct。注意X,h,C都是向量。LSTM的关键,就是怎样控制长期状态c。 在这里,LSTM的思路是使用三个控制开关。
第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c; 第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。三个开关的作用如下图所示:前面描述的开关是怎样在算法中实现的呢?这就用到了门(gate)的概念。门实际上就是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。假设W是门的权重向量,b是偏置项,那么门可以表示为: g ( x ) = σ ( W x + b ) g(x)=\sigma(Wx+b) g(x)=σ(Wx+b)
σ \sigma σ就是sigmod函数了,当门输出为0时,任何向量与之相乘都会得到0向量,这就相当于啥都不能通过;输出为1时,任何向量与之相乘都不会有任何改变,这就相当于啥都可以通过。
LSTM用两个门来控制单元状态c的内容,一个是遗忘门(forget gate),它决定了上一时刻的单元状态Ct-1有多少保留到当前时刻Ct;另一个是输入门(input gate),它决定了当前时刻网络的输入Xt有多少保存到单元状态Ct。 遗忘门的公式为: 计算示意图为: 输入门的计算公式:
计算当前输入状态
现在,我们计算当前时刻的单元状态ct。它是由上一次的单元状态Ct-1按元素乘以遗忘门ft,再用当前输入的单元状态乘以输入门it,再将两个积加和产生的: LSTM最终的输出,是由输出门和单元状态共同确定的: