0. 从RNN说起

循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。

2. LSTM

2.1 什么是LSTM

长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

LSTM结构(图右)和普通RNN的主要输入输出区别如下所示。

在这里插入图片描述
在这里插入图片描述

2.2 深入LSTM结构


在这里插入图片描述

LSTM内部主要有三个阶段:

在这里插入图片描述

3. 总结

以上,就是LSTM的内部结构。通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样只能够“呆萌”地仅有一种记忆叠加方式。对很多需要“长期记忆”的任务来说,尤其好用。

但也因为引入了很多内容,导致参数变多,也使得训练难度加大了很多。因此很多时候我们往往会使用效果和LSTM相当但参数更少的GRU来构建大训练量的模型。
在这里插入图片描述
另外还可以参考https://zhuanlan.zhihu.com/p/40119926

面试题:

第一个必问的问题:LSTM解决了RNN中什么问题?为什么可以解决?
解决了RNN中梯度消失/梯度爆炸的问题。为什么可以解决的问题就是搬出公式。

LSTM常见面试题

1、LSTM、RNN、GRU区别?
在这里插入图片描述
2、为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数,而不是选择统一一种sigmoid或者tanh?

  • sigmoid用在了各种gate上,产生0~1之间的值,一般只有sigmoid最直接了;
    tanh用在了状态和输出上,是对数据的处理,这个用其他激活函数或许也可以。

3、为什么LSTM可以解决RNN梯度消失或者梯度爆炸的问题
正如上面提到,造成梯度消失的最大原因就是我们需要计算递归导数在这里插入图片描述
,我们如果可以解决这个问题,那么我们就可以学到长期依赖关系(long term dependencies)。
在这里插入图片描述
在这里插入图片描述

这看起来很神奇,但实际上如下两个原因

  • 为cell state的更新函数给出了一个更加“表现良好”的导数
  • 门控函数(gating function)允许网络决定梯度消失多少,并且可以在每个时间步长取不同的值。它们所取的值是从当前输入和隐藏状态学习到的

以上就是LSTM解决梯度消失的本质。

总结:也就是说上述公式是一个很复杂的形式,收到6个参数的控制。
在任意一个时刻t,它的值都是随机出现在区间[0,1]或者[1,正无穷]的;
但不至于像RNN对于所有时刻的求导值要么在区间[0,1],要么都在区间[1,正无穷],所以LSTM不会出现连乘导致梯度消失和爆炸的现象。

4、LSTM为什么能够缓解梯度消失另一种思路:

下面这是RNN的连乘部分:
在这里插入图片描述
而sigmoid的导数取值范围在[0,0.25]之间,若想让RNN中梯度更新的导数没有梯度消失/梯度爆炸,需要控制Wh,使得相乘保持在1左右。

而LSTM的连乘部分如下:
sigmoid取值范围在[0,1]之间,且可以通过控制xt来使得梯度保持在1左右。因此能够缓解梯度消失/梯度爆炸。
在这里插入图片描述

5、LSTM的输入输出内部维度

常问:这里很经问的就是hidden_size(unit_number)的问题,hidden_size(unit_number)是什么?
其实hidden_size(unit_number)就是zi,zf,zo,z的全连接神经网络的神经元个数,那么一旦确定了hidden_size(unit_number),整个LSTM的内部参数也就定下来。因为ct,ht也都是依赖于hidden_size(unit_number)的。

对应的输入输出应该好好理清一下思路。
在这里插入图片描述
在这里插入图片描述
此图在上图2的基础上更进一步。这张图才是真正的使用神经网络实现LSTM的网络物理架构图。需要注意的如下几点:
1、与图2对应,图2中每个带颜色的小框实际上是借助一层具有该激活函数神经单元来实现,两个图的颜色一一对应
2、每层神经元的个数为unit_num大小
3、每个Cell的输出向量及状态向量长度也是unit_num大小。
4、图2中浅蓝色的实心点表示上一输出和当前时刻的输入是通过向量拼接的方式构成一个新的向量,可见图3的浅蓝色虚线。

6、上述是从单个LSTM Cell角度来进行解析的,我们从代码角度,即整体角度去进行解析LSTM中各个数据的维度情况:
在这里插入图片描述
1、outputs(batch, sequence, hidden_size * num_directions(单向/双向))
2、h_n(batch, hidden_size, num_layers(层数)* num_directions)
3、c_n 和 h_n 一样
4、input 和 output 维度一样。
在这里插入图片描述

7、一般用LSTM做时间序列方面的预测,会出现什么问题?–预测滞后

做过时间序列的朋友可能常常会有这样的感受,用了某种算法做出来的测试集的平均绝对误差率或者r2系数都很好,但是把测试集的真实值及预测值画出来对比一下,就会发现t时刻的预测值往往是t-1时刻的真实值,也就是模型倾向于把上一时刻的真实值作为下一时刻的预测值,导致两条曲线存在滞后性,也就是真实值曲线滞后于预测值曲线,就像下图右边所显示的那样。之所以会这样,是因为序列存在自相关性,如一阶自相关指的是当前时刻的值与其自身前一时刻值之间的相关性。因此,如果一个序列存在一阶自相关,模型学到的就是一阶相关性。而消除自相关性的办法就是进行差分运算,也就是我们可以将当前时刻与前一时刻的差值作为我们的回归目标。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐