一、从 RNN 到 LSTM
RNN 的结构我们已经非常熟悉了,如下图所示:
RNN 是在时间上的一个循环,每次循环都会用到上一次计算的结果,虽然 RNN 每个时刻 t 都会有输出,但是最后时刻的输出实际上已经包含了之前所有时刻的信息,所以一般我们只保留最后一个时刻的输出就够了。
RNN 的优缺点:
- 优点:处理a sequence或者a timeseries of data points效果比普通的DNN要好。中间状态理论上维护了从开头到现在的所有信息;
- 缺点:不能处理 long sequence/timeseries 问题。原因是梯度消失,网络几乎不可训练。所以也只是理论上可以记忆任意长的序列。
LSTM 就是用来缓解(实际上也没有解决) RNN 中梯度消失问题的,从而可以处理 long-term sequences。
至于为什么能缓解梯度消失问题,我们先了解 LSTM 的结构,就可以发现原因了。
二、LSTM 结构
LSTM 结构如下:
LSTM 主要包括三个门公式
2.1 遗忘门(forget gate)
遗忘门决定上一时刻细胞状态中的多少信息可以传递到当前时刻中。
2.2 输入门(input gate)
用来控制当前输入新生成的信息中有多少信息可以加入到细胞状态中。
2.3 更新细胞状态
细胞状态由两部分构成:
- 来自一时刻旧的细胞状态信息;
- 当前输入新生成的信息。
2.4 输出门(output gate)
最后,基于更新的细胞状态,输出隐藏状态。
2.5 记忆细胞(memory cell)
记忆细胞处于整个单元的水平线上,起到了信息传送带的作用,只几个含有简单的线性操作,能够保证数据流动时保持不变。
2.6 LSTM 如何缓解梯度消失?
我们注意到, 首先三个门的激活函数是 sigmoid, 这也就意味着这三个门的输出要么接近于0 , 要么接近于1。这就使得 δ c t δ c t − 1 = f t \frac{\delta c_t}{\delta c_{t-1}} = f_t δct−1δct=ft, δ h t δ h t − 1 = o t \frac{\delta h_t}{\delta h_{t-1}} = o_t δht−1δht=ot 是非0即1的,当门为1时, 梯度能够很好的在LSTM中传递,很大程度上减轻了梯度消失发生的概率, 当门为0时,说明上一时刻的信息对当前时刻没有影响, 我们也就没有必要传递梯度回去来更新参数了。所以, 这就是为什么通过门机制就能够解决梯度的原因: 使得单元间的传递 δ S j δ S j − 1 \frac{\delta S_j}{\delta S_{j-1}} δSj−1δSj 为 0 或 1。
三、GRU(Gate Recurrent Unit,门控循环单元)
LSTM 的计算比较慢,所有有了GRU,你可以认为他是经过特殊优化提速的LSTM,但是他的表达能力也是受到限制的。
GRU 的结构如下:
这里和lstm不同的是:
- 将遗忘门和输入门合成了一个单一的重置门(reset gate),也就是说多大程度上擦除以前的状态 state,另外细胞更新操作变为更新门(update gete),它的作用是多大程度上要用 candidate 来更新当前的 hidden layer;
- 同样还混合了细胞状态和隐藏状态;
- 比标准LSTM简单。
如果r[t] = 1,z[t] = 1,那么gru和普通rnn的cell就是一样的。
四、参考链接
参考链接1:LSTM如何解决梯度消失或爆炸的?
参考链接2:LSTM原理与实践,原来如此简单
参考链接3:LSTM结构理解与python实现
参考链接4:LSTM原理及实践(一):理论
参考链接5:(五)通俗易懂理解——BiLSTM
参考链接6:lstm和gru结构的再理解