最近大创和项目需要把之前学过的知识点总结一下
RNN
循环神经网络和LSTM参考July哥的这篇博客,写的非常通俗易懂
RNN和LSTM
首先看单层神经网络
f为激活函数
但是我们做文本一般用到的是序列数据
x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。
我们将RNN展开后的结构
得到输出值的方法就是直接通过h进行计算:
这就是最经典的RNN结构,是x1, x2, …xn,输出为y1, y2, …yn,也就是说,输入和输出序列必须要是等长的。
循环神经网络其实可以看成是链式的(注:输出之前由y表示,从此处起,改为隐层输出h表示):
RNN的局限(引入LSTM的优势):
长期依赖(Long-TermDependencies)问题:在这个间隔不断增大时,RNN会丧失学习到连接如此远的信息的能力,从两个方面考虑:
- 梯度消失
获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。 - 梯度爆炸
计算的难度越来越复杂导致。
LSTM
LSTM通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是LSTM的默认行为,而非需要付出很大代价才能获得的能力!
所有RNN都具有一种重复神经网络模块的链式的形式。在标准的RNN中,这个重复的模块只有一个非常简单的结构,例如一个tanh层(激活函数 Tanh 作用在于帮助调节流经网络的值,使得数值始终限制在 -1 和 1 之间)。
LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。具体来说,RNN是重复单一的神经网络层,LSTM中的重复模块则包含四个交互的层,三个Sigmoid 和一个tanh层,并以一种非常特殊的方式进行交互。
且RNN权值共享而LSTM权值不共享
上图中,σ表示的Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息:
- 因为任何数乘以 0 都得 0,这部分信息就会剔除掉;
- 同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。
LSTM由这次的输入、上一次的输出、当前状态决定下一次的状态和输出
状态C经过两次变化,第一次为遗忘第二次为更新
LSTM的三个门
-
遗忘门
这部分通过上一次的输出和输入决定哪些维度需要被遗忘(sigmoid输出为0的维度被遗忘,为1被保留),然后与上一次的状态相乘就完成了遗忘的操作 -
输入门