解决梯度消失梯度爆炸强力推荐的一个算法-----LSTM(长短时记忆神经网络)

LSTM(长短时记忆)

应为在简单的RNN(vanilla RNN结构)中存在时序过长时会导致梯度消散,梯度爆炸的问题,而长短时记忆LSTM就是解决vanilla RNN中的不足,可以有效的减少梯度消散问题。

LSTM 中引⼊了3个⻔,即遗忘⻔(input gate)、输入⻔(forget gate)和输出⻔(output gate),以及与隐藏状态形状相同的记忆细胞(某些⽂献把记忆细胞当成⼀种特殊的隐藏状态),从而记录额外的信息。

在这里插入图片描述
LSTM关键:“细胞状态”

细胞状态 类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流 传保持不变很容易。

在这里插入图片描述

第一个“门”——“遗忘门”

第一个“门”==>“遗忘门”:决定从“细胞状态”中丢弃什么信息;比如在语言模型中,细胞状态可能 包含了性别信息(“他”或者“她”),当我们看到新的代名词的时候,可以考虑忘记旧的数据

因为是通过sigmoid**,接近0的值就遗忘了,接近1的值就记住并继续传递。

状态 h(t-1)和本次的输入(问题) x(t) 结合(concat)起来的,concat, 就是把二者直接拼起来,比如 x是 28位的向量,h(t-1)是128位的,那么拼起来就是156位的向量。

在这里插入图片描述

第二个“门”——“输入门”:

第二个“门”==>“输入门”:决定放什么新信息到“细胞状态”中;

在这里插入图片描述

第三个“门”——“输出门”:

经过第一个和第二个“门”后,可以确定传递信息的删除和增加,即可以进行 “细胞状态”的更新

首先运行一个sigmoid层来确定细胞状态的那个部分将输出
使用tanh处理细胞状态得到一个-1到1之间的值,再将它和sigmoid门的输出相乘,输出程序确定输出
在这里插入图片描述
LSTM动态图展示

在这里插入图片描述

学习拓展

LSTM可以使用别的**函数吗?
关于**函数的选取,在LSTM中,遗忘门、输入门和输出门使用Sigmoid函数作为**函数;在生成候选记忆时,使用双曲正切函数Tanh作为**函数。

值得注意的是,这两个**函数都是饱和的,也就是说在输入达到一定值的情况下,输出就不会发生明显变化了。如果是用非饱和的**函数,例如ReLU,那么将难以实现门控的效果。

Sigmoid函数的输出在0~1之间,符合门控的物理定义。且当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。

在生成候选记忆时,使用Tanh函数,是因为其输出在−1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。

**函数的选择也不是一成不变的,但要选择合理的**函数。

LSTM-总结

LSTM的隐层神经元不仅包含隐状态h_tht​,还专门开辟了一个 cell来保存过去的“记忆”c_tct​,LSTM希望用c_tct​来传递很久以前的信息,以达到长 距离依赖的目的。所以LSTM隐层神经元的输入是上一时刻的隐状态h_{t−1}ht−1​和记忆c_{t−1}ct−1​,输出是当前时刻的隐状态h_tht​和希望传递给下一个时刻的记忆c_tct​。