关于递归神经网络的理论介绍推荐阅读这篇非常经典的文章 → Understanding LSTM Networks
本文为总结笔记
一、RNN vs LSTM
RNN 逻辑结构图
LSTM 逻辑结构图
LSTM 是 RNN 的变体,它们的原理几乎一样,唯一的不同是 output 即 hidden state 的计算逻辑不同
RNN 如何计算某个时刻 t 的 output ?
h_t = tanh(W*[h_{t-1}, x_t]+b)
LSTM 如何计算某个时刻 t 的 output ?
遗忘门(Forget Gate): 控制遗忘哪些记忆(Cell state)
f_t = sigmoid(W_f*[h_{t-1}, x_t] + b_f)
新信息:候选记忆信息
{C}^{*} = tanh(W_c*[h_{t-1}, x_t]+b_c)
输入门(Input Gate):控制加入哪些新信息到记忆中
i_t = sigmoid(W_i*[h_{t-1}, x_t] + b_i)
新记忆:遗忘部分旧记忆,加入部分新记忆信息,得到最新的cell state
C_t = f_t*C_{t-1} + i_t*{C}^{*}
输出门(Output Gate):控制当前最新记忆的对应输出值
o_t = sigmoid(W_o*[h_{t-1}, x_t] + b_o)
输出值:最终的 hidden state
h_t = o_t*tanh(C_t)
当 Forget Gate=0, Input Gate=1, Output Gate=1 时 LSTM 与 RNN 等价
LSTM 为什么优于 RNN ?
RNN 通过叠乘的方式进行状态更新,当 sequence 比较长时容易出现梯度消失/爆炸的情况,主要原因是反向传播的连乘效应,而 LSTM 是通过门控制的叠加方式来更新状态(C_t的计算公式),所以可以有效防止梯度问题,当然对于超长的 sequence,LSTM 依然会有梯度消失或者爆炸的可能。
二、RNN/LSTM 中的 num_units 是啥意思 ?
num_units 相当于神经网络的隐层神经元的个数,例如上图表示一个 LSTM Cell,包含四个神经网络层,即黄色方框部分,num_units 就是每个神经网络结构的隐层神经元个数(全连接单元数),它实际上也是 LSTM 输出向量的维度数,所以 h_t 为 num_units 维向量。
三、如何计算 Keras 的 LSTM layer 的参数个数?
假设 LSTM(num_units = 150),输入维度 input_dims = 100,那么共需要训练的参数个数为:
(num\_units + input\_dims + 1) * num\_units * 4 = 150600
说明:
1. num_units + input_dims 是因为上层输出需要首先与输入进行一次concat,即 [h_t-1, x_t],
2. + 1 是因为 bias
3. * 4 是因为共有4个神经网络层(黄色方框)
4. 为什么不需要乘以 time_steps 即 number of cell ?
因为递归神经网络的每个 cell 实际上只是在不同时态下的状态,所以不同 cell 共用同一套权重,文章开头的结构图只是为了理解方便而将递归过程展开,实际上任何时候都只存在一个 cell !!
四、为什么 LSTM 要用 sigmoid 作为门控激活函数 ?
因为sigmoid的输出在0~1之间,可以很好地控制信息的删除和保留。
五、为什么 LSTM 的输入和输出值不用 sigmoid 而用 tanh 作为激活函数 ?
LSTM 内部维护了一个状态向量,其值应该可以增加或者减少,而 sigmoid 的输出为非负数,所以状态信息只能增加,显然不合适,相反,tanh 的输出范围包含了正负数,因此可以满足状态的增减。
六、什么是 sequence?
对于时序预测问题,一个 sequence 就是一个 sample,例如:
[1,2,3,4] => 5
[2,3,4,5] => 6
表示了两个 sequence
七、Keras 中的 return_sequence
构建多层 LSTM 结构时,return_sequence 通常需要设为 True
八、Keras 中 LSTM 的 stateful 概念
对于 stateful LSTM,某个 batch 的第 i 个 sample/sequence 的状态会作为它下一个 batch 的第 i 个 sample/sequence 的初始化状态。因此 stateful 下 fit 不能 shuffle!
九、Keras 中 LSTM 的 state 何时 reset?
LSTM 的 state 是针对每一个 sequence 而言的,所以对于一个 batch_size = 10 的 batch,它会为10个 sequences 同时创建10个并行的 state。
当 stateful=False 时 即无状态 LSTM
每个 batch 处理完后,该 batch 内的所有 sequence 的 state 会被同时 reset。所有 batch 的所有 sequence 之间没有任何联系,假设有5个 batch,每个 batch 有10个 sequence,则代表有50个独立的 sequence,对应50个 state。当然无论有多少个sequence,对于整个 LSTM layer 而言它们共用唯一的权重矩阵 W。一个 sequence 的 state 其实反映了当前输入在该 sequence 的哪个时序位置,从开始到当前输入的时序位置这个 sequence 是如何变化和表现的,而权重矩阵 W 反映了从观察到的所有 sequence 中所掌握的规律。
当 stateful=True 时即有状态 LSTM
每个 batch 依然有 batch_size 个并行 state,但一个 batch 处理完后,state 不会 reset,下一个 batch 会继承上一个 batch 的相同位置的对应sequence 的 state,所以对于 stateful 模型,下一个 batch 其实只是上一个 batch 的延伸,即不同 batch 在相同位置的 sequence 是有关联的(所以 stateful 模型在 fit 时必须设置 shuffle = False)。
例如:有5个 batch,每个 batch 有10个 sequence,每个 sequence 的 time_steps = 3,那么实际上只有10个独立的 sequence,每个 sequence 的实际长度(time_steps)为 3 * 5 = 15。当不想继续当前 sequence 的状态时,可通过 reset_states() 重置 sequence 的状态。
十、常用 LSTM 模型结构
多层 LSTM
相当于传统的多层神经网络,没有理论证明为何这样能提升效果,但有大量实验结果支撑了这种直觉判断,可以认为多层模型使得模型更复杂,表达能力更强。
双向 LSTM
相当于 sequence 正序和逆序各一层 LSTM,最后 concat 再 Softmax 输出。
场景:情感分析,这种方式可以很好地解决重心在文本结尾或者文本开头时对情感分析的影响。也就是说双向 LSTM 同时了解过去和未来的上下文信息,从而能更好地预测结果。