背景
原生的循环神经网络即RNN(Recurrent Neural Network)网络在训练过程中容易出现梯度消失和梯度爆炸的问题,导致的结果是模型很难学习到长期的信息,对此,Sepp Hochreiter和Jurgen Schmidhuber在1997年提出了长短期记忆即LSTM(Long Short Term Memory)模型,该模型的特殊之处在于循环单元的精密设计,相比于RNN网络结构,LSTM网络结构中的一个重复单元包含着三个Gate(input、forget、output)和一个Cell(Memory Cell)组成。
结构图
具体的LSTM网络结构中重复单元结构如下图所示:
LSTM网络结构中的重复单元
从上图可以看出,该单元包括四个输入,一个输出,而具体的计算过程如下图所示:
LSTM网络结构中重复单元计算图
计算公式
LSTM网络结构的计算过程和BP神经网络下面给出每个Gate和Cell的计算公式,其中,三个Gate对应的计算公式如下:
三个Gate计算公式
输入变换公式如下:
输入变换公式
Memory Cell更新公式如下:
Memory Cell更新公式
实现
上面就是LSTM重复单元前向计算的过程,那么现在根据公式一步一步实现前向计算过程,具体过程如下(python):
首先,我们定义一个LSTM类,并随机初始化连接上述Gate和Memory Cell之间的权值和偏置:
LSTM类
其中,initialize函数的实现利用了numpy库中的random函数:
initialize函数
initSequence函数的实现过程:
initSequence函数
下面给出LSTM类中前向计算过程函数forward的实现过程,按照公式的每一步一一实现:
forward函数
上面的公式只是描述了前向计算过程,并没有给出反向计算梯度的过程,下面直接给出反向计算函数backward的实现过程:
backward函数
上面几个函数中的sigmoid函数、sigmoid_grad函数、tanh函数、tanh_grad函数、ones函数和zeros函数的实现过程:
总结
上面从模型提出的背景到模型结构,再到前向计算公式的展开,最后给出实现过程,希望能从原理理解到动手实现这一步骤给出较为清晰的过程,记录下来帮助自己和他人能够深刻的掌握这一经典神经网络,在后续记录中,会结合具体的应用场景来理解LSTM的价值。