参考:https://www.jianshu.com/p/9dc9f41f0b29 以及《白话深度学习与TensorFlow》
与前馈神经网络、卷积神经网络等不同之处在于,RNN具有一定的记忆暂存功能,模拟了大脑的记忆性。具体来说,就是把之前的输入产生的影响量化后与当前输入一起传递到网络中训练。因此,RNN可以有效解决上下文相关场景下的问题,如自然语言处理等等。
RNN示意图及时间维度上的展开图如下:
其中,Xi为当前输入,hi为A模块对Xi处理得到的输出。对于一个输入序列X来说,某一个Xi的值可能会影响到之后的时间或空间上的输出hj,训练过程就是要学习影响的量化关系。传统的RNN训练过程的损失函数采用BPTT算法得到,但是如果有多个输入时,那么就需要求一系列的导数并连乘起来,显然这种损失函数既加大了运算复杂度,又会引发梯度消失或梯度爆炸问题。
因此,传统RNN理论上可以实现,但是训练效果很不理想。研究人员又提出了LSTM算法来进行RNN的训练。
LSTM算法即长短期记忆网络(long short-term memory),是对标准RNN的一种改进,该算法引入了忘记门(forget gate)机制,有效规避了传统RNN的梯度爆炸和梯度消失问题。
单层的LSTM拓扑结构如下图所示:
下面对LSTM单元进行分析:
(1)图例说明
(2)LSTM
LSTM单元就是这样连接的效果,一个一个首尾相接,同一层的会把前面单元的输出作为后面单元的输入;前一层的输出会作为后一层的输入。下面是对LSTM单元的各部分剖析。
首先,从左到右会有一个向量传输,该过程有两个交互过程,一个是左侧的乘号,另一个是右侧的加号,加号是普通的向量线性叠加,乘号则是表明Ct-1被一个乘法器乘以一个系数。
乘法器的系数来源于上图的结构,左侧的ht-1和下面输入的xt经过连接操作,然后通过线性单元和一个Sigmoid函数后生成一个0~1之间的数字作为系数输出。这个部分就是一个忘记门(forget gate),1 表示“完全保留”,0 表示“完全舍弃”。这一部分是决定丢弃什么信息。
下一步则是确定要保留什么新信息,如上图。该结构由两个小的神经网络层组成,一个是Sigmoid函数,称为“输入门”层,决定要更新什么信息,然后一个 tanh 层创建一个新的候选值向量会被加入到状态中,其中tanh函数可以把一个值映射到-1~1之间。
之后,确定当前单元状态Ct,也就是将Ct-1更新为Ct。如上图,把旧状态与 ft 相乘,丢弃掉我们确定需要丢弃的信息。接着加上部分新信息。
最后,确定输出什么值(ht)。如上图所示,首先,我们运行一个 Sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态Ct通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 Sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
总的来说,LSTM通过Sigmoid函数得到0~1之间的值来控制忘记程度,通过tanh函数来生成新的候选结果,将新的候选结果与忘记程度做乘法来实现部分信息的丢弃/保留。每个LSTM单元的状态都是由一部分上一单元的状态和一部分候选值(由当前单元输入和上一单元输出连接操作后进行tanh映射生成)线性叠加而来,而每个LSTM单元的输出则是该单元的部分状态。