LSTM算法详解
一、原因
我们也介绍了循环神经网络很难训练的原因,这导致了它在实际应用中,很难处理长距离的依赖。在本文中,我们将介绍一种改进之后的循环神经网络:长短时记忆网络(Long Short Term Memory Network, LSTM),它成功的解决了原始循环神经网络的缺陷,成为当前最流行的RNN,在语音识别、图片描述、自然语言处理等许多领域中成功应用。但不幸的一面是,LSTM的结构很复杂,因此,我们需要花上一些力气,才能把LSTM以及它的训练算法弄明白。在搞清楚LSTM之后,我们再介绍一种LSTM的变体:GRU (Gated Recurrent Unit)。 它的结构比LSTM简单,而效果却和LSTM一样好,因此,它正在逐渐流行起来。
二、定义
1.LSTM的网络结构
RNN:有两个输入,两个输出。
LSTM:有三个输入,三个输出。
GRU:有两个输入,两个输出。
- 相比RNN传递一个网络状态h^t ,LSTM传递两个状态,一个$c^t$(cell state)和一个$h^t$(hidden state)
2.LSTM的三个门
- 输入门
- 遗忘门
- 输出门
(1).遗忘门
作用对象:细胞状态
作用:将细胞状态中的信息选择性的遗忘
例如公式:(5)$c^t=z^f⊙c^{t-1}+z^i⊙z$ 中 $z^f$是对决定从cell状态中丢弃什么信息,$z^f$的范围[0,1],
让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的类别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
例如,他今天有事,所以我。。。当处理到‘’我‘’的时候选择性的忘记前面的’他’,或者说减小这个词对后面词的作用。
GRU对LSTM做了两个大改动。
(2).输入门
作用对象:细胞状态
作用:将新的信息选择性的记录到细胞状态中
例如公式:(5)$c^t=z^f⊙c^{t-1}+z^i⊙z$ 中 $z^i$是对决定从当前z状态中选择多少信息进入当前$c^t$,$z^i$的范围[0,1],
在我们语言模型的例子中,我们希望增加新的主语的类别到细胞状态中,来替代旧的需要忘记的主语。
例如:他今天有事,所以我。。。。当处理到‘’我‘’这个词的时候,就会把主语我更新到细胞中去。
(3).输出门
在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。
例如:上面的例子,当处理到‘’我‘’这个词的时候,可以预测下一个词,是动词的可能性较大,而且是第一人称。
会把前面的信息保存到隐层中去。
三、相关公式
1.模块内图
2. lstm的七个公式
(1) $z^f=sigmoid(w_f*[h^{t-1},x^t]+b_f)$ 遗忘门
(2) $z^i=sigmoid(w_i*[h^{t-1},x^t]+b_i)$ 输入门
(3) $z^o=sigmoid(w_o*[h^{t-1},x^t]+b_o)$ 输出门
(4) $z=tanh(w*[h^{t-1},x^t]+b)$
(5)$c^t=z^f⊙c^{t-1}+z^i⊙z$ 输出1
(6)$h^t=z^o⊙tanh(c^t)$ 输出2
(7)$y^t=softmax(w'h^t)$ 输出3
四、激活函数
1.sigmoid 用在了各种gate上,产生0~1之间的值,这个一般只有sigmoid最直接了。
2.tanh 用在了状态和输出上,是对数据的处理,这个用其他激活函数或许也可以。
五、LSTM如何解决梯度消失梯度爆炸
参考:
https://zhuanlan.zhihu.com/p/136223550
LSTM变体GRU
将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)和重置门(Reset Gate)。
将单元状态与输出合并为一个状态:
Gated Recurrent Unit (GRU)就是lstm的一个变态,这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。