LSTM 可以学习到距离很远的信息,解决了RNN无法长期依赖的问题。
Bidirectional RNN 解决的是 当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。
Deep RNNs 是 为了增强模型的表达能力,可以在网络中设置多个循环层,将每层 RNN 的输出传给下一层处理。
1. LSTM
单层LSTM结构实现
Tensorflow中实现了以下模块 :tf.nn.rnn_cell,包括了10个类:
- class BasicLSTMCell: Basic LSTM recurrent network cell.
- class BasicRNNCell: The most basic RNN cell.
- class DeviceWrapper: Operator that ensures an RNNCell runs on a particular device.
- class DropoutWrapper: Operator adding dropout to inputs and outputs of the given cell.
- class GRUCell: Gated Recurrent Unit cell (cf. http://arxiv.org/abs/1406.1078).
- class LSTMCell: Long short-term memory unit (LSTM) recurrent network cell.
- class LSTMStateTuple: Tuple used by LSTM Cells for state_size, zero_state, and output state.
- class MultiRNNCell: RNN cell composed sequentially of multiple simple cells.
- class RNNCell: Abstract object representing an RNN cell.
- class ResidualWrapper: RNNCell wrapper that ensures cell inputs are added to the outputs.
在基本的 LSTM cell 中我们用第一个类来进行实现,他是 tf.contrib.rnn.BasicLSTMCell 同名类,定义在 tensorflow/python/ops/rnn_cell_impl.py 中
1 | _init__( |
其中参数表示:
- num_units 表示神经元的个数
- forget_bias 就是LSTM们的忘记系数,如果等于1,就是不会忘记任何信息。如果等于0,就都忘记
- state_is_tuple 默认就是True,表示返回的状态是一个 2-tuple (c_state, m_state)
- activation 表示内部状态的激活函数,默认是 tanh
- name 表示这一层的名字,同样名字的层会共享权重,如果为了避免这样的情况需要设置reuse=True
采用BasicLSTMCell来声明LSTM结构如下所示,我们用伪代码和注释来进行说明。
1 | import tensorflow as tf |
2. Bidirectional RNN
- Bidirectional RNN 双向递归神经网络. 该神经网络首先从正面理解一遍这句话,再从反方向理解一遍.
3. Deep RNNs
- Deep RNNs 深层,顾名思义就是层次增。 横向表示时间展开,纵向则是层次展开。