日志

RNN/LSTM-递归神经网络

关于递归神经网络的理论介绍推荐阅读这篇非常经典的文章 → Understanding LSTM Networks
本文为总结笔记

一、RNN vs LSTM

RNN 逻辑结构图

1

LSTM 逻辑结构图

2

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 是啥意思 ?

3
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?

阅读全文