LSTM与RNN
提起LSTM(长短期记忆神经网络),不得不先说一下RNN,RNN作为循环神经网络,具有记忆功能,在序列建模上具有重要的贡献。根据TensorFlow官方LSTM教程(colah’s Blog):Understanding LSTM Networks (英文)做一些总结,首先看下面几张图:
图1. 带循环的神经网络
图2. 循环神经网络展开
图3. 短依赖
图4. 长依赖
从图1和2中,我们可以看到RNN在时间序列上,具有记忆功能,可以将前面的信息沿着时间序列传递,事实也的确如此,但是通过验证发现,RNN在解决短依赖图3时,效果很好,但在长依赖图4方面,没有任何作用。
LSTM就是为了解决长依赖问题的特殊循环神经网络,其与RNN的对比图如下:
图5. 标准RNN
图6. LSTM
根据上图可以看到标准的RNN内部,只有一个tanh层。而LSTM用四个神经层,并以巧妙的方式处理信息。
LSTM核心思想
对于LSTM,大家肯定能想到门,LSTM是通过遗忘门,输入门,输出门来实现信息的控制。下面对着三重门进行介绍:
LSTM的关键在于细胞的状态整个(绿色的图表示的是一个cell),和穿过细胞的那条水平线。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
若只有上面的那条水平线是没办法实现添加或者删除信息的。而是通过一种叫做 门(gates) 的结构来实现的。
门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。
sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。
逐步理解门
遗忘门
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取和
,输出一个在 0到 1之间的数值给每个在细胞状态
中的数字。1 表示“完全保留”,0 表示“完全舍弃”。
其中表示的是上一个cell的输出,
表示的是当前细胞的输入。σ表示sigmod函数。
输入门
下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容。
现在是更新旧细胞状态的时间了,我们把旧状态与相乘,丢弃掉我们确定需要丢弃的信息。接着加上
*
,这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
输出门
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
至此,我们介绍完了基本的LSTM,在此基础上,出现很多LSTM的变体,应用于不同的领域。
在语音识别中,无论是声学模型还是语言模型,只要是基于序列的,都可以使用LSTM。
参考:
TensorFlow官方LSTM教程(colah大神Blog):Understanding LSTM Networks (英文)
theano官网的LSTM教程+代码:LSTM Networks for Sentiment Analysis
实现代码
https://github.com/dophist/kaldi-lstm (C++ kaldi-lstm)
https://github.com/nicodjimenez/lstm(Python)